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

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

6. 比較命令

これらは2つの引数に対して算術演算または論理演算を行い、結果は捨てて条件フラグだけを設定します。通常は、条件分岐を実行する前に、データの値を変えずに調べるために使います。

6.1. この文書の表記規則

表記: Rd, Rm, Rn は ARM のレジスタ R0〜R7 を表します。 imm8 は幅 8 ビットの即値を表します。

6.2. アプリケーションプログラムステータスレジスタ (APSR)

これには、条件分岐命令によって調べられる4つのビットが含まれます。通常、条件分岐は複数のビットを調べます。たとえば bge(LABEL) です。条件コードの意味は、算術命令のオペランドを符号付き整数と見るか符号なし整数と見るかによって変わることがあります。したがって bhi(LABEL) は符号なしの数値が処理されたと仮定し、 bgt(LABEL) は符号付きのオペランドを仮定します。

6.3. APSR のビット

  • Z (ゼロ)

演算の結果がゼロの場合、または比較のオペランドが等しい場合に設定されます。

  • N (負)

結果が負の場合に設定されます。

  • C (キャリー)

加算では、結果が MSB からあふれるとキャリーフラグが設定されます。たとえば 0x80000000 と 0x80000000 を加算した場合です。2の補数演算の性質上、減算ではこの動作は逆になり、借りが発生したことはキャリービットがクリアされることで示されます。したがって 0x10 - 0x01 は 0x10 + 0xffffffff として実行され、キャリービットが設定されます。

  • V (オーバーフロー)

オーバーフローフラグは、結果を2の補数の数値と見たときに、オペランドとの関係で「誤った」符号になっている場合に設定されます。たとえば 0x7fffffff に 1 を加算するとオーバーフロービットが設定されます。これは、結果 (0x8000000) を2の補数の整数と見ると負になるためです。この場合、キャリービットは設定されないことに注意してください。

6.4. 比較命令

これらは APSR (アプリケーションプログラムステータスレジスタ) の N (負)、Z (ゼロ)、C (キャリー)、V (オーバーフロー) のフラグを設定します。

  • cmp(Rn, imm8) Rn - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(Rn, Rm) Rn & Rm

6.5. 条件付き実行

it と ite 命令は、ラベルを使わずに後続の1〜4個の命令を条件付きで実行する手段を提供します。

  • it(<condition>) If then

<condition> が真なら次の命令を実行します:

cmp(r0, r1)
it(eq)
mov(r0, 100) # r0 == r1 なら実行されます
# 実行はここから続きます
  • ite(<condition>) If then else

<condition> が真なら次の命令を実行し、そうでなければその次の命令を実行します。つまり:

cmp(r0, r1)
ite(eq)
mov(r0, 100) # r0 == r1 なら実行されます
mov(r0, 200) # r0 != r1 なら実行されます
# 実行はここから続きます

これは、後続の最大4個の命令の実行を制御するように拡張できます: it[x[y[z]]] (x,y,z=t/e)。たとえば itt、itee、itete、ittte、itttt、iteee などです。