MSP430执行sub汇编指令时Carry flag被置位的原因咨询
这个现象是由你所用硬件架构的进位标志位定义规则决定的,你使用的大概率是MSP430、ARM这类RISC架构处理器:
- 首先拆解你运行的汇编指令逻辑:
- 第一条
mov #10,r5将立即数10(十进制,十六进制为0xA)写入寄存器r5 - 第二条
sub #1,r5将r5的值减去立即数1,对应运算为10 - 1
- 第一条
- 核心差异是不同架构减法场景下的CF位定义不同:
x86架构中,减法的CF代表借位标志:被减数小于减数需要向更高位借位时CF置1,否则置0。按这个规则10-1不需要借位,CF会是0。
MSP430、ARM等架构中,减法运算会先转换为补码加法运算:a - b = a + (~b) + 1,CF位直接取这个补码加法的最高位进位输出:有进位则CF置1,无进位则置0。 - 代入你这里的数值(以16位寄存器位宽为例)计算:
10的16位补码为0x000A,1的按位取反结果为0xFFFE,加1后得到0xFFFF
补码加法运算:0x000A + 0xFFFF = 0x10009
运算结果最高位的1超出了16位寄存器的位宽,产生了进位,因此CF被硬件自动置位。
内容的提问来源于stack exchange,提问作者Duo jia
相关产品推荐
相关产品推荐

