CMP可以比较两个数的关系,其本质就是一条减法指令,只是不会将运算结果保存到寄存器,因为对于CPU而言,比较两个数时只关心结果是false还是true
指令格式:CMP <第一操作寄存器> <第二操作数>
- 第一操作寄存器:参与比较的第一个数(只能是寄存器)
- 第二操作数:参与比较的第二个数(既可以是寄存器,也可以是立即数)
目录
1、CMP实现条件判断的本质
2、条件码以及条件码的使用
3、小练习:使用ARM指令进行条件判断,并执行相应的语句
1、CMP实现条件判断的本质
CMP 的本质就是一条减法指令,减法的结果会影响CPSR寄存器,CPU实际上是根据CPSR中的N、Z、C、V状态位来进行判断。以下面这条语句为例( 假设R1和R2中存的是无符号数)
CMP R1, R2
如果R1 == R2,即 R1 - R2 = 0,CPSR中的状态位 Z = 1
如果R1 != R2,即 R1 - R2 != 0,CPSR中的状态位 Z = 0
如果R1 < R2,即 R1 - R2 运算过程中产生了借位,CPSR中的状态位 C = 0
如果R1 <= R2,即 R1 - R2 运算过程中产生了借位 或者 R1 - R2 = 0,此时 C = 0 或 Z = 1
如果R1 > R2,即 R1 - R2 运算过程中没有产生借位,而且 R1 - R2 != 0,此时 C = 1 且 Z = 0
如果R1 >= R2,即 R1 - R2 运算过程中没有产生借位 或者 R1 - R2 = 0,则 C = 1
2、条件码以及条件码的使用
在实际使用的时候,我们不可能像上面那样,使用CPSR中的状态位去比较两个数的大小,因此,ARM给我们提供了更简洁的指令,那就是“条件码”。
使用时,主要关注第二列“后缀符”和第四列“含义”。
MOV R1, #1 @ R1 = 1
MOV R2, #2 @ R2 = 2
CMP R1, R2 @ 本质: R1 - R2,记录运算结果状态是否为0、是否借位,保存到CPSR寄存器
SUBGT R3, R1, R2 @ 含义: 如果CMP的比较结果是R1 > R2,那就执行SUB R3, R1, R2
@ SUBGT: 运算符SUB + 后缀符GT
@ SUB: 减法运算
@ GT: 表示大于,ARM指令集中大多数指令都可以带条件码后缀
注意:ARM指令集中大多数指令都可以带条件码后缀文章来源:https://www.toymoban.com/news/detail-722435.html
3、小练习:使用ARM指令进行条件判断,并执行相应的语句
现在有这么一段C语言的代码,用ARM指令将其表示出来。文章来源地址https://www.toymoban.com/news/detail-722435.html
int R1 = 9; // MOV R1. #9
int R2 = 15; // MOV R2, #15
START:
// CMP R1, R2
if(R1 == R2) // BLEQ STOP
{
STOP();
}
else if(R1 > R2) // SUBGT R1, R1, R2
{
R1 = R1 - R2;
}
else // SUBLT R2, R2, R1
{
R2 = R2 - R1;
}
STOP:
B STOP
到了这里,关于条件执行指令 CMP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!