拿王爽的《汇编语言》中的一个讲解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
add al,78H (120)
OF只对有符号数运算有意义,CF对无符号数运算有意义
上面的如果是有符号数运算的话,结果al = 104,无符号数运算al = 120
因此,进行无符号数运算时,溢出了,CF=1,对于有符号数运算时,没溢出,OF=0
#4
学习了
#5
这个得好好学学
#6
我知道逻辑上时这样,可是
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位书所能表示的范围,因此有符号数与无符号数元算时,都产生溢出
有符号数: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
我知道是这个理,但我不知道计算机是怎么工作的,是不是根据符号位是否改变来设置的,是的话,
1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗。
不是的话,那是怎么设置OF的啊
#11
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吗
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,且发生了进位(假设),而结果不一样。计算机是执行时是怎样区分的呢。工作原理是什么?
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,因此,有符号数运算,没溢出,无符号数运算,溢出了。
整个汇编里,这个几乎是最令人晕头转向的。
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
因为那两个数都既可以看做有符号数,也可以看做无符号数。你如果把它看做有符号数,它的最高位就表示正负,为1时是负数,为0时是正数。如果你把它看做无符号数,那就没有符号位。
这你这个例子中,第一个
1111,0000(看做无符号数:240, 看做有符号数:-16)
+1000,1000(看做无符号数:136, 看做有符号数:-120)
无论看做有符号数还是无符号数,结果都溢出了。所以CF、OF都为1。
而第二个例子,看做有符号数时没有溢出,所以OF为0。
说白了,你就是不明白一点,CPU是不知道你希望这个数到底是有符号还是无符号的,或者说,你希望它的最高位是表示正负还是这个数的一部分,所以它只好把两种情况都考虑,把它当做有符号和无符号数时的两种计算结果都告诉你,通过CF和OF标志位。
#17
我想知道计算机是怎么判断这两个数(只考虑有符号的情况,无符号的情况我能明白)相加之后是否要改变符号位的
。CF是取决于最高位相加之后有没有进位(我自己的理解,应该没错吧)。OF取决于哪儿呢??
在这儿先谢谢你的热心帮助,谢谢!
#18
我明白计算机里真正只有的只是0和1,计算机不知道是有符号还是无符号的,所以把两种情况都记录下,怎么用取决于程序员怎么设计。可是我现在搞不明白计算机是根据哪儿设置OF的,我的两个例子里,都有符号位的改变,和进位。计算机是怎么区分是否要改变OF的呢?
#19
你确定你的两个例子都溢出了?其中一个溢出了,另一个没溢出。计算机在计算的时候会有两个答案,一个是有符号的,一个是无符号的,虽说两个答案都是一个值。你现在不是不明白,只是脑子转不过来弯,我保证你停一个星期再考虑这个问题一定豁然开朗
#20
F0H:11110000B
78H:01111000B
11110000B
+01111000B
-------------
101101000B
其中最高位进一对应于CF=1,而OF的值应当是最高位的进位(1)和次高位进位(1)的异或,所以所求得的值OF=0
明白了么?
78H:01111000B
11110000B
+01111000B
-------------
101101000B
其中最高位进一对应于CF=1,而OF的值应当是最高位的进位(1)和次高位进位(1)的异或,所以所求得的值OF=0
明白了么?
#21
这两个例子是第一个溢出,第二个没溢出。我知道啊。可是不明白计算机是根据什么设置OF的,最底层的。
#22
你可以参考这个,这是个人经验,官方并没有这样解释过,但是说的却很有道理
#23
明白了,这就是我找的答案。十分感谢!!!可是这么确定OF的原理是什么啊,我想了一下,可是想不大明白。
#24
好的,确实可以确定。有道理就可以了。真是太感谢你了。顺便问一下,你明白这样确定OF的道理是什么吗?
#25
这个我不知道,加我QQ吧,我也喜欢汇编,我们一起找答案好了
QQ:1285870280
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
add al,78H (120)
OF只对有符号数运算有意义,CF对无符号数运算有意义
上面的如果是有符号数运算的话,结果al = 104,无符号数运算al = 120
因此,进行无符号数运算时,溢出了,CF=1,对于有符号数运算时,没溢出,OF=0
#4
学习了
#5
这个得好好学学
#6
我知道逻辑上时这样,可是
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位书所能表示的范围,因此有符号数与无符号数元算时,都产生溢出
有符号数: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
我知道是这个理,但我不知道计算机是怎么工作的,是不是根据符号位是否改变来设置的,是的话,
1111,0000
+ 1000,1000
= 0111,1000
最高位的1+1后,超了啊,OF不用该为1吗。
不是的话,那是怎么设置OF的啊
#11
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吗
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,且发生了进位(假设),而结果不一样。计算机是执行时是怎样区分的呢。工作原理是什么?
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,因此,有符号数运算,没溢出,无符号数运算,溢出了。
整个汇编里,这个几乎是最令人晕头转向的。
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
因为那两个数都既可以看做有符号数,也可以看做无符号数。你如果把它看做有符号数,它的最高位就表示正负,为1时是负数,为0时是正数。如果你把它看做无符号数,那就没有符号位。
这你这个例子中,第一个
1111,0000(看做无符号数:240, 看做有符号数:-16)
+1000,1000(看做无符号数:136, 看做有符号数:-120)
无论看做有符号数还是无符号数,结果都溢出了。所以CF、OF都为1。
而第二个例子,看做有符号数时没有溢出,所以OF为0。
说白了,你就是不明白一点,CPU是不知道你希望这个数到底是有符号还是无符号的,或者说,你希望它的最高位是表示正负还是这个数的一部分,所以它只好把两种情况都考虑,把它当做有符号和无符号数时的两种计算结果都告诉你,通过CF和OF标志位。
#17
我想知道计算机是怎么判断这两个数(只考虑有符号的情况,无符号的情况我能明白)相加之后是否要改变符号位的
。CF是取决于最高位相加之后有没有进位(我自己的理解,应该没错吧)。OF取决于哪儿呢??
在这儿先谢谢你的热心帮助,谢谢!
#18
我明白计算机里真正只有的只是0和1,计算机不知道是有符号还是无符号的,所以把两种情况都记录下,怎么用取决于程序员怎么设计。可是我现在搞不明白计算机是根据哪儿设置OF的,我的两个例子里,都有符号位的改变,和进位。计算机是怎么区分是否要改变OF的呢?
#19
你确定你的两个例子都溢出了?其中一个溢出了,另一个没溢出。计算机在计算的时候会有两个答案,一个是有符号的,一个是无符号的,虽说两个答案都是一个值。你现在不是不明白,只是脑子转不过来弯,我保证你停一个星期再考虑这个问题一定豁然开朗
#20
F0H:11110000B
78H:01111000B
11110000B
+01111000B
-------------
101101000B
其中最高位进一对应于CF=1,而OF的值应当是最高位的进位(1)和次高位进位(1)的异或,所以所求得的值OF=0
明白了么?
78H:01111000B
11110000B
+01111000B
-------------
101101000B
其中最高位进一对应于CF=1,而OF的值应当是最高位的进位(1)和次高位进位(1)的异或,所以所求得的值OF=0
明白了么?
#21
这两个例子是第一个溢出,第二个没溢出。我知道啊。可是不明白计算机是根据什么设置OF的,最底层的。
#22
你可以参考这个,这是个人经验,官方并没有这样解释过,但是说的却很有道理
#23
明白了,这就是我找的答案。十分感谢!!!可是这么确定OF的原理是什么啊,我想了一下,可是想不大明白。
#24
好的,确实可以确定。有道理就可以了。真是太感谢你了。顺便问一下,你明白这样确定OF的道理是什么吗?
#25
这个我不知道,加我QQ吧,我也喜欢汇编,我们一起找答案好了
QQ:1285870280
QQ:1285870280
#26
好吧,知道的差不多了。结贴了,谢谢各位的大力支持!!!!!
#27
学习了,牛逼啊