assume cs:cseg, ds:dseg
dseg segment
msg0 db 0dh, 0ah, 'Input Hex Number(<=FFFF):$'
msg1 db 0dh, 0ah, 'Output Decimal value:$'
msg2 db 0dh, 0ah, 'Input is invalid, reinput again:$'
buf db 10
db 0
db 10 dup(0)
n dw 0
f db 0
dseg ends
cseg segment
start:
mov ax, dseg
mov ds, ax
lea si, n
m0:
call readhex ;调用读取输入数据函数
cmp f, 0 ;f>0,输入有错误,重新输入
ja m0
lea dx, msg1 ;显示输出
mov ah,9
int 21h
mov ax, n ;10进制
call printdec ;输出
mov ah,4ch
int 21h
;read hex number(max FFFF)
;store to (si) 保存到(si)
readhex proc near
mov f, 0 ;读取成功标志位, 0-成功,非0,失败
lea dx, msg0 ;显示
mov ah, 9 ;输入
int 21h ;提示信息
lea dx, buf ;读取
mov ah, 10 ;输入
int 21h ;字符串
mov ch,buf+1 ;判断输入长度,>4,错误
cmp ch, 4
ja error
mov cl,4 ;
mov bx, 0 ;
r0: ;r0- error
mov ah, 0 ;判断输入的每一个字符
mov al, [buf+2+bx] ;合法,就进行计算(r9中计算)
cmp al, '0' ;否则,就显示
jb error ;错误提示,重新输入(error)
cmp al, '9'
ja r1
and al,0fh
jmp r9
r1:
cmp al,'A'
jb error
cmp al, 'F'
ja r2
sub al, 37H
jmp r9
r2:
cmp al,'a'
jb error
cmp al, 'f'
ja error
sub al,57H
jmp r9
r9:
xchg [si], ax
shl ax, cl
add [si], ax
inc bx
dec ch
jnz r0
jmp exit
error:
lea dx, msg2
mov ah, 9
int 21h
mov f, 1
exit:
ret
readhex endp
;print (ax) in Decimal
printdec proc near
xor cx, cx
mov bx, 10
q0:
xor dx, dx
div bx
xor dx, 0e30h
push dx
inc cx
cmp ax, 0
jnz q0
q1:
pop ax
int 10h
loop q1
ret
printdec endp
cseg ends
end start