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

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

27 个解决方案

#1


求救大神哪。。。

#2


逻辑结果是104,不是120,我错了。可是还是不明白啊

#3


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

#4


引用 3 楼 simbon 的回复:
mov al,0F0H (-16)
add al,78H (120)
OF只对有符号数运算有意义,CF对无符号数运算有意义
上面的如果是有符号数运算的话,结果al = 104,无符号数运算al = 120
因此,进行无符号数运算时,溢出了,CF=1,对于有符号数运算时,没溢出,OF=0


学习了

#5


这个得好好学学

#6


引用 3 楼 simbon 的回复:
mov al,0F0H (-16)
add al,78H (120)
OF只对有符号数运算有意义,CF对无符号数运算有意义
上面的如果是有符号数运算的话,结果al = 104,无符号数运算al = 120
因此,进行无符号数运算时,溢出了,CF=1,对于有符号数运算时,没溢出,OF=0

我知道逻辑上时这样,可是
  1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗
我现在不明白的是OF使根据哪儿确定改不改变啊

#7


无符号数: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) + 88H(-120) = 78H(-136)

376超出了8位数所能表示的范围
-136也超出了8位书所能表示的范围,因此有符号数与无符号数元算时,都产生溢出

#8


of是溢出标志如果符号位也就是最高位的值发生了改变,就设置该位

#9


没有溢出自然就为0了

#10


引用 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……

我知道是这个理,但我不知道计算机是怎么工作的,是不是根据符号位是否改变来设置的,是的话,
  1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗。
不是的话,那是怎么设置OF的啊

#11


引用 8 楼 xujinzhao 的回复:
of是溢出标志如果符号位也就是最高位的值发生了改变,就设置该位

 mov al,0F0H (-16)
 add al,78H (120)
 就是:
  1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗

#12


额我有错了,

mov al,0F0H (-16)
add al,78H (120)
  是:
  1111,0000
+ 0111,1000
= 0110,1000
最高位的1+1后,超了啊,OF不用该为1吗

#13


恩,我也不大明白,只知道原理上是超了-128~127,OF就是1

#14


我问个对比的例子吧

 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,且发生了进位(假设),而结果不一样。计算机是执行时是怎样区分的呢。工作原理是什么?

#15


只是一时脑子转不过来弯罢了,谁遇到这个都会这样。
 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)(104)
如果是01101000的话,可以表示正数104,但是表示不了正数360,因此,有符号数运算,没溢出,无符号数运算,溢出了。
整个汇编里,这个几乎是最令人晕头转向的。

#16


引用 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)
 
……


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

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

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

说白了,你就是不明白一点,CPU是不知道你希望这个数到底是有符号还是无符号的,或者说,你希望它的最高位是表示正负还是这个数的一部分,所以它只好把两种情况都考虑,把它当做有符号和无符号数时的两种计算结果都告诉你,通过CF和OF标志位。

#17


引用 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)……

我想知道计算机是怎么判断这两个数(只考虑有符号的情况,无符号的情况我能明白)相加之后是否要改变符号位的
。CF是取决于最高位相加之后有没有进位(我自己的理解,应该没错吧)。OF取决于哪儿呢??
在这儿先谢谢你的热心帮助,谢谢!

#18


引用 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……

我明白计算机里真正只有的只是0和1,计算机不知道是有符号还是无符号的,所以把两种情况都记录下,怎么用取决于程序员怎么设计。可是我现在搞不明白计算机是根据哪儿设置OF的,我的两个例子里,都有符号位的改变,和进位。计算机是怎么区分是否要改变OF的呢?

#19


你确定你的两个例子都溢出了?其中一个溢出了,另一个没溢出。计算机在计算的时候会有两个答案,一个是有符号的,一个是无符号的,虽说两个答案都是一个值。你现在不是不明白,只是脑子转不过来弯,我保证你停一个星期再考虑这个问题一定豁然开朗

#20


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

#21


引用 19 楼 simbon 的回复:
你确定你的两个例子都溢出了?其中一个溢出了,另一个没溢出。计算机在计算的时候会有两个答案,一个是有符号的,一个是无符号的,虽说两个答案都是一个值。你现在不是不明白,只是脑子转不过来弯,我保证你停一个星期再考虑这个问题一定豁然开朗

这两个例子是第一个溢出,第二个没溢出。我知道啊。可是不明白计算机是根据什么设置OF的,最底层的。

#22


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

你可以参考这个,这是个人经验,官方并没有这样解释过,但是说的却很有道理

#23


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

明白了,这就是我找的答案。十分感谢!!!可是这么确定OF的原理是什么啊,我想了一下,可是想不大明白。

#24


引用 22 楼 simbon 的回复:
引用 20 楼 jerry_ye601 的回复:

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

你可以参考这个,这是个人经验,官方并没有这样解释……

好的,确实可以确定。有道理就可以了。真是太感谢你了。顺便问一下,你明白这样确定OF的道理是什么吗?

#25


这个我不知道,加我QQ吧,我也喜欢汇编,我们一起找答案好了
QQ:1285870280

#26


好吧,知道的差不多了。结贴了,谢谢各位的大力支持!!!!!

#27


学习了,牛逼啊

#1


求救大神哪。。。

#2


逻辑结果是104,不是120,我错了。可是还是不明白啊

#3


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

#4


引用 3 楼 simbon 的回复:
mov al,0F0H (-16)
add al,78H (120)
OF只对有符号数运算有意义,CF对无符号数运算有意义
上面的如果是有符号数运算的话,结果al = 104,无符号数运算al = 120
因此,进行无符号数运算时,溢出了,CF=1,对于有符号数运算时,没溢出,OF=0


学习了

#5


这个得好好学学

#6


引用 3 楼 simbon 的回复:
mov al,0F0H (-16)
add al,78H (120)
OF只对有符号数运算有意义,CF对无符号数运算有意义
上面的如果是有符号数运算的话,结果al = 104,无符号数运算al = 120
因此,进行无符号数运算时,溢出了,CF=1,对于有符号数运算时,没溢出,OF=0

我知道逻辑上时这样,可是
  1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗
我现在不明白的是OF使根据哪儿确定改不改变啊

#7


无符号数: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) + 88H(-120) = 78H(-136)

376超出了8位数所能表示的范围
-136也超出了8位书所能表示的范围,因此有符号数与无符号数元算时,都产生溢出

#8


of是溢出标志如果符号位也就是最高位的值发生了改变,就设置该位

#9


没有溢出自然就为0了

#10


引用 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……

我知道是这个理,但我不知道计算机是怎么工作的,是不是根据符号位是否改变来设置的,是的话,
  1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗。
不是的话,那是怎么设置OF的啊

#11


引用 8 楼 xujinzhao 的回复:
of是溢出标志如果符号位也就是最高位的值发生了改变,就设置该位

 mov al,0F0H (-16)
 add al,78H (120)
 就是:
  1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗

#12


额我有错了,

mov al,0F0H (-16)
add al,78H (120)
  是:
  1111,0000
+ 0111,1000
= 0110,1000
最高位的1+1后,超了啊,OF不用该为1吗

#13


恩,我也不大明白,只知道原理上是超了-128~127,OF就是1

#14


我问个对比的例子吧

 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,且发生了进位(假设),而结果不一样。计算机是执行时是怎样区分的呢。工作原理是什么?

#15


只是一时脑子转不过来弯罢了,谁遇到这个都会这样。
 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)(104)
如果是01101000的话,可以表示正数104,但是表示不了正数360,因此,有符号数运算,没溢出,无符号数运算,溢出了。
整个汇编里,这个几乎是最令人晕头转向的。

#16


引用 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)
 
……


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

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

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

说白了,你就是不明白一点,CPU是不知道你希望这个数到底是有符号还是无符号的,或者说,你希望它的最高位是表示正负还是这个数的一部分,所以它只好把两种情况都考虑,把它当做有符号和无符号数时的两种计算结果都告诉你,通过CF和OF标志位。

#17


引用 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)……

我想知道计算机是怎么判断这两个数(只考虑有符号的情况,无符号的情况我能明白)相加之后是否要改变符号位的
。CF是取决于最高位相加之后有没有进位(我自己的理解,应该没错吧)。OF取决于哪儿呢??
在这儿先谢谢你的热心帮助,谢谢!

#18


引用 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……

我明白计算机里真正只有的只是0和1,计算机不知道是有符号还是无符号的,所以把两种情况都记录下,怎么用取决于程序员怎么设计。可是我现在搞不明白计算机是根据哪儿设置OF的,我的两个例子里,都有符号位的改变,和进位。计算机是怎么区分是否要改变OF的呢?

#19


你确定你的两个例子都溢出了?其中一个溢出了,另一个没溢出。计算机在计算的时候会有两个答案,一个是有符号的,一个是无符号的,虽说两个答案都是一个值。你现在不是不明白,只是脑子转不过来弯,我保证你停一个星期再考虑这个问题一定豁然开朗

#20


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

#21


引用 19 楼 simbon 的回复:
你确定你的两个例子都溢出了?其中一个溢出了,另一个没溢出。计算机在计算的时候会有两个答案,一个是有符号的,一个是无符号的,虽说两个答案都是一个值。你现在不是不明白,只是脑子转不过来弯,我保证你停一个星期再考虑这个问题一定豁然开朗

这两个例子是第一个溢出,第二个没溢出。我知道啊。可是不明白计算机是根据什么设置OF的,最底层的。

#22


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

你可以参考这个,这是个人经验,官方并没有这样解释过,但是说的却很有道理

#23


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

明白了,这就是我找的答案。十分感谢!!!可是这么确定OF的原理是什么啊,我想了一下,可是想不大明白。

#24


引用 22 楼 simbon 的回复:
引用 20 楼 jerry_ye601 的回复:

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

你可以参考这个,这是个人经验,官方并没有这样解释……

好的,确实可以确定。有道理就可以了。真是太感谢你了。顺便问一下,你明白这样确定OF的道理是什么吗?

#25


这个我不知道,加我QQ吧,我也喜欢汇编,我们一起找答案好了
QQ:1285870280

#26


好吧,知道的差不多了。结贴了,谢谢各位的大力支持!!!!!

#27


学习了,牛逼啊