汇编的OF标志位是怎么回事

SVKING 2011-10-26 05:07:51
请问汇编里的OF标志位是怎么设置的,工作原理是什么啊。逻辑上我理解可是不知道具体怎么设置OF的。
拿王爽的《汇编语言》中的一个讲解OF的例子为例:
“ mov al,0F0H (-16)
add al,78H (120)
add执行后:CF=1,OF=0 ”
不明白OF怎么为0的。
请理解的帮我一下吧,用二进制具体解释一下。逻辑上是120我理解,可是就是OF为什么不是1啊,OF是根据什么设置的啊。
十分感谢!!!

...全文
3219 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq357055361 2013-05-18
  • 打赏
  • 举报
回复
学习了,牛逼啊
SVKING 2011-10-28
  • 打赏
  • 举报
回复
好吧,知道的差不多了。结贴了,谢谢各位的大力支持!!!!!
xujinzhao 2011-10-27
  • 打赏
  • 举报
回复
of是溢出标志如果符号位也就是最高位的值发生了改变,就设置该位
SVKING 2011-10-27
  • 打赏
  • 举报
回复
我问个对比的例子吧

1111,0000(-16)
+1000,1000(-120)
=0111,1000
就是:
mov al,0F0H
add al,088H
执行后OF是1

而:
1111,0000(-16)
+ 0111,1000(120)
= 0110,1000
就是:
mov al,0F0H (-16)
add al,78H (120)

执行后OF是0

这两个例子都是最高位原来为1,执行后为0,且发生了进位(假设),而结果不一样。计算机是执行时是怎样区分的呢。工作原理是什么?
a794950529 2011-10-27
  • 打赏
  • 举报
回复
恩,我也不大明白,只知道原理上是超了-128~127,OF就是1
SVKING 2011-10-27
  • 打赏
  • 举报
回复
额我有错了,

mov al,0F0H (-16)
add al,78H (120)
是:
1111,0000
+ 0111,1000
= 0110,1000
最高位的1+1后,超了啊,OF不用该为1吗
SVKING 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xujinzhao 的回复:]

of是溢出标志如果符号位也就是最高位的值发生了改变,就设置该位
[/Quote]
mov al,0F0H (-16)
add al,78H (120)
就是:
1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗
SVKING 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 simbon 的回复:]

无符号数:F0H(240) + 78H(120) = 168H(360)
有符号数:F0H(-16) + 78H(120) = 68H(104)

360超出了8位数所能表示的范围-128~127
104没有超出8位数所能表示的范围,因此有符号数运算时,没有溢出

再如:
无符号数:F0H(240) + 88H(136) = 178H(376)
有符号数:F0H(-16) + 8……
[/Quote]
我知道是这个理,但我不知道计算机是怎么工作的,是不是根据符号位是否改变来设置的,是的话,
1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗。
不是的话,那是怎么设置OF的啊
SVKING 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 simbon 的回复:]

引用 20 楼 jerry_ye601 的回复:

F0H:11110000B
78H:01111000B
11110000B
+01111000B
-------------
101101000B
其中最高位进一对应于CF=1,而OF的值应当是最高位的进位(1)和次高位进位(1)的异或,所以所求得的值OF=0
明白了么?

你可以参考这个,这是个人经验,官方并没有这样解释……
[/Quote]
好的,确实可以确定。有道理就可以了。真是太感谢你了。顺便问一下,你明白这样确定OF的道理是什么吗?
SVKING 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 jerry_ye601 的回复:]

F0H:11110000B
78H:01111000B
11110000B
+01111000B
-------------
101101000B
其中最高位进一对应于CF=1,而OF的值应当是最高位的进位(1)和次高位进位(1)的异或,所以所求得的值OF=0
明白了么?
[/Quote]
明白了,这就是我找的答案。十分感谢!!!可是这么确定OF的原理是什么啊,我想了一下,可是想不大明白。
SVKING 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 simbon 的回复:]

你确定你的两个例子都溢出了?其中一个溢出了,另一个没溢出。计算机在计算的时候会有两个答案,一个是有符号的,一个是无符号的,虽说两个答案都是一个值。你现在不是不明白,只是脑子转不过来弯,我保证你停一个星期再考虑这个问题一定豁然开朗
[/Quote]
这两个例子是第一个溢出,第二个没溢出。我知道啊。可是不明白计算机是根据什么设置OF的,最底层的。
Jerry_ye601 2011-10-27
  • 打赏
  • 举报
回复
F0H:11110000B
78H:01111000B
11110000B
+01111000B
-------------
101101000B
其中最高位进一对应于CF=1,而OF的值应当是最高位的进位(1)和次高位进位(1)的异或,所以所求得的值OF=0
明白了么?
zzxgo 2011-10-27
  • 打赏
  • 举报
回复
没有溢出自然就为0了
SVKING 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 voidnull 的回复:]

引用 14 楼 svking 的回复:
我问个对比的例子吧

1111,0000(-16)
+1000,1000(-120)
=0111,1000
就是:
mov al,0F0H
add al,088H
执行后OF是1

而:
1111,0000(-16)
+ 0111,1000(120)
= 0110,1000
就是:
mov al,0F0H (-16)
ad……
[/Quote]
我明白计算机里真正只有的只是0和1,计算机不知道是有符号还是无符号的,所以把两种情况都记录下,怎么用取决于程序员怎么设计。可是我现在搞不明白计算机是根据哪儿设置OF的,我的两个例子里,都有符号位的改变,和进位。计算机是怎么区分是否要改变OF的呢?
SVKING 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 simbon 的回复:]

只是一时脑子转不过来弯罢了,谁遇到这个都会这样。
1111 0000(240)(-16)
1000 1000(136)(-120)
10111 1000(360)(-136)

如果是0111 1000的话,那就是正数,无法表示-136
因此,有符号数运算,溢出了。

1111 0000(240)(-16)
0111 1000(120)
10110 1000(360)……
[/Quote]
我想知道计算机是怎么判断这两个数(只考虑有符号的情况,无符号的情况我能明白)相加之后是否要改变符号位的
。CF是取决于最高位相加之后有没有进位(我自己的理解,应该没错吧)。OF取决于哪儿呢??
在这儿先谢谢你的热心帮助,谢谢!
voidnull 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 svking 的回复:]
我问个对比的例子吧

1111,0000(-16)
+1000,1000(-120)
=0111,1000
就是:
mov al,0F0H
add al,088H
执行后OF是1

而:
1111,0000(-16)
+ 0111,1000(120)
= 0110,1000
就是:
mov al,0F0H (-16)
add al,78H (120)

……
[/Quote]

因为那两个数都既可以看做有符号数,也可以看做无符号数。你如果把它看做有符号数,它的最高位就表示正负,为1时是负数,为0时是正数。如果你把它看做无符号数,那就没有符号位。

这你这个例子中,第一个
1111,0000(看做无符号数:240, 看做有符号数:-16)
+1000,1000(看做无符号数:136, 看做有符号数:-120)
无论看做有符号数还是无符号数,结果都溢出了。所以CF、OF都为1。

而第二个例子,看做有符号数时没有溢出,所以OF为0。

说白了,你就是不明白一点,CPU是不知道你希望这个数到底是有符号还是无符号的,或者说,你希望它的最高位是表示正负还是这个数的一部分,所以它只好把两种情况都考虑,把它当做有符号和无符号数时的两种计算结果都告诉你,通过CF和OF标志位。
SVKING 2011-10-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 simbon 的回复:]

mov al,0F0H (-16)
add al,78H (120)
OF只对有符号数运算有意义,CF对无符号数运算有意义
上面的如果是有符号数运算的话,结果al = 104,无符号数运算al = 120
因此,进行无符号数运算时,溢出了,CF=1,对于有符号数运算时,没溢出,OF=0
[/Quote]
我知道逻辑上时这样,可是
1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗
我现在不明白的是OF使根据哪儿确定改不改变啊
laoliangchirou 2011-10-26
  • 打赏
  • 举报
回复
这个得好好学学
dong_tx 2011-10-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 simbon 的回复:]

mov al,0F0H (-16)
add al,78H (120)
OF只对有符号数运算有意义,CF对无符号数运算有意义
上面的如果是有符号数运算的话,结果al = 104,无符号数运算al = 120
因此,进行无符号数运算时,溢出了,CF=1,对于有符号数运算时,没溢出,OF=0
[/Quote]

学习了
SVKING 2011-10-26
  • 打赏
  • 举报
回复
逻辑结果是104,不是120,我错了。可是还是不明白啊
加载更多回复(1)

21,493

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧