汇编语言程序设计——模块与子程序例4

汇编语言程序设计——模块与子程序例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

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值