iOS ARM64汇编02-- 寄存器

  • 在ARM64汇编中有多种不同的寄存器,比较常用的寄存器如下:
通用寄存器
  • 64bit的:x0 ~ x28
  • 32bit的:w0 ~ w28(属于x0 ~ x28的低32bit)
  • 两者之间的关系如下所示:
Snip20210223_6.png
  • w0寄存器是属于x0寄存器的一部分,其占据了低32bit的位置;
  • x0 ~ x7 通常用来存放函数的参数,更多的参数使用堆栈来传递;
  • x0通常拿来存放函数的返回值;
程序状态寄存器
  • cpsr(Current Program Status Register) 当前程序状态寄存器;
  • spsr(Saved Program Status Register) 异常状态下使用的寄存器;
  • 通用寄存器是用来存储数据的,而CPSR寄存器是按位起作用的,也就是说它的每一位都有专门的含义,记录特定的信息,注意CPSR寄存器是32bit的;
  • CPSR寄存器各个位的含义如下图所示:
Snip20210225_83.png
  • 最高的4位称之为条件标志位;
    • N位:也称之为负数位,如果结果为负数,则N=1;如果结果为非负数,则N=0;
    • Z位:也称之为零位,如果结果为0,则Z=1;如果结果为非零,则Z=0。
    • C位:其设置分一下几种情况:
      对于加法指令(包含比较指令CMN),如果产生进位,则C=1;否则C=0。
      对于减法指令(包括比较指令CMP),如果产生借位,则C=0;否则C=1。
      对于有移位操作的非法指令,C为移位操作中最后移出位的值。
      对于其他指令,C通常不变。
    • V位:对于加减法指令,在操作数和结果是有符号的整数时,如果发生溢出,则V=1;如果无溢出发生,则V=0;对于其他指令,V通常不发生变化;
零寄存器(寄存器中存储的数据为0)
  • wzr:32bit;
  • xzr:64bit ;
程序计数器
  • pc (Program Counter):记录CPU当前指令是哪一条指令,存储着当前CPU正在执行的指令的地址;

链接寄存器

  • lr (Link Register) 也就是x30,其存储着函数的返回地址;
堆栈指针
  • sp (Stack Pointer);

  • fp (Frame Pointer) 也就是x29;

  • 常见的关于汇编的LLDB命令:

    • register read x0 读取x0寄存器中的值;
    • register read w0 读取w0寄存器中的值;
    • register write x0 0x1100000000000022 往x0寄存器中写入值;
    • register read 查看所有的寄存器;

你可能感兴趣的:(iOS ARM64汇编02-- 寄存器)