CMP可以比较两个数的关系,其本质就是一条减法指令,只是不会将运算结果保存到寄存器,因为对于CPU而言,比较两个数时只关心结果是false还是true
指令格式:CMP <第一操作寄存器> <第二操作数>
- 第一操作寄存器:参与比较的第一个数(只能是寄存器)
- 第二操作数:参与比较的第二个数(既可以是寄存器,也可以是立即数)
目录
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指令集中大多数指令都可以带条件码后缀
3、小练习:使用ARM指令进行条件判断,并执行相应的语句
现在有这么一段C语言的代码,用ARM指令将其表示出来。
- 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
评论记录:
回复评论: