You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM Cortex-M4 xPSR读取方式及标志位疑惑求助

ARM xPSR相关疑问解答

1. adds r0, r1后N位为何为1?

你看到的xPSR二进制值1000001000000000000000000000000(推测应为32位完整值10000010000000000000000000000000),核心问题是你对位的顺序解读反了。

ARM xPSR是32位寄存器,位定义从高到低(bit31到bit0)为:

  • bit31:N位(结果为负时置1,即结果的bit31为1)
  • bit30:Z位(结果为0时置1)
  • bit29:C位(无符号加法进位/减法无借位时置1)
  • bit28:V位(有符号运算溢出时置1)

执行adds r0, r1(r0、r1均为0)时,结果r0=0,因此:

  • Z位(bit30)必须置1
  • N位(bit31)必须置0(结果的bit31是0)

你看到的最高位为1,是因为误将寄存器数值按低位在前、高位在后的方式拼接二进制。正确的做法是把xPSR的32位数值直接转成二进制,从左到右对应bit31到bit0。此时该操作对应的xPSR值应为0x40000000,二进制是01000000000000000000000000000000,N位为0,Z位为1,符合预期。

2. 正确读取xPSR二进制值的方式

读取xPSR需遵循以下步骤:

  • 用指令读取到通用寄存器:使用mrs rX, xPSR(X为任意通用寄存器,如r4)将xPSR的32位完整值加载到通用寄存器中。
  • 转换二进制并按高位到低位解读:把通用寄存器的数值转成32位二进制字符串,此时:
    • 字符串最左侧的位是bit31(N位)
    • 左数第2位是bit30(Z位)
    • 左数第3位是bit29(C位)
    • 左数第4位是bit28(V位)
    • 剩余右侧位对应xPSR的其他状态字段(如模式、中断掩码,调试时通常重点关注前4位)

以你的第二个测试adds r2, r3为例:r2=0,r3=-1(32位有符号数为0xFFFFFFFF),相加结果为0xFFFFFFFF(即-1),此时:

  • N位(bit31)=1(结果最高位为1,代表负数)
  • Z位(bit30)=0(结果不为0)
  • C位(bit29)=0(无符号加法0 + 0xFFFFFFFF未产生进位)
  • V位(bit28)=0(有符号加法无溢出)
    对应的xPSR值为0x80000000,二进制是10000000000000000000000000000000,和你看到的10000001...不符,同样是位顺序解读错误导致。

补充测试代码(添加xPSR读取逻辑)

.syntax unified
.text
.global main

main:
        mov r0,#0
        mov r1,#0
        adds r0,r1
        mrs r4, xPSR  @ 将xPSR读入r4,此时r4值应为0x40000000
        
        mov r2,#0
        mov r3,#-1
        adds r2,r3
        mrs r5, xPSR  @ 将xPSR读入r5,此时r5值应为0x80000000

.data
.end

内容的提问来源于stack exchange,提问作者user18688161

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:34:56