iOS逆向6基础篇--状态寄存器CPSR

2018-04-25  本文已影响0人  hello_iOS程序媛

CPSR

CPSR 32位含义

CPSR 32位含义

我们重点关注NZCV条件码标志位。

NZCV条件码标志位

相关指令运算结果为负数,则N = 1, 否则N= 0。即结果为负数的时候,Negative标志位为真。

相关指令运算结果为0,则Z = 1, 否则Z= 0。即结果为0的时候,Zero标志位为真。

Carry标志位为进位标志位, 相关指令运算结果最高位产生进位则C = 1, 否则C= 0。

两数相加,可能产生最高位的进位。这个最高位的进位可以保存在C标志位。
如下列指令列出的加法元算:

mov w0,#0xaaaaaaaa; w0的最高位为1
adds w0,w0,w0; 执行后 相当于 1010 << 1 最高位进位1 C标记 为 1
adds w0,w0,w0; 执行后 相当于 0101 << 1 最高位进位0 C标记 为 0
adds w0,w0,w0; 重复上面操作
adds w0

如果是两个数相减,将减法转换位加法后,如果最高位有进位则C = 1, 否则C = 0;
如下列指令列出的减法元算

mov w0,#0x0;  wo = 0x0, 二进制0000
subs w0,w0,#0xff ;  w0 - 0xff = 0x00 - 0xff = 0x00 + 0xffffff01 = 0xffffff01,没有进位, C = 0
subs w0,w0,#0xff; wo - 0xff = 0xffffff01 - 0xff = 0xffffff01 + 0xffffff01, 有进位, C = 1
subs w0,w0,#0xff

在某些人的理解中,把C标志位为理解为无符号运算的时候:1)加法元素,有进位,则C = 1,无进位,C = 0; 2)加法运算, 有借位, 则C = 0, 无借位, 则C = 1
我个人会把减法转换为加法后再进行理解。

Overflow标志位为溢出标志位,相关指令运算结果超过机器表示的范围后,称为溢出。溢出则V = 1, 无溢出则V = 0;

  • 正数 + 正数 为负数 溢出 两个操作数的最高位(即符号位)为0, 计算结果变为了1(即负数)
  • 负数 + 负数 为正数 溢出 两个操作数的最高位(即符号位)为1, 计算结果变为了0(即正数)
  • 正数 + 负数 不可能溢出

注意:

上一篇下一篇

猜你喜欢

热点阅读