31个64位通用寄存器(X0~X30)
- 64位:Xn(n的范围是0~30)
- 32位:Wn(n的范围是0~30)
- 32/64位:Rn(n的范围是0~30)
63 32 31 0
----------------------
| | |
| | |
----------------------
^--- Wn ---^
^--------- Xn -------^
2. 专用寄存器
- XZR:zero register
- SP:栈寄存器
- PC:程序计数器
- SPSR:程序状态寄存器
- ELR:exception link register
2.1 XZR寄存器
XZR 寄存器在汇编代码中通常用作一个通用的"无操作"或"清零"寄存器,用于初始化变量或执行其他不需要返回值的操作。例如,你可以将 XZR 寄存器的值设置为零,然后将其用于将某个寄存器清零,如下所示:
mov x1, xzr
在这个示例中,mov x1, xzr 将 X1 寄存器的值设置为零。
也可以使用 mov 指令将寄存器直接设置为零,就像这样:
mov x1, #0
在大多数情况下,使用 XZR 寄存器和使用 mov 指令将寄存器设置为零没有显著的性能差异。它们都可以有效地将寄存器的值设置为零。
2.2 SP栈寄存器
系统中有如下与栈相关寄存器
- SP
- SPsel
- SP_EL0
- SP_EL1
- SP_EL2
- SP_EL3
2.2.1 sp
- SP 是通常的堆栈指针,用于指示当前线程或进程的用户态或系统态堆栈。
- 用户态堆栈和系统态堆栈都使用相同的 SP 寄存器。
- 当处理普通函数调用或一般指令时,SP 用于堆栈操作。
2.2.2 SPSel
- SPSel 是一个特殊的系统寄存器,用于在处理异常或中断时选择堆栈指针。
- SPSel 寄存器允许内核选择使用不同的堆栈指针来处理异常或中断,通常用于实现特权级别切换时。
- 通过设置 SPSel 寄存器的不同值,内核可以在不同特权级别之间切换堆栈,以确保在特权级别切换时不会混淆堆栈。
- 这有助于提高系统的安全性和稳定性,特别是在处理异常和中断时。
MSR SPSel, #1
- 这个指令将 SPSel 寄存器的值设置为 1。
- SPSel 寄存器的值为 1 表示选择使用 EL1 特权级别的堆栈指针(SP_EL1)。
- 通常,这个指令会在从用户态(EL0)切换到内核态(EL1)时使用,以确保在内核态中使用正确的堆栈。
MSR SPSel, #0
- 这个指令将 SPSel 寄存器的值设置为 0。
- SPSel 寄存器的值为 0 表示选择使用当前特权级别的堆栈指针(SP)。
- 通常,这个指令会在从内核态(EL1)切换回用户态(EL0)时使用,以确保在用户态中使用正确的堆栈。
2.2.3 SP_EL1
- SP_EL1 是 EL1 特权级别的堆栈指针。
- 用于保存 EL1 特权级别的堆栈,通常用于处理来自用户态到内核态的异常和中断。
- 当进入异常处理程序时,SP 的值会自动保存到 SP_EL1。
- 当从异常处理程序返回时,SP_EL1 的值会被恢复到 SP。
2.2.4 SP_EL3
- SP_EL3 是 EL3 特权级别的堆栈指针。
- 通常用于引导启动和安全处理。
- 当处于EL3特权级别时,SP 的值会自动保存到 SP_EL3。
- 当从EL3返回到EL2或EL1时,SP_EL3 的值会被恢复到SP_EL2或SP_EL1。
2.3 DAIF
CurrentEL
3. 系统寄存器