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

CPSR

  • 在ARM64中存在一种特殊的寄存器,即CPSR--current program status register 状态寄存器。
  • CPSR寄存器是32位
  • CPSR寄存器每一位具有专门的含义

CPSR 32位含义

CPSR 32位含义
  • CPSR高四位分别称为NZCV,N位--Negative标志位,Z位--Z ero标志位, C位--Carry标志位, V位--OverFlow标志位。

  • NZCV均为条件码标志位,可被某些指令执行的算数或逻辑运算结果改变,并可以决定决定指令的执行逻辑。意义重大。

  • CPSR的低8位(包括I、F、T和M[4:0])称为控制位,程序无法修改,除非CPU运行于特权模式下,程序才能修改控制位。

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

NZCV条件码标志位

  • N-- Negative标志位

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

  • Z-- Zero标志位

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

  • C--Carry标志位

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
我个人会把减法转换为加法后再进行理解。

  • V--Overflow标志位

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

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

注意:

  • 不是所有运算指令(进行逻辑或算术运算)都能改变状态寄存器的,如add不能改变状态寄存器,adds能改变状态寄存器。什么指令能改变状态寄存器应该是CPU的指令集里决定了的。
  • C和V溢出位的区别:C位是最高位产生了进位,V位是符号位与两个同为正数或同为负数的符号位不同。

你可能感兴趣的:(iOS逆向6基础篇--状态寄存器CPSR)