汇编语言溢出和进位的判断

汇编语言溢出和进位的判断,第1张

在小学学过:自然数、整数。

存入计算机后,就改称为:无符号数、带符号数。

不论什么数,在计算机中,都是用“二进制机器码”表示和存储。

8 位的二进制机器码,可代表

 无符号数的范围是:0~255。

 带符号数的范围是:-128~+127。

当运算结果,超出了上述的范围,必然就会溢出。

溢出,本应是通用的名词。

但是,在 Intel 设计的 CPU 中,就分成了“进位”和“溢出”两种说法。

-----------------------

Intel 设计 CPU 时,规定了两个标志位。

 无符号数运算结果超出上下限,将有:CF = 1,这就叫做“进位”。

 有符号数运算结果超出上下限,将有:OF = 1,这才叫做“溢出”。

示意图如下:

无论出现 CF=1 或 OF=1,都说明,运算结果,已经超出 8 位二进制的容纳范围。

那么,仅仅以 8 位二进制,当做运算结果,肯定是错误的。

对于无符号数来说,把 CF=1 算在内,共有 9 位的结果,这就是正确的。

但是,对于带符号数运算来说,一旦 OF=1,就无法得到正确的结果。

在汇编语言中,你可以根据 CF、OF 的值,分别判断进位和溢出。

因为当你需要做超过处理器字长的减法时,例如8086进行长整形(32位,4个字节)减法计算,只能分别计算高位字和低位字的相减,低位字直接相减就行,可是如果不够减,就会产生借位(CF=1),这个借位本来就应该是向高位字来借的,也就是说高位字被借走了一个1,于是高位字相减时就需要这个SBB指令了。

AL=7FH
CF=NC
OF=OV
因为80h=1000
0000H,最高位为1,sub做为有符号数-1
7FH=0111
1111H,
根据设定,两个数相减时,如果两个数的符号相反,而结果与减数相同则OF=1,否则OF=0

(加减指令,既作为无符号数影响标志位CF,AF,又作为有符号数影响标志OF,SF。想了半天终于搞清楚了,CF标志反映最高位的进借位情况,而OF反映结果是否溢出,这里的结果是目的 *** 作数中的结果,进借位它是不管的。你这样想的原因是,考虑到CF为1,则肯定溢出了,但是目的 *** 作数中只能保存溢出后的值,丢掉了最高位,所以就不一定溢出了。看例子:
MOV AX,7896H;
ADD AL,AH;
;执行完后CF=1,AL=0EH,但是OEH不溢出,所以OF=0;
后面一句也不对吧。)
以上是我个人的理解。
以下是复制别人的理解:
CF 比较简单吧, 没有什么特别的
OF 表示的带符号数进行运算是否溢出 96+78, 一个是正数, 一个为负数, 相加肯定是不会有溢出的 OF 溢出只可能发生在两个相同符号的数值相加, 或者是不同符号数相减 如果是从算法判断上来看, 如果是在运算时, 次高位向最高位和最高位向 CF 位产生进位情形一致的话, OF=0; 否则 OF=1

96 10010110
+78 01111000
10E 100001110
这里, 次高位和最高位都产生了进位, 情形一致, 所以 OF=0

16 00010110
+78 01111000
08E 10001110
这里, 次高位向最高位产生了进位, 而最高位没有向 CF 产生进位, 所以 OF=1
而且, 结果也是, 两个正数相加, 结果为负数了, 显然溢出

还有两种情况, 也是类似的 一个是都没有产生进位, 那应该是两个小的正数相加, 结果还是正数, 没有溢出; 另外就是次高位没有产生进位, 但最高位产生进位了, 这应该是两个负数相加, 由于次高为位没有产生进位, 所以, 最高位, 也就是符号位结果为 0, 是正数, 显然也是溢出了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12868405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-28
下一篇 2023-05-28

发表评论

登录后才能评论

评论列表(0条)

保存