AArch64运行环境提供了31个64bit的通用寄存器:X0~X31,同时他们也都有32bit的形式:W0~W31,他们对应映射到64bit寄存器的低32位。
读取W寄存器,将会只读X的低32位;
写W寄存器,将会将X的高32位写为0。也就是说设置W0为0xFFFFFFFF,结果设置X0为0x00000000FFFFFFFF。
2、AArch64特殊寄存器除了31个核心寄存器外,还有一些特殊寄存器。
在AArch64运行状态,异常返回的状态,保存在每个异常等级的ELR和SPSR寄存器 (EL0不用异常返回,所以这个异常等级没有ELR和SPSR寄存器)。
2.1 XZR/WZR寄存器(零寄存器)读的时候返回0,写的时候忽略写的值。
2.2 SP寄存器(堆栈指针)每个异常等级都有自己的SP寄存器(SP_EL0, SP_EL1, SP_EL2, SP_EL3)。但是,除了EL0以外,其它异常等级都有两个选择,或者用自己等级的SP_ELn,或者用EL0等级的SP_EL0;EL0就只能用SP_EL0了。
t表明选择了SP_EL0寄存器,h表明选择了SP_ELn寄存器。
2.3 PC寄存器(程序计数)ARMv7有个R15寄存器,就是PC(程序计数)寄存器,是可以作为通用寄存器使用的。
但是ARMv8这里不一样了,不能被当做有名字的寄存器来访问了。
2.4 ELR(异常连接)寄存器保存异常返回的地址。
2.5 SPSR寄存器(保存的进程状态寄存器)当异常发生时,处理器的状态就被保存在SPSR寄存器里,和ARMv7中的CPSR类似。SPSR保存了处理异常前的PSTATE,当异常返回前需要将PSTATE设回来。
3、处理器状态(PSTATE)AArch64没有像ARMv7的CPSR寄存器,需要通过PSATE,其各个字段定义如下:
其中N、Z、C、V可以在EL0访问,其他字段在EL0是未定义状态,需要在EL1或者更高级访问或执行。
在AArch64运行状态,通过执行ERET指令从异常返回,从而导致SPSR_ELn被拷贝到了PSTATE。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)