このドキュメンテーションは、MicroPython の最新開発ブランチのためのものです。 リリースバージョンでは利用できない機能に言及することがあります。

特定のリリースのドキュメントをお探しの場合は、左側のドロップダウンメニューを使って、 望みのバージョンを選択します。

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) を使います。入れ子になったサブルーチンでは、内側のサブルーチンを呼び出す前に、外側のスコープのリンクレジスタを(通常はスタックに)保存しなければなりません。