8086系列(20):十六进制到十进制的转换程序
题目
十六进制到十进制的转换程序(通过寄存器传送变量),要求从键盘上输入0-FFFFH的十六进制正数转化为十进制数并在屏幕上显示出来。
思路
先写主程序框架,首先需要把输入的十六进制数(字符串)转化为二进制数存在bx中,然后将bx中的数十进制显示。
代码
;-------十六进制到十进制--------
datasg segment
datasg ends
;----------------
codesg segment
main proc far
assume cs:codesg,ds:datasg,es:datasg
start:
push ds
xor ax,ax
push ax
mov ax,datasg
mov ds,ax
mov es,ax
;------------------
rep:
call hexibin ;16-2
call binidec ;2-10
call crlf
call crlf
ret
;------------------
main endp
;------------hexibin----------
;----通过寄存器bx传递参数------
hexibin proc near
mov bx,0 ;bx为输入的十进制数
newchar:
mov ah,01
int 21h
sub al,30h ;0-10
jl exit
cmp al,10d
jl add_to
sub al,27h ;a(61h) - f(66h) a (31h-21h=0ah=10d)
cmp al,0ah ;<10
jl exit
cmp al,10h ;>16
jge exit
add_to:
mov cl,4
shl bx,cl ;存放到bx中
mov ah,0
add bx,ax
jmp newchar
exit:
ret
hexibin endp
;-----------------------------
;-----------binidec-----------
binidec proc near
mov cx,10000d ;万位 2^16 = 65536
call dec_div
mov cx,1000d ;千位
call dec_div
mov cx,100d ;百位
call dec_div
mov cx,10d ;十位
call dec_div
mov cx,1d ;个位
call dec_div
ret
binidec endp
dec_div proc near
mov ax,bx ;(dx,ax) / bx = ax, dx
mov dx,0
div cx
mov bx,dx ;余数给dx
mov dl,al
add dl,30h
mov ah,02
int 21h
ret
dec_div endp
;-------------------------------
;------------crlf---------------
crlf proc near
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
ret
crlf endp
codesg ends
end start
结果
8086系列(20):十六进制到十进制的转换程序
题目
十六进制到十进制的转换程序(通过寄存器传送变量),要求从键盘上输入0-FFFFH的十六进制正数转化为十进制数并在屏幕上显示出来。
思路
先写主程序框架,首先需要把输入的十六进制数(字符串)转化为二进制数存在bx中,然后将bx中的数十进制显示。
代码
;-------十六进制到十进制--------
datasg segment
datasg ends
;----------------
codesg segment
main proc far
assume cs:codesg,ds:datasg,es:datasg
start:
push ds
xor ax,ax
push ax
mov ax,datasg
mov ds,ax
mov es,ax
;------------------
rep:
call hexibin ;16-2
call binidec ;2-10
call crlf
call crlf
ret
;------------------
main endp
;------------hexibin----------
;----通过寄存器bx传递参数------
hexibin proc near
mov bx,0 ;bx为输入的十进制数
newchar:
mov ah,01
int 21h
sub al,30h ;0-10
jl exit
cmp al,10d
jl add_to
sub al,27h ;a(61h) - f(66h) a (31h-21h=0ah=10d)
cmp al,0ah ;<10
jl exit
cmp al,10h ;>16
jge exit
add_to:
mov cl,4
shl bx,cl ;存放到bx中
mov ah,0
add bx,ax
jmp newchar
exit:
ret
hexibin endp
;-----------------------------
;-----------binidec-----------
binidec proc near
mov cx,10000d ;万位 2^16 = 65536
call dec_div
mov cx,1000d ;千位
call dec_div
mov cx,100d ;百位
call dec_div
mov cx,10d ;十位
call dec_div
mov cx,1d ;个位
call dec_div
ret
binidec endp
dec_div proc near
mov ax,bx ;(dx,ax) / bx = ax, dx
mov dx,0
div cx
mov bx,dx ;余数给dx
mov dl,al
add dl,30h
mov ah,02
int 21h
ret
dec_div endp
;-------------------------------
;------------crlf---------------
crlf proc near
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
ret
crlf endp
codesg ends
end start