汇编语言程序设计——分支结构例7
设计目标
十进制与十六进制转换。将键盘输入的一个两位十进制数以十六进制形式显示在屏幕上。可多次输入直到按下 ESC 键。
设计思路
(1)用 DOS 的 1 号功能输入一个两位数,以回车结束;
(2)将输入的数字减去 30H 保存在 X 单元,第 1 个数字扩大 10 倍再与第 2 个数相加,变为十进制数;
(3)用 9 号功能显示提示信息;
(4)将十进制数除以 16,形成十六进制数;
(5)再将十六进制数转换为 ASCII 码,用 2 号功能显示。
;5-7.asm 可多次输入一个两位十进制数并以十六进制显示出来,按ESC键退出。
data segment
x db 2 dup(?)
mess1 db 0dh,0ah,'decimal=$'
mess2 db 0dh,0ah,'HEX=$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
let0:
mov x,0
mov x+1,0
mov si,0
mov dx,offset mess1 ;显示提示1
mov ah,9
int 21h
let1:
mov ah,1 ;键盘输入十进制数
int 21h
cmp al,27 ;是ESC键?
jz out1 ;是,退出
cmp al,0dh ;回车?
jz let2 ;是,转let2
and ax,000fh ;去掉ASCII码
mov x[si],al ;保存到x
inc si ;统计输入的位数
jmp let1
let2:
mov dx,offset mess2 ;显示提示2
mov ah,9
int 21h
cmp si,1 ;判断输入的位数
ja let3 ;输入了两位数转let3
mov bl,x
mov cl,1
jmp let5 ;只输入1位数则直接去显示
let3:
mov al,x
mov cl,10
mul cl ;形成两位十进制数
add al,x+1
mov ah,0
mov bl,16 ;除以16,转换为十六进制
div bl
mov bx,ax ;AH为余数即低位,AL为商即高位
;分别显示十六进制高位、低位
mov cl,2
let4:
cmp bl,10 ;判断十六进制数码
jl let5
add bl,7 ; ≥10 则加7(是字母A~F)
let5:
add bl,30h ;加上ASCII码
mov dl,bl
mov ah,2 ;显示
int 21h
mov bl,bh ;再去显示低位
dec cl
jnz let4
jmp let0 ;返回let0继续输入
out1:
mov ah,4ch
int 21h
code ends
end start
运行结果: