OF标记位判断

转自:http://hi.baidu.com/neomanontheway/blog/item/7ada62db3852a12511df9bfd.html

•计算机硬件判断溢出的方法如下:
最高位有进位但次高位没有进位,或者最高位无进位但次高位有进位;也就是最高位和次高位一个有进位一个无进位。

•我们不是机器不使用这么机械的方法,可以使用如下规则(汇编教材第二版第19页):
只有当两个相同符号数相加(含两个不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出。

•例如:3AH+7CH=00111010B+01111100B=10110110B=B6H
次高位一个是0一个是1,但还有一个低位进位1,所以次高位有进位;最高位两个0,还有次高位进位,结果只是1没有进位,所以计算机判断有溢出。
我们判断,看最高位,两个数最高位相同为0,相加后结果最高位为1,所以有溢出。

再如:3AH+8DH,我们可以马上判断出没有溢出。因为这是两个不同符号数相加。

利用调试程序可以帮助你验证。

将数据按有符号数进行补码变换求出对应十进制真值,然后判断也可以,但比较麻烦,不如上述规则简单明了。

提问:

进位和溢出的区别,书上也有解释的。但是我看不太明白。我理解的是,进位和无符号数有关,溢出和有符号数有关。书上说,有进位时,运算结果正确,有溢出时,运算结果已经不正确了。这句话不能理解。您能不能简单地帮我说说呢?

回复:

用8位(字节量)数据相加为例说明溢出后运算结果不正确:

对数据3AH和7CH相加,80x86处理器按照无符号数相加,和是B6H;
转换为十进制表达,就是58+124=182,8位无符号数表达0~255范围,
所以没有超出这个范围、没有进位CF=0。

8位补码表达的有符号数的范围是-128~+127,182超出了这个范围,所以产生溢出、OF=1;
另一方面,补码B6H表达真值是-74;两个正数相加、和不可能是负数,显然运算结果不正确。

你可能感兴趣的:(汇编,X86)