6. 比較指令

這些指令會對兩個引數執行算術或邏輯運算,捨棄結果但設定條件旗標。它們通常用於在執行條件分支之前,在不改變資料值的情況下測試資料值。

6.1. 文件慣例

記號:Rd, Rm, Rn 表示 ARM 暫存器 R0-R7。imm8 表示寬度為 8 位元的立即值。

6.2. 應用程式狀態暫存器(APSR)

它包含四個位元,會被條件分支指令所測試。條件分支通常會測試多個位元,例如 bge(LABEL)。條件碼的含義可能取決於算術指令的運算元被視為有號還是無號整數。因此 bhi(LABEL) 假設處理的是無號數,而 bgt(LABEL) 假設運算元為有號。

6.3. APSR 位元

  • Z(零)

當運算結果為零,或比較的運算元相等時,會設定此旗標。

  • N(負)

當結果為負時設定。

  • C(進位)

當結果從 MSB 溢出時,加法會設定進位旗標,例如把 0x80000000 與 0x80000000 相加。由於二補數運算的本質,這個行為在減法時是相反的:借位會以進位位元被清除來表示。因此 0x10 - 0x01 會以 0x10 + 0xffffffff 的形式執行,而這會設定進位位元。

  • V(溢位)

若將結果視為一個二補數,當它相對於運算元具有「錯誤」的正負號時,便會設定溢位旗標。例如把 1 加到 0x7fffffff 會設定溢位位元,因為結果(0x80000000)視為二補數整數時是負的。請注意在此情況下進位位元並不會被設定。

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. 條件式執行

itite 指令提供一種方式,可在不需要標籤的情況下,有條件地執行其後一到四個指令。

  • 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

這可以延伸以控制其後至多四個指令的執行:it[x[y[z]]],其中 x,y,z=t/e;例如 itt、itee、itete、ittte、itttt、iteee 等。