data segment
data ends
stack segment stack
dw 100 dup (?)
top label word
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
mov bx,0
mov cx,4 ;最多输入4位16进制数
L1:
mov ah,7 ;用7号功能输入,不回显
int 21h
cmp al,0dh ;回车,跳转到输出bx,如果没有输入就回车,bx=0
je exit
cmp al,30h ;输入的字符小于30h,重新输入
jb L1
cmp al,39h ;输入的字符大于39h,到L2继续判断合法性
ja L2
mov dl,al ;0-9合法输入,回显
mov ah,2
int 21h
sub dl,30h ;输入的0-9要减30h才能变成ASCII码0-9
push cx ;保护cx
mov cl,4
rol bx,cl ;bx左移4位
add bl,dl ;bx低八位bl加上dl
pop cx ;还原cx
dec cx
cmp cx,0 ;cx=0跳转到输出bx,否则继续输入
je exit
jmp L1
L2:
cmp al,41h ;输入的字符小于41h(A),重新输入
jb L1
cmp al,46h ;输入的字符大于46h(F),到L3继续判断合法性
ja L3
mov dl,al ;A-F合法输入,回显
mov ah,2
int 21h
sub dl,37h ;输入的A-F要减37h才能变成ASCII码10-15
push cx
mov cl,4
shl bx,cl
add bl,dl
pop cx
dec cx
cmp cx,0 ;cx=0跳转到输出bx,否则继续输入
je exit
jmp L1
L3:
cmp al,61h ;输入的字符小于61h(a),重新输入
jb L1
cmp al,66h ;输入的字符大于66h(f),重新输入
ja L1
mov dl,al ;a-f合法输入,回显
mov ah,2
int 21h
sub dl,57h ;输入的a-f要减57h才能变成ASCII码10-15
push cx
mov cl,4
shl bx,cl
add bl,dl
pop cx
dec cx
cmp cx,0 ;cx=0跳转到输出bx,否则继续输入
je exit
jmp L1
;以16进制输出bx
exit:
;回车换行
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
mov cx,4 ;输出4位16进制数
L4:
push cx
mov cl,4
rol bx,cl
mov dl,bl
and dl,0fh ;屏蔽高4位
cmp dl,9
ja L5
add dl,30h ;0-9
jmp print
L5:
add dl,37h ;A-F
print:
mov ah,2
int 21h
pop cx
loop L4
mov ah,4ch
int 21h
main endp
code ends
end main