状态寄存器

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 的标志位了,只有数据处理中的算术逻辑运算指令和比较指令会影响状态位。