kikiatw 发表于 2019-10-12 15:46:54

關於OF flag的問題

大家好, 我又來問問題了,
請看下面程序, 關於FLAG的 OF , 我本來以為寄存器的最高位由1變0或者是由0變1, 都會產生OV,
可是當相加的時候, 第八位1變0, 不會產生OV,
當相減的時候, 第八位0變1, 不會產生OV
看來是我認ˋ知錯誤, 請問大神們, 我的問題出在哪?

ASSUME        CS:CODE

CODE SEGMENT
MAIN:
        mov ax,0
        mov al,120
        add al,20        ;第八位0變1, 會OV

        mov ax,0
        mov al,250
        add al,10        ;第八位1變0, 會CY不會OV

        mov ax,0
        mov al,5
        sub al,10        ;第八位0變1, 會CY不會OV

        mov ax,0
        mov al,130
        sub al,10        ;第八位1變0, 會OV
        MOV AX,4C00H
        INT 21H


CODE ENDS;
END MAIN

kikiatw 发表于 2019-10-12 16:43:15

剛剛在認真的看了一下, 好像有點明白了,
第一個超過120+20 > 127 肯定就是溢位
第二個, -6 +10 沒毛病
第三個, 5-10 沒有理由溢位
第四個, -126 -10肯定溢位

所以我理出一個頭緒, 當要看溢位OF flag的時候, 你運算就要把它當有號, 算完後還要看SF是正是負

发表于 2019-10-12 18:50:51

我的理解:

add/sub指令不区分有无符号。

当我们把输入的值当作无符号数时:我们认为add/sub指令进行的无符号运算,最后的结果我们也认为是无符号数。通过观察CF,我们判断是否发生进位/借位。当CF=0时,说明结果没有发生进位/借位;当CF=1时,说明结果发生进位/借位,可以结合CF和寄存器的值得到正确的值

当我们把输入的值当作有符号数时:我们认为add/sub指令进行的有符号运算,最后的结果我们也认为是有符号数。通过观察OF,我们判断是否发生溢出。当OF=0时,说明结果没有发生溢出,结果是正确的;当OF=1时,说明结果发生溢出,已经无法得到正确的值。

发表于 2019-10-12 19:29:03

kikiatw 发表于 2019-10-12 16:43
剛剛在認真的看了一下, 好像有點明白了,
第一個超過120+20 > 127 肯定就是溢位
第二個, -6 +10 沒毛病


最后一句理解的没错,是这样的。

发表于 2019-10-14 16:47:05

本帖最后由 SВ 于 2019-10-15 08:46 编辑

我在网上找到了一个链接,总结了一下cmp的规则,可以参考,点我查看链接
5. cmp
cmp op1, op2

ZF=1 这个简单,则说明两个数相等

当无符号时:
CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2

当有符号时:
若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2

最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出

kikiatw 发表于 2019-10-15 18:28:07

SB兄你說的這些, 其實不用上網查, 小甲魚匯編視頻56已經有說了
我的問題是在OF這個Flag. 就如我最後一句話說的, 看你是如何看待這個操作.
兩個有號的數, 不管正負. 操作後越過128的門檻就會ov


发表于 2019-10-18 18:24:41

kikiatw 发表于 2019-10-15 18:28
SB兄你說的這些, 其實不用上網查, 小甲魚匯編視頻56已經有說了
我的問題是在OF這個Flag. 就如我最後一句 ...

当负数从8位扩展到16位时,指令的操作数前面必须补充0xFF,等效于neg指令。
页: [1]
查看完整版本: 關於OF flag的問題