5. Registers

ARMv8-A相关历史文章:

  • 1. Fundamentals of ARMv8-A
  • 2. Execute states
  • 3. Changing Exception Levels
  • 4. Changing Execution state

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


5. Registers_第1张图片

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

Special registers

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


5. Registers_第2张图片

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


5. Registers_第3张图片

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

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


    5. Registers_第4张图片

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寄存器用于保存异常之后的返回地址。

你可能感兴趣的:(5. Registers)