[汇编] 十进制和十六进制数之间的转换

时间:2022-01-10 00:57:43

刚接触汇编,很多细节搞得还不是很清楚,写了一个十进制和十六进制之间相互转换的程序(有点挫。。)就当练手了。

贴出代码,希望路过的大牛可以给一些指导。

思路:(10->16)十进制数输入的时候单个字符处理,遇见回车结束输入,最后得到一个十进制数。然后循环左移(只处理4次),取后四位,也就是相当于/16

最后输出字符。(16->10)类似处理,先转换成10进制数(每次*16),最后依次取出每一位输出。

; multi-segment executable file template.

data segment
    ; add your data here!  
    num dw 0
    string1 db  'please choose  1 (dec->hex) or 2 (hex->dec)]:$'
    inputDec db 'please input a Dec number :$'
    inputHex db 'please input a Hex number :$'

ends

stack segment
    dw   128  dup(0)
ends

code segment 

start:
 ;set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax  
    
 ;-------------选择模式------------------ 
 model:
    lea dx, string1
    mov ah,9
    int 21h
    
    mov ah,1
    int 21h
    sub al,30h
    cmp al,1 
    mov cx,10  ;乘10
    jz  option1
    call CRLF  
    
    cmp al,2 
    mov cx,16
    jz option2
    call CRLF  
    jmp model  
 ;----------------------------------------
  
 ;***********十进制转十六进制*****************
 
 
 ;-----------输入一个十进制数-------------
 option1: 
    call CRLF
    lea dx,inputDec
    mov ah,9
    int 21h
 rotate1:
    mov ah,1
    int 21h
    cmp al,0dh  ;回车结束十进制数的输入
    jz DectoHex
    sub al,30h
    cbw
    push ax
    mov ax,bx
    mul cx 
    mov bx,ax
    pop ax
    add bx,ax ;输入结果保存在bx中
    jmp rotate1
  ;-----------------------------------------
   
  ;---------开始转换(10->16)------------- 
 DectoHex: 
    call CRLF
    mov ch,4 
 rotatecur:
    mov cl,4
    rol bx,cl
    mov al,bl
    and al,0fh
    add al,30h
    cmp al,3ah
    jl print1
    add al,7h
 print1:
   mov dl,al
   mov ah,2
   int 21h
   dec ch
   jnz rotatecur 
   
   call exit 
 ;**************十六进制转十进制******************* 
 
 ;-------------输入一个十六进制数------------------  
 option2: 
    call CRLF
    lea dx,inputHex
    mov ah,9
    int 21h
 rotate2:
    mov ah,1
    int 21h
    cmp al,0dh  ;回车结束十六进制数的输入
    jz HextoDec  
     
    sub al,30h
    cmp al,9
    jg Other  
 L:
    cbw
    push ax
    mov ax,num
    mul cx 
    mov num,ax
    pop ax
    add num,ax ; 输入结果保存在num中
    jmp rotate2  
    
 Other: 
    sub al,7h
    jmp L
 HextoDec: 
     call  CRLF
     mov cx,1000 
     ;----------重复的输出代码。。。-----
     mov ax, num
     mov dx, 0
     div cx
     mov num, dx
     mov dl, al

     add dl,30h
     mov ah,02h
     int 21h  
     ;--------------------
     mov cx,100
      ;----------
     mov ax, num
     mov dx, 0
     div cx
     mov num, dx
     mov dl, al

     add dl,30h
     mov ah,02h
     int 21h  
     ;----------
     mov cx,10
     ;----------
     mov ax, num
     mov dx, 0
     div cx
     mov num, dx
     mov dl, al

     add dl,30h
     mov ah,02h
     int 21h  
     ;----------
     mov cx,1
      ;----------
     mov ax, num
     mov dx, 0
     div cx
     mov num, dx
     mov dl, al

     add dl,30h
     mov ah,02h
     int 21h  
     ;----------
     
     call exit 
    
     
;----------取每一位------------------

;-----------------------------------

 
 ;--------回车换行------------------   
  CRLF proc near
          push ax
          push dx
          pushf
          
          mov dl,0dh;回车
          mov ah,2
          int 21h
          
          mov dl,0ah;换行
          mov ah,2
          int 21h
          
          popf
          pop dx
          pop ax
          
          ret
   CRLF endp   
  ;-----------------------------------------
    
  ;-----------------退出---------------------
  exit proc
    mov ax, 4c00h ; exit to operating system.
    int 21h  
  exit endp 
  ;------------------------------------------     
  
  

  
ends

end start ; set entry point and stop the assembler.