汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-09-15 08:24] 习题4.32

图片载入中
请编写一个实现多种进制(十六进制、十进制、八进制和二进制)转换的小工具。适用于小范围内的整数。

答:

;----------------------------------------------------;
assume        cs:code,ds:data,ss:stack
data        segment
msg1        db        'Choice digit type:[1]Hex [2]Dec [3]Oct [4]Bin:$'
msg2        db        'Input switch type:[1]Hex [2]Dec [3]Oct [4]Bin:$'
msg3        db        'Input :$'
msg4        db        'Result:$'
var1        db        0
var2        db        0
buff        db        16 dup (0)
error        db        'Invalid number or Out of compass !$'
tab1        dw        10000,1000,100,10,1 ;用于转换十进制
tab2        dw        4096,512,64,8,1     ;用于转换八进制
tab3        dw        8000h,4000h,2000h,1000h,800h,400h,200h,100h,80h,
                40h,20h,10h,8h,4h,2h,1h ;用于转换二进制
sum        dw        0
data        ends
stack        segment stack     ;定义栈段
        dw 128 dup (0)
stack        ends
code        segment
start:
        mov ax,data       ;定义数据段
        mov ds,ax

        mov dx,offset msg1 ;显示信息
        mov ah,9           ;
        int 21h
        mov ah,1           ;接受输入并检查输入是否合法
        int 21h
        cmp al,0dh
        jz _err
        cmp al,'1'
        jb _err
        cmp al,'4'
        ja _err
        mov var1,al        
        call crlf

        mov dx,offset msg2 ;提示信息
        mov ah,9
        int 21h
        mov ah,1           ;接受输入并检查输入是否合法
        int 21h
        cmp al,0dh
        jz _err
        cmp al,'1'
        jb _err
        cmp al,'4'
        ja _err        
        mov var2,al
        call crlf           ;回车
        mov dx,offset msg3  ;提示信息
        mov ah,9
        int 21h
;检查输入,并作出相应处理
        cmp var1,31h  ;处理十六进制
        jz inhex
        cmp var1,32h  ;处理十进制
        jz indec
        cmp var1,33h  ;处理八进制
        jz inoct
        cmp var1,34h  ;处理二进制
        jz inbin
        jmp _err
;检查十六进制输入

inhex:        
        mov cx,4
        mov di,offset buff
_inhex:
        mov ah,1
        int 21h
        cmp al,0dh
        jz none
        cmp al,'0'
        jb _err
        cmp al,'9'
        ja d
;        sub al,30h
        jmp jx1
d:        
        cmp al,'A'
        jb _err
        cmp al,'F'
        ja x
;        sub al,37h
        jmp jx1
x:        
        cmp al,'a'
        jb _err
        cmp al,'f'
        ja _err
;        sub al,57h
jx1:        
        mov [di],al
        inc di
        dec cx
        jcxz ol1
        jmp _inhex
ol1:
        jmp a2h
;检查十进制输入

indec:        
        mov si,0
        mov cx,5
        mov di,offset buff
_indec:
        mov ah,1
        int 21h
        cmp al,0dh
        jz ol2
        cmp al,'0'
        jb _err
        cmp al,'9'
        ja _err
        sub al,30h
        mov [di],al
        inc di
        inc si
        dec cx
        jcxz ol2
        jmp _indec
ol2:
        jmp d2h
;检查八进制输入

inoct:        
        mov si,0
        mov cx,5
        mov di,offset buff
_inoct:
        mov ah,1
        int 21h
        cmp al,0dh
        jz ol3
        cmp al,'0'
        jb _err
        cmp al,'8'
        ja _err
        sub al,30h
        mov [di],al
        inc di
        inc si
        dec cx
        jcxz ol3
        jmp _inoct
ol3:
        jmp o2h
;检查二进制输入

inbin:        
        mov si,0
        mov cx,16
        mov di,offset buff
_inbin:
        mov ah,1
        int 21h
        cmp al,0dh
        jz ol4
        cmp al,'0'
        jb _err
        cmp al,'1'
        ja _err
        sub al,30h
        mov [di],al
        inc di
        inc si
        dec cx
        jcxz ol4
        jmp _inbin
ol4:
        jmp b2h        

;开始将输入的ascii码转换成BCD
;保存十六进制
a2h:
        mov cx,12
        mov si,offset buff
        xor dx,dx
load:        
        mov al,[si]
        cmp al,0
        jz ok1
        inc si
        cmp al,40h
        jb sz
        cmp al,47h
        jb zd
        cmp al,67h
        jb zx
sz:        
        sub al,30h
        mov ah,0
        shl ax,cl
        add dx,ax
        sub cx,4
        jmp a2hjx
zd:
        sub al,37h
        mov ah,0
        shl ax,cl
        add dx,ax
        sub cx,4
        jmp a2hjx
zx:        
        sub al,57h
        mov ah,0
        shl ax,cl
        add dx,ax
        sub cx,4
a2hjx:        
        cmp cx,0fffch
        jz ok1
        jmp load
ok1:        push dx
        jmp show
;十进制转十六进制

d2h:                
        mov bx,offset buff
        add bx,si
        dec bx
        mov di,offset tab1
        add di,8
        mov cx,si        
shijia:        
        mov al,[bx]
        xor ah,ah
        mul word ptr [di]
        add sum,ax
        jc _err
        sub di,2
        dec bx
        loop shijia
        push word ptr sum
        jmp show
;八进制转十六进制

o2h:
        mov bx,offset buff
        add bx,si
        dec bx
        mov di,offset tab2
        add di,8
        mov cx,si
bajia:        
        mov al,[bx]
        xor ah,ah
        mul word ptr [di]
        add sum,ax
        jc _err
        sub di,2
        dec bx
        loop bajia
        push word ptr sum
        jmp show
;二进制转十六进制

b2h:
        mov bx,offset buff
        add bx,si
        dec bx
        mov di,offset tab3
        add di,30
        mov cx,si
erjia:
        mov al,[bx]
        xor ah,ah
        mul word ptr [di]
        add sum,ax
        jc _err
        sub di,2
        dec bx
        loop erjia
        push word ptr sum
        jmp show
;开始显示

show:        call crlf
        mov dx,offset msg4 ;提示信息
        mov ah,9
        int 21h
        cmp var2,31h       ;输入的是十六进制
        jz _hex
        cmp var2,32h       ;输入的是十进制
        jz _dec
        cmp var2,33h       ;输入的是八进制
        jz _oct
        cmp var2,34h       ;输入的是二进制
        jz _bin
_hex:                           ;显示十六进制结果
        pop dx
        call disphex
        jmp over
_dec:                           ;显示十进制结果
        pop dx
        call dispdec
        jmp over
_oct:                           ;显示八进制结果
        pop dx
        call dispoct
        jmp over
_bin:                      ;显示二进制结果
        pop dx
        call dispbin
        jmp over
        
none:        
        cmp si,0
        jz over
_err:        call crlf
        mov dx,offset error
        mov ah,9
        int 21h

over:        mov ah,4ch
        int 21h
;子程序
;回车
crlf        proc
        mov ah,2
        mov dl,0dh
        int 21h
        mov dl,0ah
        int 21h
        ret
crlf        endp
;错误信息
err        proc
        mov dx,offset error
        mov ah,9
        int 21h
        ret
err        endp
;显示嘻嘻
disp        proc
        mov dx,offset msg4
        mov ah,9
        int 21h
        ret
disp        endp

;显示十六进制数
;input:dx
disphex        proc uses dx
        mov cx,4
d1:        push cx
        mov cl,4
        rol dx,cl
        push dx
        and dx,0fh
        cmp dl,10
        jb d10
        add dl,37h
        mov ah,2
        int 21h
        jmp jx2
d10:        add dl,30h
        mov ah,2
        int 21h
jx2:        pop dx
        pop cx
        loop d1
        mov dl,'H'
        mov ah,2
        int 21h
        call crlf
        ret
disphex        endp

;显示十进制数
;input:dx
dispdec        proc uses dx
        mov ax,dx
        xor dx,dx
        mov bx,10
        mov cx,0
d2:        cmp ax,10
        jb ok2
        div bx
        add dl,30h
        push dx
        xor dx,dx
        inc cx
        jmp d2
ok2:        add al,30h
        push ax
        inc cx
d3:        pop dx
        mov ah,2
        int 21h
        loop d3
        mov dl,'D'
        mov ah,2
        int 21h
        call crlf
        ret
dispdec        endp

;显示八进制数
;input:dx
dispoct        proc uses dx
        mov bx,8
        mov cx,0
        mov ax,dx
        xor dx,dx
d3:        cmp ax,8
        jb ok3
        div bx
        add dl,30h
        push dx
        xor dx,dx
        inc cx
        jmp d3
ok3:        add al,30h
        push ax
        inc cx
d4:        pop dx
        mov ah,2
        int 21h
        loop d4
        mov dl,'Q'
        mov ah,2
        int 21h
        call crlf
        ret
dispoct        endp

;显示二进制数
;input:dx
dispbin        proc 
        mov cx,16
        mov ax,dx
        xor dx,dx
d5:        rol ax,1
        adc dl,0
        push ax
        add dl,30h
        mov ah,2
        int 21h
        xor dx,dx
        pop ax
        loop d5
        mov dl,'B'
        mov ah,2
        int 21h
        ret
dispbin        endp

code        ends
end        start
;----------------------------------------------------;
评论次数(0)  |  浏览次数(1129)  |  类型(汇编习题集) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码