您的位置:首页 > 其它

ARM----比较、分支与条件指令

2017-10-19 10:53 387 查看

前言

分支说白了就是跳转,而分支与条件结合使用就是当满足一定条件后进行特定的跳转。

(1)、比较指令

比较指令有CMN、CMP、TEQ、TST。

有一点需要注意的是CMN与CMP是算术指令,TEQ和TST属于逻辑指令。

比较指令在执行后总是会设置标志位(N、Z、C、V), 因为条件后缀是根据被设置的标志位来判断比较结果是否满足条件的。

CMN (Compare Negative) ---- 比较负值, CMN相同于CMP, 但他允许你对负值进行比较
CMN R0, R1       ;Status = R0 - R1
CMP (Compare) ---- 之所以说CMP,CMN指令是算术指令,是因为他们对操作数进行减法操作,并且设置相应的标志位,但是不记录计算结果。CMN与CMP进行的是算术减法操作,所以会影响C -- Carry标志。
CMP R0, R1       ;Status = R0 - R1


TEQ (Test Equivalence) ---- 测试等价,TEQ对操作数进行异或(EOR)逻辑操作,来判断两个操作数是否相同。因为TEQ做的是异或运算,所以不会影响Carry标志位。
TEQ R0, R1           ;Status = R0 EOR R1

TST (Test bits) ---- 测试位,使用TST命令来检查是否设置了特定的位。TST命中令其实是将两个操作数进行按位与(AND)操作,将结果存储在标志位中。可以使用TST来测试寄存器中某些位的特定值。
TST R0, R1        ;Status = R0 AND R1


(2)、分支指令

常用的分支指令是B、BL、BX这三个指令。

B Lable ;该指令表示将PC设置成Lable, 而PC就是指向下一条将要执行的指令。

BL Label ; 执行该指令说明将LR设置成PC - 4, 然后再将PC设置成Lable。

在执行BL Lable这条命令时,PC中存储的就是当前BL这条命令,而PC - 4就是上一条指令的地址,将PC - 4赋值给LR,也就是记录下跳转执行完指令后要返回的地址。

如果BL在添加上一些条件,那么BL{条件}就可以进行循环了。

BX Rd ; 该指令说明将Rd赋值给PC, 然后切换指令集(如从ARM指令集切换到Thumb指令集)。

(3)、条件后缀

上述的分支指令与条件后缀结合才能发挥其强大的功能和作用;

条件后缀不能单独的使用,要和其他命令一块结合使用,然后根据条件的结果来做一些操作。

条件是否成立是根据NZCV这四个标志位来判断的,因为我们在对一些数值进行比较时,会设置相应的标志位。然后我们就可以使用这些标志位来判断条件是否成立。NZCV就是我们之前所提到的几个标志位,Z(是否为零), C(是否进位), N(是否为负), V(是否溢出)四种标准位来判断的。

EQ: Equal   等于,(Z = 1)
NE: Not Equal   不等于 (Z = 0)
CS: Carry Set   有进位 (C = 1)
HS: (unsigned Higher Or Same) 同CS (C = 1)
CC: (Carry Clear) 没有进位 (C = 0)
LO: (unsigned Lower) 同CC  (C = 0)
MI: (Minus) 结果小于0  (N = 1)
PL: (Plus) 结果大于等于0 (N = 0)
VS: (oVerflow Set) 溢出 (V = 1)
VC: (oVerflow Clear) 无溢出 (V = 0)
HI : (unsigned Higher) 无符号比较,大于 (C = 1 & Z = 0)
LS: (unsigned Lower or Same) 无符号比较,小于等于 (C = 0 & Z = 1)
GE: (signed Greater than or Equal) 有符号比较,大于等于 (N = V)
LT: (signed Less Than) 有符号比较,小于  (N != V)
GT: (signed Greater Than) 有符号比较,大于 (Z = 0 & N = V)
LE: (signed Less Than or Equal) 有符号比较,小于等于 (Z = 1 | N != V)
AL: (Always) 无条件,默认值
NV: (Never) 从不执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: