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
相关产品推荐
相关产品推荐

