7. 分岐命令¶
これらは、通常はラベルで指定されるターゲット位置へ実行をジャンプさせます(label() アセンブラディレクティブを参照)。条件付き分岐および it と ite 命令は、Application Program Status Register(APSR)の N(負)、Z(ゼロ)、C(キャリー)、V(オーバーフロー)フラグをテストして、分岐を実行すべきかどうかを判定します。
公開されているアセンブラ命令のほとんど(move 操作を含む)はフラグをセットしますが、値をテストできるようにする明示的な比較命令もあります。
条件フラグの意味に関するさらなる詳細は、比較命令 のセクションで提供されています。
7.1. ドキュメントの表記規則¶
表記: Rm は ARM レジスタ R0-R15 を表します。LABEL は label() アセンブラディレクティブで定義されたラベルを表します。<condition> は以下の条件指定子のいずれかを示します。
eq 等しい(結果がゼロだった)
ne 等しくない
cs キャリーセット
cc キャリークリア
mi マイナス(負)
pl プラス(正)
vs オーバーフローセット
vc オーバーフロークリア
hi > (符号なし比較)
ls <= (符号なし比較)
ge >= (符号付き比較)
lt < (符号付き比較)
gt > (符号付き比較)
le <= (符号付き比較)
7.2. ラベルへの分岐¶
b(LABEL) 無条件分岐
beq(LABEL) 等しい場合に分岐
bne(LABEL) 等しくない場合に分岐
bge(LABEL) 以上の場合に分岐
bgt(LABEL) より大きい場合に分岐
blt(LABEL) より小さい場合に分岐(<)(符号付き)
ble(LABEL) 以下の場合に分岐(<=)(符号付き)
bcs(LABEL) キャリーフラグがセットされている場合に分岐
bcc(LABEL) キャリーフラグがクリアされている場合に分岐
bmi(LABEL) 負の場合に分岐
bpl(LABEL) 正の場合に分岐
bvs(LABEL) オーバーフローフラグがセットされている場合に分岐
bvc(LABEL) オーバーフローフラグがクリアされている場合に分岐
bhi(LABEL) より大きい場合に分岐(符号なし)
bls(LABEL) 以下の場合に分岐(符号なし)
7.3. ロング分岐¶
上に挙げた分岐命令が生成するコードは、PC 相対の分岐先を指定するために固定のビット幅を使用します。その結果、分岐命令がその分岐先から離れている長いプログラムでは、アセンブラは「branch not in range」エラーを生成します。これは、次のような「wide」版を使うことで克服できます。
beq_w(LABEL) 等しい場合のロング分岐
wide 分岐は命令のエンコードに 4 バイトを使用します(標準の分岐命令の 2 バイトに対して)。
7.4. サブルーチン(関数)¶
サブルーチンに入るとき、プロセッサは戻りアドレスをレジスタ r14(リンクレジスタ(lr)とも呼ばれる)に格納します。サブルーチン呼び出しの次の命令への復帰は、リンクレジスタからプログラムカウンタ(r15 または pc)を更新することで行われます。この処理は以下の命令によって扱われます。
bl(LABEL)
LABEL の次の命令へ実行を移し、戻りアドレスをリンクレジスタ(r14)に格納します。
bx(Rm) Rm で指定されたアドレスへ分岐します。
通常、サブルーチンから戻るには bx(lr) を発行します。ネストしたサブルーチンの場合、内側のサブルーチン呼び出しを行う前に、外側のスコープのリンクレジスタを(通常はスタックに)保存しておく必要があります。