键盘输入两个一位十进制数(有提示输入),
编程计算他们的和,
并将结果分别以二进制、十进制和十六进制的形式显示到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