美文网首页
iOS逆向6基础篇--状态寄存器CPSR

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

作者: hello_iOS程序媛 | 来源:发表于2018-04-25 14:48 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/tntylftx.html