匯編語言16進制轉10進制


  使用8086匯編,輸入一個16進制的數,程序把該16進制數轉換為相應的10進制數輸出

  程序運行截圖:

  

  要實現這樣一個程序,思路可以是這樣的:

  1.由於我們讀入的鍵盤輸入是ASCII碼表示的,且輸入一個字符便得到一個ASCII碼,如輸入ab,程序中可以得到61h和62h。現在的問題是怎么把這些輸入的字符表示成一個完整的數。對於這個問題,我們可以把每次輸入的字符的ASCII碼先轉換為對應的數,0-9之間的數,根據ASCII碼表發現可以用 ASCII碼減30h 得到0-9對應的十六進制數值,對於a-b,用ASCII碼減57h 得到a-b對應的十六進制數值。

  2.得到這些對應的數值之后,要把它們按輸入順序組合起來,這里可以用移位運算來組合,如根據輸入轉換得 1、2兩個十六進制數值,1的二進制表示為0001,2的二進制表示為0010,把0001左移4位得到00010000,加上0010,得到0001010,00010010表示的便是12h。

  3.把輸入轉換為數值之后就准備要輸出了,可采用除10法得到各個位上的數,如要輸出110,先要把110轉為 1、1、0 再把對應的數值加上30h轉為ASCII碼后輸出,把110轉換為 1、1、0,110除以10商為11,余數為0,此時余數作為個位上的數,得到個位為0;再用上一步的商11作為被除數除以10,得到商為10,余數為1,此時余數作為十位上的數,得到十位為1;重復上述步驟,商1作為被除數除以10,商0余1,得到百位為1,此時商等於0,算法結束。

DATAS SEGMENT
    bin dw 10 dup(?)    ;存放二進制結果
    buf db 5 dup(?)      ;存放十進制數 各個數位上的數值 如100,存放為 1,0,0
    msg1 db 'please input a hex number',13,10,'$'
    msg2 db 'the dec number:',13,10,'$'
    crlf db 13,10,'$'    ;回車換行
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    
       mov bx,0        ;初始化bx
       
       LEA dx,msg1        ;輸出提示字符串
       mov ah,9
       int 21h
       
 input:
       mov ah,1        ;輸入一個字符
       int 21h
       
       sub al,30h        ;把al中的ascii碼轉換成數值
       jl init
   
       cmp al,10        ;輸入的數在0-9之間跳轉
       jl toBin
       
       sub al,27h        ;再轉換為a-f
       cmp al,0ah        ;輸入的字符比a小
       jl init            ;結束輸入
       cmp al,10h        ;輸入的字符比f大
       jge init        ;結束輸入
       
  toBin:            ;轉換為二進制,把輸入組合成意義上的數值
       mov cl,4        
       shl bx,cl        ;bx左移4位
       mov ah,0        
       add bx,ax        ;把輸入后並從ascii碼轉換來的值與bx相加
       mov bin,bx        ;轉換成二進制數后存到內存bin
       jmp input        ;繼續輸入
       
  init:                ;初始化,准備轉換
      mov ax,bin        
      mov bx,10        
      mov si,4        ;循環四次,最大到萬位
      
  toDec:            ;轉為各個數位上的數值,如100轉換為1,0,0 百位為1...
      mov dx,0        
      div bx            ;除10法得到各個位上的數值
      mov [buf+si],dl    ;余數為該位上的值,第一次循環為個位,第二次為十位...;存到內存中
      dec si            
      cmp ax,0        ;商是否為0,為0算法結束
      ja toDec
  

      lea dx,crlf            ;顯示提示
      mov ah,9
      int 21h
      lea dx,msg2
      mov ah,9
      int 21h
      
  output:                ;輸出內存中存放的各個數位上的數值
      inc si
      mov dl,[buf+si]
      add dl,30h            ;轉為ascii
      mov ah,2
      int 21h
      cmp si,4
      jb output
      
   
    mov ah,1
    int 21h
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START 

 

 

參考:百度文庫  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM