關於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
剛剛在認真的看了一下, 好像有點明白了,
第一個超過120+20 > 127 肯定就是溢位
第二個, -6 +10 沒毛病
第三個, 5-10 沒有理由溢位
第四個, -126 -10肯定溢位
所以我理出一個頭緒, 當要看溢位OF flag的時候, 你運算就要把它當有號, 算完後還要看SF是正是負
我的理解:
add/sub指令不区分有无符号。
当我们把输入的值当作无符号数时:我们认为add/sub指令进行的无符号运算,最后的结果我们也认为是无符号数。通过观察CF,我们判断是否发生进位/借位。当CF=0时,说明结果没有发生进位/借位;当CF=1时,说明结果发生进位/借位,可以结合CF和寄存器的值得到正确的值
当我们把输入的值当作有符号数时:我们认为add/sub指令进行的有符号运算,最后的结果我们也认为是有符号数。通过观察OF,我们判断是否发生溢出。当OF=0时,说明结果没有发生溢出,结果是正确的;当OF=1时,说明结果发生溢出,已经无法得到正确的值。 kikiatw 发表于 2019-10-12 16:43
剛剛在認真的看了一下, 好像有點明白了,
第一個超過120+20 > 127 肯定就是溢位
第二個, -6 +10 沒毛病
最后一句理解的没错,是这样的。 本帖最后由 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
最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出 SB兄你說的這些, 其實不用上網查, 小甲魚匯編視頻56已經有說了
我的問題是在OF這個Flag. 就如我最後一句話說的, 看你是如何看待這個操作.
兩個有號的數, 不管正負. 操作後越過128的門檻就會ov
kikiatw 发表于 2019-10-15 18:28
SB兄你說的這些, 其實不用上網查, 小甲魚匯編視頻56已經有說了
我的問題是在OF這個Flag. 就如我最後一句 ...
当负数从8位扩展到16位时,指令的操作数前面必须补充0xFF,等效于neg指令。
页:
[1]