我是靠谱客的博主 靓丽豌豆,最近开发中收集的这篇文章主要介绍ARMv8-A编程指导之ARMv8寄存器(1)1 AArch64特殊寄存器2 处理器状态,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

        AArch64执行状态提供了31个64位通用寄存器,它们可在任意时刻和所有异常级别被访问。

        每个寄存器为64位宽且它们通常被称为寄存器X0~X30。

每个AArch64 64bit通用寄存器(X0~X30)也有32bit(W0~W30)形式。

        32bit W寄存器位相关64位X寄存器的低一半。即,W0映射到X0的低字,W1映射到X1的低字。

        从W寄存器中读取将忽视对应的X寄存器的高32位并不对它们做修改。对W寄存器进行写将X寄存器的高32位设置位0。即,写0xffffffff到W0将X0设置位0x00000000fffffff。

1 AArch64特殊寄存器

        除了上述31个核心寄存器,也存在几个特殊寄存器。

        NOTE: 没有X31或W31寄存器。很多指令被编码为31号代表zero register,ZR(WZR/XZR)。也有严格的指令组,一个或多个参数被编码为31号代表stack pointer (SP)。

        当访问zero register时,所有写都被忽略且所有读返回0。注意SP寄存器的64bit形式不会用X前缀。

        在ARMv8架构中,当执行在AArch64上时,异常返回状态保持在每个异常级别的下述寄存器中:

(1)异常链接寄存器(ELR)

(2)保存进程状态寄存器(SPSR)

        对每个异常级别有一个SP寄存器,但不会用来保持返回状态。

1.1 zero register

        当作为源寄存器时zero register读为0且当作为目的寄存器时丢弃结果。你可以将zero register用于大多数指令,但不是全部指令。

1.2 Stack pointer

        在ARMv8架构中,用stack pointer寄存器来分开来自异常级别的范围。默认情况下,使用一个异常来选择目标异常级别的stack pointer,SP_ELn。比如,使用一个EL1的异常来选择SP_EL1。每个异常级别有自己的stack pointer,SP_EL0,SP_EL1,SP_EL2和SP_EL3。

        当在AArch64中超过EL0异常级别时,处理器可以其中一种:

(1)与异常级别相关的64位stack pointer(SP_ELn)

(2)EL0相关的stack pointer (SP_EL0)

        EL0仅访问SP_EL0。

        t后缀表明了SP_EL0 stack pointer被选择。h后缀表明SP_ELn stack pointer被选择。

        SP不能被大多数指令所引用。但是,一些形式的算法指令,比如ADD指令,可以读和写当前的stack pointer来调整函数中的stack pointer。

ADD SP, SP, #0x10

1.3 Program Counter

        原始的ARMv7指令集的一个特性为将R15(PC)作为通用寄存器。PC使能了一些聪明的编程技巧,但它也引入了编译器和流水线的复杂度。在ARMv8中移除直接访问到PC使更容易预测返回和简化ABI spec。

        PC不能作为已命名的寄存器被访问。它的使用在某些指令上是含蓄的,比如PC相关的加载和地址的产生。PC不能作为数据处理指令的目的或加载指令而指明。

1.4 Exception Link Register(ELR)

        ELR寄存器保持着异常返回地址。

1.5 Saved Process Status Register

        当异常产生时,处理器的状态保存在相关的保存进程状态寄存器SPSR,与ARMv7的CPSR相同的方式。在异常产生之前SPSR保持着PSTATE值并在异常返回时恢复PSTATE值。

AArch64的单个位如下值所示:

N 负值(N标志)

Z 零值标志

C 实现标志(C标志)

V 溢出标志(V标志)

SS 软件步骤。当异常产生时表明是否软件步骤是否使能。

IL 非法执行状态位。在异常产生之前立即显示PSTATE.IL值。

D 进程状态调式mask。表明是否从watchpoint,breakpoint和软件单步调式事件是屏蔽或不屏蔽。

A SError屏蔽位

I IRQ屏蔽位

F FIQ屏蔽位

M[4] 异常产生的执行状态。0表示AArch64。

M[3:0] 异常产生的模式或异常级别

        在ARMv8中,写SPSR依赖于异常级别。如果异常发生在EL1,SPSR_EL1被使用。如果异常产生在EL2,SPSR_EL2被使用。如果异常发生在EL3,SPSR_EL3被使用。当异常产生时core遍历SPSR。

        note: 与一个异常级别相关的寄存器组ELR_ELn和SPSR_ELn在执行在更低的异常级别时保持着它们的状态。

2 处理器状态

        AArch64没有直接等于ARMv7 CPSR。在AArch64中,传统CPSR的部件被当作能够独立访问的域。它们被称为PSTATE。

        处理器状态,或PSTATE域,对于AArch64有如下定义:

PSTATE域定义
NameDescription
N负值条件标志
Z零值条件标志
C执行条件标志
V溢出条件标志
D调试mask标志
ASError mask位
IIRQ屏蔽位
FFIQ屏蔽位
SS软件单步位
IL非法执行状态位
EL执行级别
nRW

执行状态

0 64位

1 32位

SP

栈指针选择

0 SP_EL0

1 SP_EL1

        在AArch64中,通过执行ERET指令从异常返回,这会导致SPSR_ELn被拷贝到PSTATE。这将恢复ALU标志,执行状态,异常级别,和处理器分支。你将从ELR_ELn的地址继续执行。

        PSATE.{N,Z,C,V}域可被EL0访问。所有其他PSTATE域可以被执行在EL1或更高级别,它们在EL0为未定义。

 

 

 

 

最后

以上就是靓丽豌豆为你收集整理的ARMv8-A编程指导之ARMv8寄存器(1)1 AArch64特殊寄存器2 处理器状态的全部内容,希望文章能够帮你解决ARMv8-A编程指导之ARMv8寄存器(1)1 AArch64特殊寄存器2 处理器状态所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部