汇编语言程序设计——模块与子程序例4
设计目标
将键入的两个十进制数相加,并显示十进制结果。
设计思路
(1)主程序调用三个子程序。主程序用 JMP 构成循环,可多次做计算;如果按下的不是数字键则退出循环,结束程序;
(2)SUBR1 子程序 1:功能为键盘输入,数字键 ASCII 码 → 十进制数(该十进制数保存为二进制),用存储单元 X 传参;
(3)SUBR2 子程序 2:功能为两数相加,以寄存器 BX 传参;
(4)SUBR3 子程序 3:功能为显示十进制数。先将二进制数→十进制数。将传参寄存器 BX 中的二进制数用除以 10 取余数的方法转换为十进制数,再将余数加 30H 变为十进制数的 ASCII 码,然后显示。
;7-7.asm 寄存器、存储器传参。键入两个十进制数相加,并显示十进制结果。
data segment
x dw ?,?
cc1 db 0ah,0dh,'x1=$'
cc2 db 0ah,0dh,'x2=$'
cc3 db 0ah,0dh,'y=x1+x2=$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
;主程序
main proc far
mov cx,0
mov bx,0
mov si,0
mov dx,offset cc1 ;显示提示1
mov ah,9
int 21h
call subr1 ;输入第1个数
mov dx,offset cc2 ;显示提示2
mov ah,9
int 21h
mov bx,0
mov cx,0
mov si,2
call subr1 ;输入第2个数
call subr2 ;相加
mov dx,offset cc3 ;显示提示3
mov ah,9
int 21h
call subr3 ;显示结果
jmp main
out1: ;结束
mov ah,4ch
int 21h
main endp
;子程序1:键盘输入、数字键ASCII码→十进制数(以二进制保存)
subr1 proc near
mov ah,1 ;键盘输入十进制数
int 21h
cmp al,0dh ;回车?
jz exit
cmp al,'0' ;其它字符?
jl out1 ;是其它字符转out1,退出,结束。
cmp al,'9'
jg out1
and ax,000fh ;形成十进制数(以二进制保存)
xchg ax,bx
mov cx,10
mul cx ;乘以10 → 十位、百位
add bx,ax
jmp subr1
exit:
cmp cx,0 ;先键入了回车,退出
jz out1
mov x[si],bx ;存储单元x传参
ret
subr1 endp
;子程序2,两数相加
subr2 proc near
mov bx,x
add bx,x+2 ;寄存器BX传参
ret
subr2 endp
;子程序3,显示十进制数。将二进制数→十进制数
subr3 proc near
mov ax,bx
mov cx,0
mov bx,10 ;将ax变为十进制数
let1:
mov dx,0
inc cx
idiv bx ;除以10,取余数
push dx ;保存余数
cmp ax,0
jnz let1
let2: ;显示结果
pop ax ;将余数弹入ax
add ax,0030h ;余数调整为ascii码
mov dl,al
mov ah,2 ;显示
int 21h
loop let2
ret
subr3 endp
code ends
end start
运行结果: