状态寄存器

CPU 运行的时候会有一定的状态,比如说目前正处于哪个特权等级,计算结果是否溢出等等。状态寄存器就是指示这种状态的寄存器。在功能上,这种寄存器一般被软件读取,来查看当前处理器的状态。

Arm 中的状态寄存器被叫作 CPSR (Current Processor Status Register) 。有趣的是,这个寄存器并不是真实村子啊的,有些 predicate 指令可以读取这个寄存器来判断是否具有执行效果,但是并不存在 mrs cpsr, x0 这样的读取 CPSR 的指令。我们可以读取这个寄存器的某些位域,比如说 CurrentEL 。

我们真正可以读取的寄存器被叫作 SPSR (Saved Processor State Register) ,当异常发生时,CPSR 中的处理器状态将保存在 SPSR 中,在异常返回使将 SPSR 中的值恢复到 SPSR 中。也就是说,SPSR 并不是一个状态寄存器,而是一个 状态寄存器现场 。SPSR 寄存器的作用是两方面的,一方面我们可以读取其中的值来了解 CPU 的运行状态,另外我们可以写入 SPSR 来修改 CPU 的运行状态。

在 Armv8 中,CPSR (CPSR 是 Armv7 的概念)则对应的是 PSATE (Processor STATE) 寄存器。总之这些概念比较混淆,了解意思即可。

SPSR

SPSR 位域情况如下:

含义如下:

名称位域含义
N31负数标志位
Z30零标志位
C29进位标志位
V28溢出标志位
SS21Software Step, 在异常发生时,Software Step 是否开启
IL20非法执行状态位
D9程序状态调试(Debug)掩码
A8SError(系统错误)掩码位
I7IRQ 掩码位
F6FIQ 掩码位
M4异常发生时的执行状态 ,0 表示 AArch64
M[3:0]异常发生时的异常级别

处理器状态

AArch64 没有直接与 ARMv7 当前程序状态寄存器(CPSR)等价的寄存器。在 AArch64 中,传统 CPSR 的组件作为可以独立访问的字段提供。这些状态被统称为处理器状态(PSTATE)。

独立访问的形式如下:

mrs     X0, CurrentEL

这些寄存器包括:

PSTATE.{N, Z, C, V} 字段可以在 EL0 级别访问。 其他的字段可以在 EL1 或更高级别访问,但是这些字段在 EL0 级别未定义。

另外提一嘴,到了 A64 时,并不是所有指令都会影响 PSTATE 的标志位了,只有数据处理中的算术逻辑运算指令和比较指令会影响状态位。