GCC内联汇编读取ARM CPSR寄存器报错,求正确寄存器名称
ARM GCC内联汇编读取状态寄存器的正确写法
你遇到的报错是因为**ARMv8及以上的64位架构(AArch64)**中,传统32位的cpsr寄存器名称已被拆分,GCC自动将cpsr映射为无效的cpsr_c,导致汇编报错。需要根据目标架构选择正确的寄存器名称:
1. 64位ARM(AArch64)
在AArch64架构下,没有统一的CPSR寄存器,而是将原CPSR的功能拆分为多个独立的系统寄存器,常用的有:
- 读取当前异常级别:
uint64_t current_el = 0u; asm volatile("mrs %0, CurrentEL" : "=r"(current_el) :);
- 读取中断掩码(DAIF位,对应原CPSR的I/F/A/D位):
uint64_t daif_flags = 0u; asm volatile("mrs %0, DAIF" : "=r"(daif_flags) :);
- 读取条件码标志(NZCV位,对应原CPSR的N/Z/C/V位):
uint64_t nzcv_flags = 0u; asm volatile("mrs %0, NZCV" : "=r"(nzcv_flags) :);
2. 32位ARM(AArch32)
如果编译目标是32位ARM架构,直接使用cpsr即可,但需确保编译时添加-m32参数指定32位目标:
uint32_t register_cpsr = 0u; asm volatile("mrs %0, cpsr" : "=r"(register_cpsr) :);
你的报错中出现了x0(64位通用寄存器),说明当前编译环境默认是AArch64目标,因此必须使用上述64位架构对应的系统寄存器名称。
内容的提问来源于stack exchange,提问作者Andre K
相关产品推荐
相关产品推荐

