[匯編] 十進制與十六進制互轉


 

 

  1 ;程序設計的要求:通過鍵盤給一個四位的16進制數,程序把它轉換成10進制數,並顯示出來。
  2 ;把輸入的4位16進制數以10十進制的值存放到變量num中,注意num可能會有5位數。所以下面
  3 ;就通過÷,%(10000,1000,100,10)來得到每一位數,即十進制數.  
  4 ;相同的道理,把num轉換為16進制
  5 DSEG SEGMENT
  6     ;數據段:在此處添加程序所需的數據
  7     num dw ?
  8     arr dw 10 dup(?) 
  9     STRING1  DB  '[choce 0 (dec->hex) or 1 (hex->dec)]:$'      
 10     STRING2  DB  '[input a hex number which must be four digits]:$'
 11     STRING3  DB  '[input a dec number which must be four digits]:$'
 12 DSEG ENDS 
 13 
 14 CSEG SEGMENT
 15 ;***************************************************************************
 16 MAIN PROC FAR          ;主程序入口 
 17     assume  cs:CSEG, ds:DSEG          
 18 ;---------------------------------------------------------------------------
 19 chose:   
 20     mov ax, DSEG
 21     mov ds, ax
 22     mov es, ax
 23 
 24     lea dx, STRING1
 25     mov ah, 9
 26     int 21h         ; output string at ds:dx 
 27     
 28     mov ah, 01h     ;鍵盤輸入並回顯,AL=input char
 29     int 21h
 30     cmp al,30h      ;和'0'比較
 31     je  start2      ;轉到10-16進制入口
 32     cmp al,31h      ;和'1'比較
 33     je  start1      ;轉到16-10進制入口  
 34     call change     ;換行,重新選擇
 35     jmp chose       ;輸入錯誤,讓其重新輸入
 36 ;---------------------------------------------------------------------------
 37 start1:             ;4位16進制轉10進制,入口
 38        call change     ;自動換行
 39        
 40     lea dx, STRING2
 41     mov ah, 9
 42     int 21h         ; output string at ds:dx 
 43     
 44     mov num, 0
 45     mov cx, 4        ;輸入4位16進制數(這里沒有處理少於或多於4位的情況)
 46 L1:    mov ah, 01h     ;鍵盤輸入並回顯,AL=input char
 47     int 21h
 48     push cx         ;保護cx
 49     mov cl, 4
 50     shl num, cl        ;輸入的數以10進制的形式存到num中[邏輯左移4位,SHL OPR,CNT 前一個不能是操作數,后一個為CL寄存器]
 51     pop cx
 52 
 53     cmp al, 3ah     ;<9直接al-'0'擴展->num->bx
 54     jb s1
 55     cmp al,47h      ;9< <G  [小寫的大於大寫的]
 56     jb x1 
 57     sub al,20h      ;小寫的比大寫的多減去20h
 58 x1:    sub al, 7h
 59 s1:    sub al, 30h
 60     mov ah, 0
 61     add num, ax
 62     mov bx, num
 63     loop L1  
 64 solve1:
 65     call change     ;自動換行
 66     call fun1        ;調用主函數
 67     call change
 68     jmp  chose
 69     call exit        ;退出
 70 ;--------------------------------------------------------------------------     
 71 start2:   
 72     call change     ;自動換行
 73        
 74     lea dx, STRING3
 75     mov ah, 9
 76     int 21h         ; output string at ds:dx 
 77     
 78     mov num, 0
 79     mov cx, 4        ;輸入4位16進制數(這里沒有處理少於或多於4位的情況)
 80 L2:    mov ah, 01h     ;鍵盤輸入並回顯,AL=input char
 81     int 21h
 82     push cx         ;保護cx  
 83     push ax
 84     mov cx,10d  
 85     mov ax,num      ;字乘法:(dx,ax)=ax*src
 86     mul cx
 87     mov num,ax      ;把ax給num  
 88     pop ax
 89     pop cx
 90 s2:    sub al, 30h     ;輸入轉換為數字-'0'
 91     mov ah, 0
 92     add num, ax
 93     mov bx, num
 94     loop L2  
 95     jmp  solve2
 96 solve2:
 97     call change     ;自動換行
 98     call fun2        ;調用主函數
 99     call change
100     jmp  chose
101     call exit        ;退出     
102 ;******************************************************************************;
103 MAIN ENDP   
104 
105 fun1 proc           ;被除數放在dx中
106     mov cx, 10000d    ;把除數存放到cx中
107     call dec_div
108 
109     mov cx, 1000d
110     call dec_div
111     
112     mov cx, 100d
113     call dec_div
114     
115     mov cx, 10d
116     call dec_div
117     
118     mov cx, 1d
119     call dec_div
120     ret
121 fun1 endp        
122 
123 dec_div     proc    ;除法實現,除數為cx的值
124     mov ax, bx
125     mov dx, 0
126     div cx          ;div 無符號:div src 16位操作:商ax=(dx,ax)/src,余數dx
127     mov bx, dx
128     mov dl, al
129 
130     add dl, 30h     ;轉換為char並顯示
131     mov ah, 02h
132     int 21h
133     ret
134 dec_div    endp 
135 ;------------------------------------------------------------------------
136 fun2 proc           ;被除數放在dx中
137     mov cx,1000h    ;把除數存放到cx中
138     call hex_div
139 
140     mov cx,0100h
141     call hex_div
142     
143     mov cx,0010h
144     call hex_div
145     
146     mov cx,0001h
147     call hex_div
148     
149     ret
150 fun2 endp        
151 
152 hex_div     proc    ;除法實現,除數為cx的值
153     mov ax, bx
154     mov dx, 0
155     div cx          ;div 無符號:div src 16位操作:商ax=(dx,ax)/src,余數dx
156     mov bx, dx
157     mov dl, al
158     
159     cmp dl, 10d     ;和10比   >=10
160     jb show 
161     add dl,7h       ;>=10的情況
162 show:
163     add dl, 30h     ;轉換為char並顯示
164     mov ah, 02h
165     int 21h
166     ret
167 hex_div    endp
168 ;*************************************************************************************************
169 ;回車換行
170 change     proc
171     push ax
172     mov ah, 02h
173     mov dl, 0ah
174     int 21h
175     mov ah, 02h
176     mov dl, 0dh
177     int 21h
178     pop ax
179     ret
180 change    endp
181 ;*************************************************************************************************
182 ;退出
183 exit    proc
184     ;按任意鍵退出
185     mov ah,1
186     int 21h
187     mov ax, 4c00h  ;程序結束,返回到操作系統
188     int 21h
189 exit    endp
190 ;*************************************************************************************************
191 END MAIN   
192 CSEG ENDS

 

 


免責聲明!

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



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