最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

8086系列(20):十六进制到十进制的转换程序

互联网 admin 6浏览 0评论

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

结果

发布评论

评论列表 (0)

  1. 暂无评论