Aarch64 的 CPSR 寄存器的困惑:如何读取它以及“ARM 处理器模式”的编码

问题描述 投票:0回答:1

我正在使用 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

我做错了什么?

assembly windbg arm64
1个回答
0
投票

因此这意味着

M
位是:
0b00100
。但如果根据文档这是一个未定义的编码,这怎么可能是真的呢?

您查看了错误的文档,您的链接适用于 ARMv7。如果您查看 ARMv8 并滚动浏览 32 位处理器状态,您会看到:

M[4],位[4]

执行状态。在从 AArch64 状态获取 EL1 异常时,设置为 PSTATE.nRW 的值

0b0
,并在 EL1 中执行异常返回操作时复制到 PSTATE.nRW。 |M[4]|含义| |:-|:-| |0b0|AArch64 执行状态。|

热重置时,此字段重置为架构上未知的值。

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
和异常进入/返回。

© www.soinside.com 2019 - 2024. All rights reserved.