汇编中CF和OF标志位

只总结一下有符号数,无符号数计算时可以在前面加一个符号位0,转换成有符号数

对于有符号数,

反码变补码:除符号位外,其余各位取反,总体+1

补码变反码:除符号位外,其余各位取反,总体+1(将计算结果转化成反码,进而转化成原码,判断计算结果是否正确)

判断OF,计算结果是否在可表示范围内,不在则OF=1,计算结果决定OF

判断CF,最高位是否向符号位进位,进位则CF=1,进位情况决定CF

具体分析,

首先要将数字转换成补码形式(注意:题目中给的“有符号数”就是补码,不用再转换了),

以4bit的有符号数a,b为例,a±b都会转化成a补+(±b)补,将减法统一成加法,这样就不会出现“借位”的情况

n bit补码可以表示的数的范围 ,包含两个端点值

所以4bit的表示范围是 -8 ~ +7,a,b不能超过这个范围,a±b也不能超过这个区间,

超过就会溢出,OF=1,否则OF=0;

还有一个判断OF值的方法:如果异号相加,则OF=0,因为结果肯定不会溢出;同号相加,结果可能溢出

需要注意的是,a补+(±b)补如果符号位向更高位进位(计算结果是五位数,我们只取后四位)不一定是溢出,两个负数相加,符号位一定向更高位进位,但不一定是溢出

CF表示的是a补+(±b)补时,最高有效位(就是符号位后面那位)是否向符号位进位,进位CF=1,否则CF=0

最高有效位进位也不代表就会溢出,溢出也不代表最高有效位进位,OF和CF没有必然的联系

比如(-8)+(-8)=(-16),

转换成补码是1000+1000=0000,

计算结果为0,溢出,但最高位没有进位

举几个例子,

当a=5,b=1时,计算a-b,

a补=0101,(-b)补=1111,

a补+(-b)补=0101+1111=0100,最高有效位进位但结果没有溢出

当a=7,b=3时,计算a+b,

a补=0111,b补=0011,

a补+b补=0111+0011=1010,

(错误:右侧是OF=1)

当a=1,b=-7时,计算a+b,

a补=0001,b补=1010,

a补+b补=0001+1010=1011,

原文地址:https://www.cnblogs.com/lylhome/p/13272288.html