AVR汇编中Sign Flag异常置1问题咨询:BRLT触发逻辑疑惑
AVR汇编中Sign Flag置1导致BRLT跳转的原因分析
核心初始值错误
你首先混淆了8位有符号数的补码:0b11111111是**-1**的补码,不是-128。-128的8位补码是0b10000000,这是后续误解的根源。
逐指令分析标志位变化
1. 初始寄存器赋值
LDI R16,0b11111111:实际存入**-1**(而非你认为的-128)LDI R17,0b00000001:存入+1,这部分正确
2. SUB指令执行
执行SUB R16,R17,计算逻辑为 -1 - 1 = -2,-2的8位补码是0b11111110,此时标志位:
- Negative Flag(N):结果最高位为1,N=1
- Overflow Flag(V):-2在8位有符号数范围(-128~127)内,无溢出,V=0
- Sign Flag(S):AVR中
S = N ^ V,即1 ^ 0 = 1,因此S被置1
3. CPI指令执行
CPI R16,0b00000000 执行R16 - 0的计算,此时R16为-2(0b11111110),结果不变,标志位更新后:
- N=1,V=0,所以
S = 1 ^ 0 = 1,保持置1状态
4. BRLT跳转逻辑
教授所说的Sign Flag置1时BRLT满足,对应AVR有符号数小于的判断规则:当A < B(有符号数)时,S = N ^ V = 1。这里CPI比较R16(-2)和0,-2确实小于0,因此S=1,触发BRLT跳转至LOOP。
补充:假设初始值为-128的场景
如果按你的错误假设,将R16初始化为0b10000000(-128),执行SUB R16,R17计算-128 - 1 = -129,超出8位有符号数范围:
- 结果截断为
0b01111111(127),此时N=0,V=1(溢出) S = 0 ^ 1 = 1,S仍然置1,BRLT依然会跳转
内容的提问来源于stack exchange,提问作者RK Eshat
相关产品推荐
相关产品推荐

