鱼C论坛

 找回密码
 立即注册
查看: 2737|回复: 6

[已解决]關於OF flag的問題

[复制链接]
发表于 2019-10-12 15:46:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好, 我又來問問題了,
請看下面程序, 關於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
最佳答案
2019-10-12 19:29:03
kikiatw 发表于 2019-10-12 16:43
剛剛在認真的看了一下, 好像有點明白了,
第一個超過120+20 > 127 肯定就是溢位
第二個, -6 +10 沒毛病

最后一句理解的没错,是这样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-12 16:43:15 | 显示全部楼层
剛剛在認真的看了一下, 好像有點明白了,
第一個超過120+20 > 127 肯定就是溢位
第二個, -6 +10 沒毛病
第三個, 5-10 沒有理由溢位
第四個, -126 -10肯定溢位

所以我理出一個頭緒, 當要看溢位OF flag的時候, 你運算就要把它當有號, 算完後還要看SF是正是負
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-12 18:50:51 | 显示全部楼层
我的理解:

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

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

当我们把输入的值当作有符号数时:我们认为add/sub指令进行的有符号运算,最后的结果我们也认为是有符号数。通过观察OF,我们判断是否发生溢出。当OF=0时,说明结果没有发生溢出,结果是正确的;当OF=1时,说明结果发生溢出,已经无法得到正确的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-12 19:29:03 | 显示全部楼层    本楼为最佳答案   
kikiatw 发表于 2019-10-12 16:43
剛剛在認真的看了一下, 好像有點明白了,
第一個超過120+20 > 127 肯定就是溢位
第二個, -6 +10 沒毛病

最后一句理解的没错,是这样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-14 16:47:05 From FishC Mobile | 显示全部楼层
本帖最后由 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

最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-15 18:28:07 | 显示全部楼层
SB兄你說的這些, 其實不用上網查, 小甲魚匯編視頻56已經有說了
我的問題是在OF這個Flag. 就如我最後一句話說的, 看你是如何看待這個操作.
兩個有號的數, 不管正負. 操作後越過128的門檻就會ov


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

当负数从8位扩展到16位时,指令的操作数前面必须补充0xFF,等效于neg指令。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-4 16:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表