问题:键盘输入两个一位十进制数(有提示输入),编程计算他们的和,并将结果分别以二进制、十进制和十六进制的形式显示到CRT上。(扩展:做一个菜单,选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
mov ah, 1
int 21h
sub al, 30h
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
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