页眉 ADD AX,BX ...... RET SUBPR ENDS
若被另一代码段中的过程调用呢?
答:被同一代码段中的过程调用时,过程定义的结束语句中有错误,应改为SUBPR ENDP 若被另一代码段中的过程调用时,过程定义的开始和结束语句中都有错误,应改为: SUBPR PROC FAR PUSH AX ADD AX,BX ...... RET SUBPR ENDP
19.试编制程序,对NUM中各数分别统计出有多少个20,余下有多少个5,再余下有多少个2,再余下有多少个1。 统计的各数分别存放在NUM20,NUM5,NUM2,NUM1的对应位置中,程序要求用主程序子程序形式编制,而且用两种参量传递方法分别编制主程序和子程序)数据段如下:
DATA SEGMENT
NUM DW 0133H,005FH,1234H COUNT EQU ($-NUM)/TYPE NUM NUM20 DB COUNT DUP(0) NUM5 DB COUNT DUP(0) NUM2 DB COUNT DUP(0) NUM1 DB COUNT DUP(0) DATA ENDS 答:所求程序为: DATA SEGMENT
NUM DW 0133H,005FH,1234H COUNT EQU ($-NUM)/TYPE NUM NUM20 DB COUNT DUP(0) NUM5 DB COUNT DUP(0) NUM2 DB COUNT DUP(0) NUM1 DB COUNT DUP(0) DATA ENDS code segment
assume cs:code, ds:data start: mov ax, data mov ds, ax mov cx, const mov si, 0
lop: mov ax, num[si] div 20 mov bh, ah
mov num20[si], al
36 / 44
页眉 xor ax, ax mov al, bh div 5
mov bh, ah
mov num5[si], al xor ax, ax mov al, bh div 2
mov num1[si], ah mov num2[si], al add si, 2 loop lop mov ah, 4ch int 21h code ends
end start
*20.在数据区有一九九乘法表,(Line1~Line9),乘数和被乘数分别在Var1,Var2的字单元中。试编制一程序,用查表法求出乘积:Var1*Var2 。 第八章习题与参考答案
1.分别编制子程序,完成AAA,DAA,AAS,DAS的指令功能。 答:①完成AAA指令功能的子程序为: subprog segment push bx push cx push dx pushf pop bx
and bl,10h jnz lab1 and al,0fh cmp al,9 jle lab2 lab1: add al,6 inc ah pushf pop bx or bx,10h push bx popf
lab2:and al,0fh pushf pop bx mov dx,bx and dx,10h
37 / 44
mov cl,4 shr dx,cl and bx,0feh
or bx,dx
push bx popf pop dx pop cx pop bx ret subprog endp
②完成DAA指令功能的子程序为:subprog segment push bx push dx pushf pop bx
and bl,10h jnz lab1 mov bl,al and bl,0fh cmp bl,9 jle lab2 lab1: add al,6 pushf pop bx or bx,10h push bx popf lab2:jc lab3 mov bl,al and bl,0f0h cmp bl,90h jle lab4 lab3: add al,60h stc lab4: pop dx pop bx ret subprog endp
③完成AAS指令功能的子程序为:subprog segment push bx push cx
页眉 38 / 44
push dx pushf pop bx
and bl,10h jnz lab1 and al,0fh cmp al,9 jle lab2 lab1: sub al,6 dec ah pushf pop bx or bx,10h push bx popf
lab2:and al,0fh pushf pop bx mov dx,bx and dx,10h mov cl,4 shr dx,cl and bx,0feh
or bx,dx
push bx popf pop dx pop cx pop bx ret subprog endp
④完成DAS指令功能的子程序为:subprog segment push bx push dx pushf pop bx
and bl,10h jnz lab1 mov bl,al and bl,0fh cmp bl,9 jle lab2 lab1: sub al,6
页眉 39 / 44
页眉 pushf pop bx or bx,10h push bx popf lab2:jc lab3 mov bl,al and bl,0f0h cmp bl,90h jle lab4 lab3: sub al,60h stc lab4: pop dx pop bx ret subprog endp
2.试编制一程序,实现十个一位十进制数的累加,最后累加和以非压缩形式存放在AH(高位)和AL(低位)中。 答:所求程序为: dseg segment
data db 7,5,8,5,9,4,7,5,7,3 dseg ends code segment
assume cs:code,ds:dseg sta:mov ax,dseg mov ds,ax
mov si,offset data mov cx,10 mov ax,0 clc
lop:addc ax,[si] aaa
inc si loop lop mov ah,4ch int 21h code ends end sta
3.判断下列指令书写是否正确,如有错误,指出错在何处? (1)REP CMPSW (2)REPZ MOVSB (3)SCAS [DI] (4)STOS (5)LODSB (6)REP STOS [SI]
答:(1)REP CMPSW 错,CMPSW不能加前缀REP,只能和REPZ、REPNZ连用;
(2)REPZ MOVSB错,MOVSB不能加前缀REPZ,只能和REP连用 (3)SCAS [DI] 错,指令中未明确表明是字节操作还是字操作。
40 / 44