mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx ret dispa endp ;
dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1: mov ah,2 int 21h pop ax ret dldisp endp end
(2)采用wordTEMP变量传递这个16位二进制数 .model small .stack .data
wdata dw 34abh wordtemp dw ? .code .startup
mov ax,wdata mov wordtemp,ax call dispa .exit 0 ;
dispa proc push cx push dx mov cl,4
mov dl,byte ptr wordtemp+1 shr dl,cl call dldisp
mov dl,byte ptr wordtemp+1
and dl,0fh call dldisp
mov dl,byte ptr wordtemp shr dl,cl call dldisp
mov dl,byte ptr wordtemp and dl,0fh call dldisp pop dx pop cx ret dispa endp ;
dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1: mov ah,2 int 21h pop ax ret dldisp endp end
(3)采用堆栈方法传递这个16位二进制数 .model small .stack .data
wdata dw 34abh .code .startup push wdata call dispa
pop ax ;add sp,2 .exit 0 ;
dispa proc push bp mov bp,sp push ax push cx push dx
mov ax,[bp+4]
mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx pop ax pop bp ret dispa endp ;
dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1: mov ah,2 int 21h pop ax ret dldisp endp end
〔习题4.30〕设有一个数组存放学生的成绩(0 ~ 100),编制一个子程序统计0 ~ 59分、60 ~ 69分、70 ~ 79分、80 ~ 89分、90 ~ 100分的人数,并分别存放到scoreE、scoreD、score C、score B及score A单元中。编写一个主程序与之配合使用。 〔解答〕
.model small .stack .data
score db 70,86,90,45,60,96,100,0,... ;全班成绩数组 count equ $-score ;总人数 scoreE db ? ;0--59分人数 scoreD db ? ;60--69分人数
scoreC db ? ;70--79分人数 scoreB db ? ;80--89分人数 scoreA db ? ;90--99分人数 .code .startup lea bx, score mov cx, count again:
mov al,[bx] ;取一个成绩 call tjrs ;调用统计分段人数 inc bx ;调整指针
loog again ;cx-cx-1,cx=0退出循环 .exit 0
tjrs proc ;统计分段人数 cmp al, 60
jae next0 ;al>= 60转
inc scoreE ;al<60,0--59分的人数加1 jmp next4 next0: cmp al, 70 jae next1 inc scoreD jmp next4 next1: cmp al, 80 jae next2 inc scoreC jmp next4 next2: cmp al, 90 jae next3 inc scoreB jmp next4 next3: inc scoreA next4: ret tjrs endp end
〔习题4.31〕编写一递归子程序,计算指数函数X n 的值。 〔解答〕 model small .stack .data x dw 5 n dw 6 zish dw ? .code
.startup mov bx,x push bx mov bx,n push bx mov bx,x call zshhsu pop zish add sp,2 .exit 0 zshhsu proc push bx push ax push bp mov bp,sp mov ax,[bp+8] cmp ax,0 jne zshhsu1 inc ax
jmp zshhsu2 zshhsu1: dec ax push bx push ax call zshhsu pop ax pop bx mul bx
zshhsu2: mov [bp+8],ax pop bp pop ax pop bx ret
zshhsu endp end