第11章检测实验及笔记
图是个帮助记忆的好东西,做成桌面天天看。本帖最后由 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
次高位也进了位,但没溢出{:10_243:} 本帖最后由 yundi 于 2016-1-14 14:46 编辑
有意思的cmp指令,通过它修改标志位,配合je,jne,jb,jnb,ja,jna,让计算机有了“逻辑思维”。书上有详细说明,自己再推导一遍,加深印象。
cmp al,bl之后,根据标志位的值可以作出如下判断:
1.
ZF=1 =>(al)-(bl)=0 =>必然al=bl,无论有无符号也不管其它标志位多少
ZF=0 =>(al)-(bl)!=0 =>必然al!=bl
2.1
CF=1=>有进借位,必然ZF=0,al!=bl。
如果是无符号的则必然(al)<(bl)。
如果是有符号的呢?①0xxxxxxx - 1xxxxxxx 有借位,(al)>(bl) ②1xxxxxxx-0xxxxxxx无借位,(al)<(bl)③10xxxxxx-11xxxxxxe 有借位,10111111b(-65)<11111111b(-1),所以有符号的要另想办法。也正印证书上那句:CF是对无符号数运算有意义的标志位!
2.2
CF=0=>无进借位,分两种:ZF=0和ZF!=0,一种必然(al)=(bl),另一种必然(al)>(bl),也就是说单看CF=0 则必然 (al)>=(bl)。
3.分析有符号的看OF和SF
3.1 OF=0 SF=1
3.2 OF=0 SF=0
OF=0不溢出说明结果是准确结果,SF=1结果为负,则是小数-大数,必然(al)<(bl); SF=0结果为非负(不是为正),必然(al)>=(bl)
3.3 OF=1 SF=1
3.4 OF=1 Sf=0
OF=1溢出,说明结果不准确,正负与真实正好相反(这个结论凭感觉,没证明,有点心虚),所以SF=1时(al)>(bl),SF=0时(al)<(bl) 本帖最后由 yundi 于 2016-1-15 10:08 编辑
本章的实验题,写一个子程序,将0结尾的字符串中小写字母转为大写。觉得比前面的练习简单多了。
assume cs:codesg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
codesg segment
begin:
mov ax,datasg
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21h
letterc:
push cx
xor ch,0
s1:
mov cl,byte ptr ds:
jcxz ok;cx=0跳出循环并返回
;这里判断ascii范围
; 97<=cl<=122转换为大写
;小于97跳下次循环
cmp cl,97
jb next
;大于122跳下次循环
cmp cl,122
ja next
;期间的转换,某位置0
and cl,11011111b
mov byte ptr ds:,cl
next: inc si
jmp short s1
ok: pop cx
ret
codesg ends
end begin
说得好好
页:
[1]