7. 分岐命令

これらは、通常はラベルで指定されるターゲット位置へ実行をジャンプさせます(label() アセンブラディレクティブを参照)。条件付き分岐および itite 命令は、Application Program Status Register(APSR)の N(負)、Z(ゼロ)、C(キャリー)、V(オーバーフロー)フラグをテストして、分岐を実行すべきかどうかを判定します。

公開されているアセンブラ命令のほとんど(move 操作を含む)はフラグをセットしますが、値をテストできるようにする明示的な比較命令もあります。

条件フラグの意味に関するさらなる詳細は、比較命令 のセクションで提供されています。

7.1. ドキュメントの表記規則

表記: Rm は ARM レジスタ R0-R15 を表します。LABELlabel() アセンブラディレクティブで定義されたラベルを表します。<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) を発行します。ネストしたサブルーチンの場合、内側のサブルーチン呼び出しを行う前に、外側のスコープのリンクレジスタを(通常はスタックに)保存しておく必要があります。