.
mov dh,string[si] ;第6个字符送dh寄存器:mov dl,stirng[5] (2)解答:
xor si,si ;si清零 mov al,buffer[si] ;第一字节 inc si
mov ah,buffer[si] ;第二字节 mov cl,4
shl ah,cl ;BCD码移到高半字节 or al,ah ;组合成压缩BCD码 mov dl,al ;存入dl寄.. inc si
mov al,buffer[si] ;第三字节 inc si
mov ah,buffer[si] ;第四字节 mov cl,4
shl ah,cl ;BCD码移到高半字节 or al,ah ;组合成压缩BCD码 mov dh,al ;存入dh寄.. (3)解答:
test dx,0f000h ; test dh,0f0h jz next ; jnz next mov ax,-1 ; mov ax,0 jmp again
next: mov ax,0 ; mov ax,0ffffh again: ... (4)解答:
mov ax, word ptr buffer1
sub ax, word ptr buffer2 ;先减低16位 mov dx, word ptr buffer1+2
sbb dx, word ptr buffer2+2 ;后减高16位,需减低16位的借位
- 13 -页
.
(5)解答:
mov ax,0b800h
mov ds,ax ;段地址 xor si,si ;地址偏移量si=0 xor dx,dx ;和的高字dx=0 mov cx,99 ;加的次数 mov ax,[si] ;第一个数 again: inc si ;指向下一个字单元 inc si
add ax,[si] ;加下一个数 jnc noc ;无进位转 inc dx ;有进位dx=dx+1 noc: dec cx ;次数-1 jnz cx,again ;非0继续加 (6)解答1:不使用串操作指令(更好) mov si,offset string
mov cx,8000h ; 32k=2^15=8000h
again: cmp byte ptr [si], ‘$’ ;‘$’ =24h jnz next ; 不要采用 jz 进行分支
mov byte ptr [si], ‘ ’ ;‘ ’=20h next: inc si
loop again ; dec cx ; jnz again (6)解答2:使用串操作指令 mov di,offset string mov al,’$’ mov cx,8000h cld
- 14 -页
.
again: scasb jnz next
mov byte ptr es : [di-1], ‘ ’
next: loop again (7)解答1:
mov si,offset array mov cx,100 again: dec byte ptr [si] inc si loop again (7)解答2:
xor si,si ; si<--0 mov cx,100 ; 循环次数 again: dec array[si] inc si loop again (7)解答3:
mov si,offset array mov di,si mov ax,ds mov es,ax mov cx,100 cld again: lodsb dec al stosb loop again (8)解答:
xor si,si ;si<--0
- 15 -页
.
coun: cmp string[si],'$' je done inc si jmp coun
done: ...
〔习题2.25〕对下面要求,分别给出3种方法,每种方法只用一条指令。
(1)使CF=0 (2)使AX=0 (3)同时使AX=0和CF=0 〔解答〕 (1)解答: clc and ax,ax or ax,ax (2)解答: xor ax,ax and ax,0 mov ax,0 (3)解答: and ax,0 xor ax,ax sub ax,ax
〔习题2.26〕参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态。其中CALL前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代码的字节数为3,段间直接调用指令则为5个字节。
〔解答〕
主程序转子suba时段内调用:断点1为2000h:0400h+3, 转子是只将IP压栈。
suba转子subb时段间调用:断点2为2000h:0840h+5, 转子时须将cs段地址和IP压栈 suba转子subc时段内调用:断点3为2000h:0c021h+3,转子是只将IP压栈。 注:压栈时先修改sp再压入断点,弹栈时先弹出断点再修改sp。
〔习题2.27〕已知AX 、BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。
add al,bl
- 16 -页