ARM数据处理指令——比较指令
助记符 | 说明 | 操作 | 条件码位置 |
---|---|---|---|
CMP Rn, operand2 | 比较指令 | 标志N、Z、C、V<-Rn-operand2 | CMP{cond} |
CMN Rn,operand2 | 负数比较指令 | 标志N、Z、C、V<-Rn+operand2 | CMN{cond} |
TST Rn,operand2 | 位测试指令 | 标志N、Z、C、V<-Rn&operand2 | TST(cond) |
TEQ Rn,operand2 | 相等测试指令 | 标志N、Z、C、V<-Rn^operand2 | TEQ(cond) |
比较指令——CMP
比较指令——CMP指令将寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。
指令格式如下:
CMP{cond}{S} Rn, operand2
应用示例:
CMP R1,#10 ;R1与10比较,设置相关标志位
CMP R1,R2 ;R1与R2比较,设置相关标志位
注意:CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。在进行两个数据的大小判断时,常用CMP指令及相应的条件码来操作。
负数比较指令——CMN
负数比较指令——CMN指令使用寄存器Rn的值加上operand2的值,根据操作的结果更新CPSR中相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下:
CMN{cond}{S} Rn, operand2
应用示例:
CMN R0,#1 ;R0+1,判断R0是否位1的补码;如果是设置Z标志位
注意:
CMN指令与ADDS指令的区别在于CMN指令不保存运算结果。CMN指令可用于负数比较,比如CMN R0,#1指令则表示R0与-1比较,若R0为-1(即1的补码),则Z置位;否则Z复位