|

楼主 |
发表于 2016-1-12 15:23:42
|
显示全部楼层
本帖最后由 yundi 于 2016-1-15 08:54 编辑
做题时觉得模糊的地方:
1.- mov al,11111111b
- add al,1
复制代码
错答:结果是100000000b,所以PF=0(结果有1个1),ZF=0(结果不为0)。
正解:结果指的是al中的值,00000000b,所以PF=1,ZF=1,进位改变CF的值。
2.书中提到CF、OF易混淆,果然做题时出错,用自己的理解讲一次
CF进位标志:很容易理解,add al,bl ,没有符号位,al,bl8位全参与运算,结果超过8位时,CF标为1
OF溢出标志:同样是add al,bl,但al,bl的最高位表示符号,不参与运算,那么就有一种情况,al+bl的次高位向最高位(符号位)进位,导致结果超出能表示的范围,这种情形称为溢出,OF标为1
举个栗子:- mov al,01000000
- add al,01000001
复制代码
当成是无符号,即64+65=10000001b,没有进位,所以CF=0;
但若是有符号,即(+64)+(+65)=10000001b=129?(-127)?,因为次高位向最高位(符号位)进位,结果超出范围,溢出,所以OF=1
3.计算机是如何知道溢出的,没想明白,最后百度到一个结果:
最高位进位值 XOR 次高位进位值 = 1 则 溢出,即最高位、次高位不是同时进位的,就是溢出。
下面是自己之前的思考过程,先留着,方便以后查看:
3.还是OF问题????
- mov al,01111111b
- mov bl,11111111b
- sub al,bl
复制代码
有符号数,人可以思考是127-(-1)=128,溢出了.但计算机如何知道是溢出了?它会知道自己的表示范围是-128~127,然后还会计算是否超出范围?
如果按位相减,除了符号位,其它都正好相减为0,溢出如何判断?
假设是看是否向最高位借位,那么下例
- mov al,00111111b
- mov bl,11111111b
- sub al,bl
复制代码
OF=1,但实际未溢出,OF=0。
我觉得可能是将减法转换成了加法然后,通过次高位进位来判断超出范围,
- mov al,01111111b;例1
- mov bl,00000001b
- add al,bl;OF=1
- mov al,00111111b;例2
- mov bl,00000001b
- add al,bl;OF=0
复制代码
晕了,上面的猜测还是错的- mov ax,0fff0h
- add ax,0010h
复制代码
次高位也进了位,但没溢出 |
|