例如
MOV AL, 0FFh
ADD AL, 1
其结果产生进位,但并不溢出,可见溢出标志主要还是供有符号运算的.0FFh作为有符号数是 -1, -1 + 1 = 0 当然没有溢出可言.
二我们知道,CPU在进行计算时是没有有符号数于无符号数的区别的,那么它如何判断一个运算超过了其表数范围呢?
答案是:
它将目的操作数在运算过程中的最高2位的进位状态进行XOR作为OF的结果.
例如
MOV AL, 0FFh
ADD AL, 1
11111111o
+ 00000001o
7---------------------0位
^^
7位有进位 1
6位有进位 1
1 xor 1 = 0 所以 OF = 0
例2
MOV AL, 080h
ADD AL, 080h
10000000o
+10000000o
7--------------------0位
7位有进位 1
6位无进位 0
1 xor 0 = 1 所以 OF = 1
所以这个运算溢出了.080h作为有符号数是-128 -128 + -128 = -256显然超过了单字节有符号数表数范围.
那么按道理,-128 + -1应该也溢出才对.
我们验证一下.
单字节 -1 的补码表示是 0FFh
也就是
MOV AL, 080h
ADD AL, 0FFh
10000000
+11111111
7---------------0位
7位有进位 1
6位无进位 0
1 xor 0 = 1 所以 OF = 1 溢出了.
这其中必定有数学原理,暂时不研究了.死记先.