汇编语言程序设计——模块与子程序例1
重点:子程序结构,子程序的调用与返回
设计目标
多次输入一个 65535 以内的十进制数并以十六进制显示出来。按 ESC 键结束。
设计思路
(1)设主程序标号 LET0,一个子程序标号为 LET1,另一个子程序标号 LET2;
(2)主程序是一个死循环,只有当按下 ESC 键时才能退出、结束程序;
(3)子程序 LET1 功能为键盘输入,并把输入的数字变为十进制数,保存在 X 单元;
(4)子程序 LET2 功能为通过查表将 X 单元中的数值用十六进制显示出来。
程序框图:
7-1.asm
;7-1.asm 用子程序多次输入一个65535以内的十进制数并以十六进制显示出来。按ESC键结束
data segment
x dw 0
mess1 db 0dh,0ah,'input dec=$'
mess2 db 0dh,0ah,'out HEX=$'
hex db '0123456789ABCDEF'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
;主程序
let0: mov x,0
mov dx,offset mess1 ;显示提示1
mov ah,9
int 21h
call let1 ;调用子程序1
call let2 ;调用子程序2
jmp let0
;子程序1:键盘输入、形成十进制数x
let1:
mov ah,1 ;键盘输入十进制数
int 21h
cmp al,27 ;是ESC键?
jz out1
sub al,30h ;其它字符? 30H=48
jl exit ;是,ASCII小于48为其他字符,转exit
cmp al,9 ;大于9为其他字符
jg exit ;转exit
mov ah,0
xchg ax,x ;形成十进制数
mov cx,10
mul cx ;(AX)<-(AL)*(CX)
add x,ax ;相加并保存
jmp let1
exit: ret ;ret返回主程序
;子程序2:查表,显示十六进制
let2:
mov dx,offset mess2 ;显示提示2
mov ah,9
int 21h
mov bx,x ;将x→bx
mov ch,4
mov cl,4 ;将bx中的二进制数循环左移4位(十六进制数循环左移1位)
rept1:
rol bx,cl ;例如0021→0210→2100→1002→0021
mov ax,bx
and ax,000fh ;保留最低4位
mov si,ax
mov dl,hex[si] ;查表显示十六进制数
mov ah,2
int 21h
dec ch ;显示下一位
jnz rept1
ret ;返回主程序
out1:
mov ah,4ch
int 21h
code ends
end start
运行结果:
分析程序得知, 子程序调用 CALL 指令应该和子程序返回 RET 指令成对出现,使用了 CALL 指令,子程序中一定要有 RET 返回指令。本例中程序结构清晰,各个子程序功能相对独立,程序运行灵活。
参考书籍:《汇编语言(第 2 版)》郑晓薇 编著,机械工业出版社