- 在ARM64汇编中有多种不同的寄存器,比较常用的寄存器如下:
通用寄存器
- 64bit的:x0 ~ x28
- 32bit的:w0 ~ w28(属于x0 ~ x28的低32bit)
- 两者之间的关系如下所示:
- w0寄存器是属于x0寄存器的一部分,其占据了低32bit的位置;
- x0 ~ x7 通常用来存放函数的参数,更多的参数使用堆栈来传递;
- x0通常拿来存放函数的返回值;
程序状态寄存器
- cpsr(Current Program Status Register) 当前程序状态寄存器;
- spsr(Saved Program Status Register) 异常状态下使用的寄存器;
- 通用寄存器是用来存储数据的,而CPSR寄存器是按位起作用的,也就是说它的每一位都有专门的含义,记录特定的信息,注意CPSR寄存器是32bit的;
- CPSR寄存器各个位的含义如下图所示:
- 最高的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 查看所有的寄存器;