• aarch64-寄存器(持续更新)


    1. 通用寄存器

    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 -------^
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2. 专用寄存器

    • XZR:zero register
    • SP:栈寄存器
    • PC:程序计数器
    • SPSR:程序状态寄存器
    • ELR:exception link register

    2.1 XZR寄存器

    XZR 寄存器在汇编代码中通常用作一个通用的"无操作"或"清零"寄存器,用于初始化变量或执行其他不需要返回值的操作。例如,你可以将 XZR 寄存器的值设置为零,然后将其用于将某个寄存器清零,如下所示:

    // 将X1寄存器的值清零
    mov x1, xzr
    
    
    • 1
    • 2
    • 3

    在这个示例中,mov x1, xzr 将 X1 寄存器的值设置为零。
    也可以使用 mov 指令将寄存器直接设置为零,就像这样:

    mov x1, #0
    
    • 1

    在大多数情况下,使用 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
    
    • 1
    • 这个指令将 SPSel 寄存器的值设置为 1。
    • SPSel 寄存器的值为 1 表示选择使用 EL1 特权级别的堆栈指针(SP_EL1)。
    • 通常,这个指令会在从用户态(EL0)切换到内核态(EL1)时使用,以确保在内核态中使用正确的堆栈。
    MSR SPSel, #0
    
    • 1
    • 这个指令将 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. 系统寄存器

  • 相关阅读:
    Linux的常用指令用法
    代码随想录算法训练营Day1 : 704.二分查找、27.移除元素
    ArmSom---I2C开发指南
    php中进程、线程、协程详细讲解
    CSP-J 2022 第一轮试题
    怎么写综述类论文? - 易智编译EaseEditing
    6.2 List和Set接口
    【基础建设】浅谈企业网络安全运营体系建设
    【Android】Animation和Gone不得不说的故事
    ExtJS-容器布局(Layouts)教程
  • 原文地址:https://blog.csdn.net/weixin_47139576/article/details/134033646