iOS逆向工程之Hopper中的ARM指令详解

2020-01-18 15:37:40于丽

•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就是指向下一条将要执行的指令,所以B Lable执行后,接下来就会跳转到Label出进行下一条命令的执行。

•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)