关于Aarch64架构CPSR寄存器的困惑:读取与处理器模式编码问题
问题解答
关于WinDbg中CPSR M位编码的困惑
AArch64架构已经摒弃了ARMv7时代的处理器模式划分,转而采用异常级别(Exception Level, EL)区分特权等级。你看到的M位0b00100(对应0x4),在AArch64语境下并非未定义,而是对应EL1(异常级别1)——这正是Windows 11内核运行的特权等级。
WinDbg沿用了ARMv7时代的CPSR位域标注方式,但实际AArch64中,原M位的编码已被重新定义为异常级别相关状态:0x4对应EL1,且当前使用EL1专属栈(SP_EL1)。内核模式下触发中断时,CPU仍处于EL1的异常处理流程,因此cpsr和spsr都会显示这个值,完全符合Windows内核的运行状态。
关于mrs x0, CPSR编译错误的原因
AArch64架构中不存在CPSR这个系统寄存器名称——这是ARMv7时代的寄存器命名。在AArch64汇编里,原CPSR的功能被拆分到多个专用系统寄存器中:
- 读取异常级别:使用
mrs x0, CurrentEL - 读取标志位(N/Z/C/V):使用
mrs x0, NZCV - 读取中断掩码(D/A/I/F):使用
mrs x0, DAIF
你遇到的error A2502: operand 2: Expected constant错误,是因为汇编器(如MASM)在AArch64模式下无法识别CPSR作为合法的系统寄存器操作数,因此判定第二个操作数不符合要求。替换为AArch64对应的系统寄存器名称即可解决。
内容的提问来源于stack exchange,提问作者c00000fd
相关产品推荐
相关产品推荐

