| 
 | 
 
 
 楼主 |
发表于 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
 
  复制代码 
次高位也进了位,但没溢出    |   
 
 
 
 |