我正在使用 Aarch64 架构。如果我理解正确的话,
CPSR
(或“当前程序状态寄存器”)是一个状态寄存器,保存 CPU 核心执行的当前状态。
我可以看到 WinDbg 显示了两种形式:
cpsr
和 spsr
(后者是“保存的程序状态寄存器”,或者是异常后 cpsr
的值。)
我还可以看到其中N
、
Z
、
C
、
V
位的编码。
但是我对
M[4:0], bits [4:0]
或“ARM处理器模式”的编码有些困惑。
我可以看到 WinDbg 为我提供了这些值(当我在 Windows 11 上进入内核模式时):
cpsr: 0x60000044
spsr: 0x60000044
所以这意味着
M
位是:0b00100
。但如果根据文档这是一个未定义的编码,这怎么可能是真的呢?
还有一个关于这个主题的小后续问题。
我尝试直接从程序集中读取
CPSR
寄存器:
mrs x0, CPSR
但是这条指令在编译过程中给了我这个错误:
error A2502: operand 2: Expected constant
我做错了什么?
因此这意味着
位是:M
。但如果根据文档这是一个未定义的编码,这怎么可能是真的呢?0b00100
您查看了错误的文档,您的链接适用于 ARMv7。如果您查看 ARMv8 并滚动浏览 32 位处理器状态,您会看到:
M[4],位[4]
执行状态。在从 AArch64 状态获取 EL1 异常时,设置为 PSTATE.nRW 的值
,并在 EL1 中执行异常返回操作时复制到 PSTATE.nRW。 |M[4]|含义| |:-|:-| |0b0|AArch64 执行状态。|0b0
热重置时,此字段重置为架构上未知的值。
M[3:0],位[3:0]
AArch64 异常级别和选定的堆栈指针。 |M[3:0]|含义| |:-|:-| |0b0000|EL0t。| |0b0100|EL1t。| |0b0101|EL1h。|
所以您只是处于 SP0 的 EL1 中。
但是这条指令在编译过程中给了我这个错误:
error A2502: operand 2: Expected constant
我做错了什么?
CPSR
在arm64中不存在。有 PSTATE
具有大致相同的作用,但它也不是寄存器,它是“进程状态信息的抽象”。您可以通过寄存器(如 NZCV
、PAN
或 DAIF
)访问它的某些部分,但完整获取或设置它的唯一方法是通过 SPSR_ELn
和异常进入/返回。