mov ah,2 int 21h mov dl,?H?
;显示一个字母“H”
mov ah,2 int 21h pop dx pop cx ret
DIPASC endp HTOASC proc ;将AL低4位表达的一位16进制数转换为ASCII码 and al,0fh cmp al,9 jbe htoasc1 add al,37h ;是0AH~0FH,加37H转换为ASCII码 ret ;子程序返回 htoasc1: add al,30h ;是0~9,加30H转换为ASCII码 ret ;子程序返回 HTOASC
〔习题3.30〕
endp
写一个子程序,根据入口参数AL=0、1、2,依次实现对大写字母转换成小写、小写转换成大写或大小写字母互换。欲转换的字符串在string中,用0表示结束。 〔解答〕
lucase proc push bx mov bx,offset string cmp al,0 je case0 cmp al,1 jz case1 cmp al,2 jz case2 jmp done
case0: cmp byte ptr [bx],0 je done cmp byte ptr [bx],?A? jb next0
25
cmp byte ptr [bx],?Z? ja next0 add byte ptr [bx],20h next0: inc bx jmp case0
case1: cmp byte ptr [bx],0 je done cmp byte ptr [bx],?a? jb next1 cmp byte ptr [bx],?z? ja next1 sub byte ptr [bx],20h next1: inc bx jmp case1
case2: cmp byte ptr [bx],0 je done cmp byte ptr [bx],?A? jb next2 cmp byte ptr [bx],?Z? ja next20 add byte ptr [bx],20h jmp next2
next20: cmp byte ptr [bx],?a? jb next2 cmp byte ptr [bx],?z? ja next2 sub byte ptr [bx],20h next2: inc bx jmp case2 done: pop bx ret
lucase endp
〔习题3.31〕
子程序的参数传递有哪些方法,请简单比较。 〔解答〕
26
〔习题3.32〕
采用堆栈传递参数的一般方法是什么,为什么应该特别注意堆栈平衡问题。 〔解答〕
〔习题3.33〕
编写一个求32位数据补码的子程序,通过寄存器传递入口参数。 〔解答〕 方法1:
neg32 proc ;入口参数:DX.AX=32位有符号数 neg ax ;实现0-DX.AX功能
neg dx
sbb dx,0 ;这条指令也可以用dec dx代替
ret
neg32 endp ;出口参数:DX.AX=32位有符号数的补码 方法2:
neg32 proc ;入口参数:DX.AX=32位有符号数 not ax ;实现DX.AX求反加1 not dx add ax,1 adc dx,0 ret
neg32 endp ;出口参数:DX.AX=32位有符号数的补码
〔习题3.34〕
编写一个计算字节校验和的子程序。所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。主程序提供入口参数,有数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口参数。传递参数方法自定。 〔解答〕
;数据段 array db 12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h ;数组 count equ $-array ;数组元素个数 result db ? ;校验和 ;代码段 mov bx,offset array ;BX←数组的偏移地址 mov cx,count ;CX←数组的元素个数 call checksum ;调用求和过程
27
mov result,al ;处理出口参数
mov ax,4c00h int 21h
;计算字节校验和的通用过程
;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数 ;出口参数:AL=校验和
;说明:除AX/BX/CX外,不影响其他寄存器
checksum proc xor al,al ;累加器清0 sum: add al,[bx] ;求和 inc bx ;指向下一个字节 loop sum ret checksum endp end
〔习题3.35〕
编制3个子程序把一个16位二进制数用4位16进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。
? 采用AX寄存器传递这个16位二进制数 ? 采用temp变量传递这个16位二进制数 ? 采用堆栈方法传递这个16位二进制数 〔解答〕
?
.model small .stack .data
wdata dw 34abh .code .startup mov ax,wdata call dispa .exit 0 ; dispa proc push cx push dx
28
相关推荐: