计算两个数之和并输出

键盘输入两个一位十进制数(有提示输入),
编程计算他们的和,
并将结果分别以二进制、十进制和十六进制的形式显示到CRT上。

data segment
	mess1 	db "please input the first number to sum:", 0dh,0ah,'$'
	mess2 	db "please input the second number to sum:", 0dh,0ah,'$'
	bmess	db "Binary result:", 0dh,0ah,'$'
	dmess	db "decimal result:", 0dh,0ah,'$'
	hmess	db "hexadecimal result:", 0dh,0ah,'$'
	sum	db 0	;存放两个数的和
	num1 	db 0 	;分别存放两个数
	num2 	db 0
data ends
code segment
   assume cs:code,ds:data,es:data
start:	mov ax,data
	mov ds,ax
	;打印字符串1
	mov dx,offset mess1
	mov ah,9
	int 21h
	;输入第一个数
	mov ah,1		;输入的数被送去al寄存器
	int 21h
	;输入4--34
	sub al, 30h	;输入的数减去30h为真实的数
	mov num1, al
	;换行
	mov ah,2
	mov dl,0ah
	int 21h
	mov ah,2
	mov dl,0dh
	int 21h
	;打印字符串2
	mov dx,offset mess2
	mov ah,9
	int 21h
	;输入第二个数
	mov ah,1		;输入的数被送去al寄存器
	int 21h
	sub al, 30h	;输入的数为ASCII码,减去30h为真实的数
	mov num2, al
	
	;计算2个数的和
	mov al, num1
	mov bl, num2
	add al, bl
	mov sum, al

	;换行
	mov ah,2
	mov dl,0ah
	int 21h
	mov ah,2
	mov dl,0dh
	int 21h


binary:
	mov dx,offset bmess
	mov ah,9
	int 21h
	mov cl, 8		;循环次数
	;bl:11h
	;sum:11
	mov bl, sum
next1:
	mov dl, 0

	rol bl, 1		;循环左移一位,移出为送入CF
	;bl:11->22
	adc dl, 30h	;进位加法,需要加上CF的值
	mov ah, 2
	int 21h
	dec cl
	jnz next1
	;换行
	mov ah,2
	mov dl,0ah
	int 21h
	mov ah,2
	mov dl,0dh
	int 21h

decimal:
	mov dx,offset dmess
	mov ah,9
	int 21h
	;重新计算2个数的和。菜单栏的 int 21h 把 af 标志位初始化了,所以daa无法正确转化18d对应的12h(在计算9+9计算错误)
	mov al, num1
	mov bl, num2
	;al:08
	add al, bl
	mov sum, al
	;al:11h(8h+9h=11h)
	mov al, sum

	;说明例子:
	;MOV AL, 43H
	;MOV BL, 29H
	;ADD AL, BL ;AL=6BH,其不是压缩型的BCD码,因为低四位'B'不是BCD码
	;DAA ;调整后,AL=72H,这是压缩型的BCD码,也有:43+29=72
	
	daa		;压缩型BCD码,能够转换成十进制
	;al:11h->17
	;只可能是2位数
	mov bl, al		;暂存
	mov cl, 4
	;al:00010111b(17h)->00000001(1h)
	shr al, cl		;算术右移四位,得到第一位数,如果为零不输出
	;al:10->01
	jz next2
	add al, 30h	;计算之后需要加上48(30h)输出	
	mov dl, al
	mov ah, 2
	int 21h
next2:
	;bl:17->07
	and bl, 0fh	;bl与0F进行逻辑与运算得到第二位数
	add bl, 30h	;+30才能输出
	mov dl, bl
	mov ah, 2
	int 21h
	;换行
	mov ah,2
	mov dl,0ah
	int 21h
	mov ah,2
	mov dl,0dh
	int 21h

;两个数的和没有进行十进制强制转换命令daa,其结果为十六进制数
hexadecimal:	
	;sum:11
	mov dx,offset hmess
	mov ah,9
	int 21h
	mov al, sum
	mov bl, al		;bl暂存
	mov cl, 4
	shr al, cl		;算术右移四位,得到第一位数,如果为零不输出
	jz next3
	add al, 30h	; 
	mov dl, al
	mov ah,2
	int 21h
next3:
	;'0'-'9': +30h, 'a'-'f': +37h输出
	and bl, 0fh
	cmp bl, 0ah	;如果比10小,直接跳转到num,+30输出。前面要加0
	jb num
	add bl, 37h
	mov dl, bl
	mov ah, 2
	int 21h
	jmp exit
num:
	add bl, 30h
	mov dl, bl
	mov ah, 2
	int 21h
	jmp exit


exit:	mov	ah, 4cH		;否则,返回DOS
		int	21H
	code	ends
		end	start

扩展:做一个菜单,选1,2,3,4分别输出及退出)

data segment
	menu    db "1 print decimal", 0dh,0ah ;定义菜单
		db "2 print hexadecimal", 0dh,0ah
		db "3 print binary", 0dh,0ah
		db "4 exit", 0dh,0ah,'$'
	msg1 db "please input first number:",0dh,0ah,'$'
	msg2 db "please input second number:",0dh,0ah,'$'
	num1 db 0 ;分别存放两个数及它们的和
	num2 db 0
	sum db 0
data ends
code segment
	assume cs:code, ds:data, es:data
start:
	mov ax, data
	mov ds, ax
	
	mov dx, offset msg1
	mov ah, 9
	int 21h
	;输出please input first number:

	mov ah, 1
	int 21h
	;输入第一个数

	sub al, 30h
	;把ascii码转化为数值放回al 30h为0

	mov num1, al
	mov dl, 0ah
	mov ah, 2
	int 21h
	;输出换行

	mov dl, 0dh
	mov ah, 2
	int 21h
	

	mov dx, offset msg2
	mov ah, 9
	int 21h

	mov ah, 1
	int 21h
	;输入第二个数

	sub al, 30h
	mov num2, al
	
	mov al, num1
	mov bl, num2	
	add al, bl
	mov sum, al
	;计算两个数的和
 
	mov dl, 0ah
	mov ah, 2
	int 21h

	mov dl, 0dh
	mov ah, 2
	int 21h

	;打印菜单
	mov dx,offset menu
	mov ah,9
	int 21h

	mov ah,8
	int 21h
	;输入1 2 3 4并判断
	cmp al,'1'
	jz decimal
	cmp al,'2'
	jz hexadecimal
	cmp al,'3'
	jz binary
	jmp exit
;输出十进制
decimal:	
	mov al, sum
	daa ;强制十进制转换,BCD码
	mov bl, al ;暂时存放数字
	mov cl, 4
	shr al, cl ;算术右移四位,得到第一位数,如果为零不输出
	jz next1
	;算术右移四位,得到第一位数,如果为零不输出

	add al, 30h
	mov dl, al
	mov ah,2
	int 21h
next1:
	and bl, 0Fh ;bl与0F进行逻辑与运算得到第二位数
	add bl, 30h
	mov dl, bl
	mov ah, 2
	int 21h
	jmp exit
 
;输出十六进制,两个数的和没有进行十进制强制转换命令daa,其结果为十六进制数
hexadecimal:	
	mov al, sum
	mov bl, al
	mov cl, 4
	shr al, cl
	jz next2
	add al, 30h
	mov dl, al
	mov ah,2
	int 21h
next2:
	and bl, 0Fh
	cmp bl, 0Ah
	jb num
	add bl, 37h
	mov dl, bl
	mov ah, 2
	int 21h
	jmp exit
num:
	add bl, 30h
	mov dl, bl
	mov ah, 2
	int 21h
	jmp exit
 
;输出二进制
binary:
	mov cl, 8 ;设置循环的次数
	mov bl, sum
next3:
 
	mov dl, 0
	rol bl, 1 ;循环左移一位,移出为送入CF
	adc dl, 30h ;进位加法,需要加上CF的值
	mov ah, 2
	int 21h
	dec cl
	jnz next3
	jmp exit
 
exit:
	mov ah, 4ch
	int 21h
code ends
	end start
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值