5. Registers

ARMv8-A相关历史文章:

ARMv8-A提供了31个64-bit的通用寄存器,在所有Exception Level都可以访问,在AArch64的执行状态下,每个寄存器(X0-X30)都是64-bit宽,对应也有32-bitt的形式,如下图:



Wn对应Xn的低32bit。读取Wn寄存器时会忽略Xn寄存器的高32bit,而写Wn寄存器时,会将Xn寄存器的高32bit清零,比如往W0写入0xFFFFFFFF时,X0寄存器的值为0x00000000FFFFFFFF。
有时会用Rn来指代ARMv8-A寄存器,这个寄存器可以是Xn或者Wn。

Special registers

除了31个通用寄存器外,ARMv8-A还提供了特殊寄存器:



注意没有X31或W31寄存器。有些指令编码使用数字31指代Zero寄存器,ZR(WZR/XZR)。也有一些指令中的参数使用数字31来指代堆栈指针(Stack pointer)。


当执行在AArchc64状态时,对于每个Exception Level,异常返回状态保存在专用的寄存器中:

  • Exception Level Register(ELR)
  • Saved Processor State Register(SPSR)
    下表中每个Exception Level都标识了特殊的寄存器:


Procedure Call Standard(PCS,过程调用标准),定义了一个专用的帧指针(Frame Pointer),它可以使调试、调用图分析变得更容易。

5.1 The Zero register

大部分指令都能使用零寄存器,往ZR寄存器写入的时候会被忽略,从ZR寄存器读取时会得到0,有点类似于/dev/null。

5.2 The stack pointer

SP寄存器指向堆栈的顶部,每个Exception Level都有自己的堆栈指针SP_ELn。
当在AArch64状态,EL0之外的其他Exception Level,处理器可以使用:

  • 该Exception Level对应的栈指针;
  • SP_EL0栈指针(Exception Level 0只能访问SP_EL0)
    SP指针不能被大部分指令引用,有些算术指令,比如ADD指令,可以读写SP,进而调整函数的栈指针,比如:
ADD  SP,  SP,  #0x10  //Adjust SP to 0x10 bytes before its current value
ADD  SP,  SP,  #256    // SP = SP + 256

5.3 The Program Counter

PC寄存器与ARMv7-A中一样,代表的是当前程序的地址。唯一能访问PC寄存器的指令是需要计算PC-relative地址的指令(ADR、ADRP、literal load、direct branches),以及保存返回地址的branch-and-link指令。修改PC的唯一方式是使用branch,exception generation,exception return instructions。
与ARMv7-A不同的是,它没有4或8字节的隐含偏移量。

5.4 The Exception Link Register (ELR)

ELR寄存器用于保存异常之后的返回地址。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容