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 を加算するとオーバーフロービットがセットされます。なぜなら結果(0x80000000)を 2 の補数整数として見ると負だからです。この場合キャリービットはセットされない点に注意してください。
6.4. 比較命令¶
これらは APSR(アプリケーションプログラムステータスレジスタ)の N(負)、Z(ゼロ)、C(キャリー)、V(オーバーフロー)フラグを設定します。
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. 条件付き実行¶
it 命令と ite 命令は、ラベルを必要とせずに、続く 1 〜 4 個の命令を条件付きで実行する手段を提供します。
it(<condition>) If then
<condition> が真の場合に次の命令を実行します:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) If then else
<condition> が真の場合は次の命令を実行し、そうでなければその次の命令を実行します。したがって:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
これは、続く最大 4 個の命令の実行を制御するように拡張できます。it[x[y[z]]] ここで x,y,z=t/e です。例: itt、itee、itete、ittte、itttt、iteee など。