haoii 发表于 2019-6-28 15:35:53

关于8086汇编OF位是否溢出的判定

看了许久许久,网上查了很多人的回答,仍是不懂,学习快进行不下去了,烦请大神帮忙指点一下。
写出下面每条指令执行后,OF、SF等标志位(检测点11.2中其他标志位都能理解,就这个OF位不能理解)的值
第一组:
mov al,10H
mov al,80H            ;因为判定OF值,所以进行的是有符号位计算,10H(1 0000B)按位取反加1为(1 0000B)为十进制-16,同理80H为十进制-0(1000 0000B),-16-0=-16,在-128~127范围,
                               因此未溢出,OF值为0;1 0000B+1000 0000B=1001 0000B,最高位是1,因此SF的值为1

第二组:
mov al,80H
add al,80H            ;因为判定OF值,所以进行的是有符号位计算,80H按位取反加1,为十进制-0(1000 0000B),-0-0=0,在在-128~127范围,因此未溢出,OF值为0;1000 0000B + 1000 0000B=1
                              0000 0000B, 最高位是0,因此SF的值为0。(可答案中OF却是1)
                           

第三组:
mov al,0FCH
add al,05H            ;因为判定OF值,所以进行的是有符号位计算,0FCH按位取反加1后为(0000 0001B),十进制为-1,05H按位取反加1后为(1111 1011B)-123D,-1-123=-124,在范围,因此OF为0

第四组:
mov al,7DH
add al,0BH

烦请大神详细指点一下我OF值判定方法是否正确,若不正确,请详解示例

jackz007 发表于 2019-6-28 16:15:11

本帖最后由 jackz007 于 2019-6-28 16:17 编辑

          对于字节数据,OF,SF 的门槛就是 07FH / 080H,也就是有符号数正负值之间跨越的问题。
        mov al,07FH    ; OF = 0 , SF = 0
    inc al         ; OF = 1 , SF = 1 此操作导致溢出,al 寄存器的值脱离原来的正整数范围,从 127 变成 -128
        mov al,080H   ; OF = 0 , SF = 1
    dec al         ; OF = 1 , SF = 0 此操作导致溢出,al 寄存器的值脱离原来的负整数范围,从 -128 变成 127

newu 发表于 2019-6-28 16:36:59

OF(Overflow Flag)溢出标志,在运行过程中,如操作数超出了机器能表示的范围则称为溢出,此时OF位置1,否则置0.

所以是否溢出就要看是否超过了原加法表示的范围,即对于正数来说超过正数的运算范围就是溢出,反之亦然,
对于加减混合运算超出范围也叫溢出,不要想的太复杂,就平常简单理解

newu 发表于 2019-6-28 16:42:24

所以我的判定方法是什么?
第一组,10H(十进制是16),80H(-128), 相加等于-112, OF=0, SF=1
第二组,80H(十进制是-128), 80H(-128), 相加等于 -256,内存中表示是0, OF=1, SF=1

以此类推

haoii 发表于 2019-6-28 19:07:43

jackz007 发表于 2019-6-28 16:15
对于字节数据,OF,SF 的门槛就是 07FH / 080H,也就是有符号数正负值之间跨越的问题。
   
   ...

感谢您的回答,学习了对于字符数据,OF的门槛是07FH/080H。再次感谢您的回答

haoii 发表于 2019-6-28 19:09:28

newu 发表于 2019-6-28 16:42
所以我的判定方法是什么?
第一组,10H(十进制是16),80H(-128), 相加等于-112, OF=0, SF=1
第二组,8 ...

感谢您的回答及耐心指导,好像觉得有点懂了,又有点懵懂。比如:10H,80H看成有符号数,不需要按位取反加1的方式计算出是哪个数据(十进制)的补码吗?

newu 发表于 2019-6-28 19:20:50

haoii 发表于 2019-6-28 19:09
感谢您的回答及耐心指导,好像觉得有点懂了,又有点懵懂。比如:10H,80H看成有符号数,不需要按位取反加 ...

不客气,
10H(二进制是00010000),第一位表示符号位,0代表正数,补码就是他自己
80H(二进制是10000000),第一位符号位是1,表示负数,此时按位取反+1即可算出

haoii 发表于 2019-6-28 19:43:52

newu 发表于 2019-6-28 19:20
不客气,
10H(二进制是00010000),第一位表示符号位,0代表正数,补码就是他自己
80H(二进制是10000000 ...

我完全懂了,再次感谢您的耐心帮助

newu 发表于 2019-6-28 19:53:05

haoii 发表于 2019-6-28 19:43
我完全懂了,再次感谢您的耐心帮助

哈哈,不客气
页: [1]
查看完整版本: 关于8086汇编OF位是否溢出的判定