7. 分岐命令
これらは、通常はラベル( label アセンブラディレクティブを参照)で指定された対象の位置へ実行をジャンプさせます。条件分岐と it 、 ite 命令は、分岐を実行すべきかどうかを判断するために、アプリケーションプログラムステータスレジスタ (APSR) の N (負)、Z (ゼロ)、C (キャリー)、V (オーバーフロー) のフラグを調べます。
公開されているアセンブラ命令のほとんど(移動操作を含む)はフラグを設定しますが、値を調べるための明示的な比較命令もあります。
条件フラグの意味についてのさらに詳しい説明は、比較関数を説明する節にあります。
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) を使います。入れ子になったサブルーチンでは、内側のサブルーチンを呼び出す前に、外側のスコープのリンクレジスタを(通常はスタックに)保存しなければなりません。