比较指令和测试指令的目的是修改CPSR的标志位,以便影响下一条指令条件执行。
语法:
CMP{cond} Rn, Operand2
CMN{cond} Rn, Operand2
这两条指令的执行结果不会放入任何寄存器,单纯用于影响标志位。
CMP执行Rn-Operand2,除了结果被丢掉外,等价于SUBS。
CMN执行Rn+Operand2,除了结果被丢掉外,等价于ADDS。
这两条指令根据结果,更新N,Z,C和V标志。
r15寄存器可以用于Rn,值是当前指令的地址加8。r15不可以用于第二操作数,用于移位。
条件影响:
CMP r1, r2
r1作为左边,r2作为右边。
如果r1==r2,则EQ条件码满足。
如果r1>r2,则HI(有符号),GT(无符号)条件码满足。其它类似。
需要一个简单的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // C int cmp(int a) { if (a > 22) return 3; return 0; } // assembly cmp r3, #22 ble 28 <cmp+0x28> mov r3, #3 |
如果le条件码满足,即a<=22,跳转到if后面执行。
CMN在ADDS指令处分析。