本文首发在我的个人博客: blog.shenyuanluo.com,喜欢的朋友欢迎订阅。
arm64 汇编准备
寄存器
通用寄存器
31
个R0 ~ R30
,每个寄存器可以存取一个 64 位大小的数。 当使用 x0 - x30
访问时,是一个 64位的数;当使用 w0 - w30
访问时,是一个 32 位的数,访问的是寄存器的 低 32
位,如图:
向量寄存器
(也可以说是 浮点型寄存器)每个寄存器的大小是 128
位的。 分别可以用Bn、Hn、Sn、Dn、Qn
的方式来访问不同的位数;如图:
**注:**word 是
32
位,也就是 4 Byte大小。
- Bn: 一个 Byte的大小,即
8
位 - Hn: half word,即
16
位 - Sn: single word,即
32
位 - Dn: double word,即
64
位 - Qn: quad word,即
128
位
特殊寄存器
- sp: (Stack Pointer),栈顶寄存器,用于保存栈顶地址;
- fp(x29): (Frame Pointer)为栈基址寄存,用于保存栈底地址;
- lr(x30): (Link Register) ,保存调用跳转指令
bl
指令的下一条指令的内存地址; - zr(x31): (Zero Register),
xzr/wzr
分别代表 64/32 位,其作用就是 0,写进去代表丢弃结果,读出来是0
; - pc: 保存将要执行的指令的地址(有操作系统决定其值,不能改写)。
状态寄存器 CPSR
CPSR (Current Program Status Register)和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义;而 CPSR 寄存器是按位起作用的,即,每一位都有专门的含义,记录特定的信息;如下图
注: CPSR 寄存器是 32 位的。
-
CPSR
的 低8位(包括I
、F
、T
和M[4:0]
)称为控制位,程序无法修改,除非 CPU 运行于 特权模式 下,程序才能修改控制位。 -
N
、Z
、C
、V
均为条件码标志位;其内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。-
N(Negative)标志: CPSR 的第
31
位是 N,符号标志位;记录相关指令执行后其结果是否为负数,如果为负数,则N = 1
;如果是非负数,则N = 0
。 -
Z(Zero)标志:
CPSR
的第30
位是 Z,0标志位;记录相关指令执行后,其结果是否为0,如果结果为0,则Z = 1
;如果结果不为0,则Z = 0
。 -
C(Carry)标志: CPSR 的第
29
位是C,进位标志位;- 加法运算:当运算结果产生了 进位 时(无符号数溢出),
C = 1
,否则C = 0
; - 减法运算(包括
CMP
): 当运算时产生了 借位 时(无符号数溢出),C = 0
,否则C = 1
。
- 加法运算:当运算结果产生了 进位 时(无符号数溢出),
-
V(Overflow)标志: CPSR 的第
28
位是 V,溢出标志位;在进行有符号数运算的时候,如果超过了机器所能标识的范围,称为溢出。
-