【彙編】進制轉換程序

 

 原文地址:http://blog.sina.com.cn/s/blog_664ffc6b0100z539.htmlhtml

 

設計內容函數

1.從鍵盤輸入一個很多於8位的十進制數(如12345678),把其分別轉換成二進制、八進制、十六進制數顯示在屏幕上。oop

2.從鍵盤輸入一個很多於5位的十六進制數(如1FED5H),把其分別轉換成二進制、八進制、十進制數顯示在屏幕上。ui

思路spa

1.本程序應用分支程序功能實現菜單選擇操做,在主程序中經過帶參數的調用子函數,來完成部分功能的實現。設計

2.子程序decin:實現十進制的輸入功能,設一個計數器,保存輸入字符的個數,由於輸入的是十進制數,對其輸入進行了嚴格的審覈,防止出現亂碼的狀況,採用了帶參數調用能夠使得更改存放內存時的方便code

3.子程序hexin:實現了十六進制的輸入功能,相似decin,對其存入進行了相應的調整,使得存入的就是輸入的字符orm

4.子程序turn:實現了將存儲單元中的元素進行了倒置存入,本子程序是爲了能直接調用子程序dextobin而設計的xml

5.子程序dectohex:實現了十進制到十六進制的轉換,本子程序應用了書本上用除法將十進制轉換爲十六進制的計算htm

6.子程序hextodec:實現了十六進制到十進制的轉換,本子程序移位的方法實現乘法運算,應用堆棧對寄存器沒法保存的多位數字進行存取,實現大於四位數的運算

7.子程序hextobin:實現了十六進制到二進制的轉換,經過將十六進制移位,直接判斷該位是0或是1,直接存儲,利用的是數在計算機內都是以二進制代碼存儲的機制

8.子程序bintooct:實現了二進制到八進制的轉換,利用二進制與八進制的關係,三位二進制爲一位八進制,則由低位開始取三位進行計算,便可獲得八進制

本程序不只應用到了循環與分支程序、子程序結構,還用到了高級彙編語言技術宏彙編,是對整個課程的所學的實踐,也是對整個課程的一次總結。

程序

  1 crlf    macro
  2          lea     dx,crl
  3          mov  ah,09h
  4          int     21h
  5          endm
  6 Emess        macro
  7          lea     dx,error
  8          mov  ah,09h
  9          int     21h
 10          endm
 11 data   segment
 12 menu db     'Choose to perform an operation!',10,13
 13          db     '0.Quite',10,13
 14          db     '1.Base Number:Decimal number',10,13
 15          db     '2.Base Number:Hexadecimal number',10,13,'$'
 16 mess10       db     'Please input a decimal Number:','$'
 17 mess2         db     'Its corresponding binary number:','$'
 18 mess8         db     'Its corresponding octal number:','$'
 19 mess0         db     'Its corresponding decimal number:','$'
 20 mess6         db     'Its corresponding hexadecimal number:','$'
 21 mess16       db     'Please input a hexadecimal Number:','$'
 22 error  db     'Error Input,please enter a new number!!!',10,13,'$'
 23 crl     db     10,13,'$'
 24 bina   db     33 dup(?)
 25 octa   db     11 dup(?)
 26 decim         db     20 dup(?)
 27 hexad          db     8 dup(?)
 28 hexad0        db     8 dup(?)
 29 hexad1        db     8 dup(?)
 30 count0        db     ?
 31 count1        db     ?
 32 count2        db     ?
 33 count3        db     ?
 34 ten    dw    10
 35 data   ends
 36 code  segment
 37 main  proc  far
 38          assume cs:code,ds:data
 39 start: push ds
 40          push ax
 41          mov  ax,data
 42          mov  ds,ax
 43          lea     dx,menu
 44          mov  ah,09h
 45          int     21h
 46          mov  ah,01h
 47          int     21h
 48          cmp  al,'0'
 49          jz      ex0
 50          cmp  al,'1'
 51          jz      de
 52          cmp  al,'2'
 53          jz      he0
 54          Emess
 55          jmp   start
 56 ex0:   jmp   exit
 57 de:     Crlf
 58          lea     dx,mess10
 59          mov  ah,09h
 60          int     21h
 61          lea     di,decim
 62          call    decin ;輸入一個十進制數
 63          Crlf
 64          cmp  ch,0
 65          jnz    de1;輸入個數爲0
 66          Emess
 67          jmp   exit
 68 he0:   jmp   he1
 69 de1:   lea     dx,mess6
 70          mov  ah,09h
 71          int     21h
 72          lea     si,decim
 73          lea     di,decim
 74          lea     bp,hexad1
 75          call    dectohex
 76          crlf
 77          lea     dx,mess2
 78          mov  ah,09h
 79          int     21h
 80          lea     si,hexad1
 81          lea     di,bina
 82          call    hextobin
 83          crlf
 84          lea     dx,mess8
 85          mov  ah,09h
 86          int     21h
 87          lea     si,bina
 88          lea     di,octa
 89          call    bintooct
 90          crlf
 91          jmp   exit
 92 he1:   crlf
 93          lea     dx,mess16
 94          mov  ah,09h
 95          int     21h
 96          lea     di,hexad
 97          call    hexin
 98          crlf
 99          mov  al,count3
100          mov  count0,al
101          cmp  ch,0
102          jnz    he2    ;輸入個數爲0
103          Emess
104          jmp   exit
105 he2:   lea     dx,mess2
106          mov  ah,09h
107          int     21h
108          lea     di,hexad0
109          lea     si,hexad
110          call    turn
111          lea     si,hexad0
112          lea     di,bina
113          call    hextobin
114          crlf
115          lea     dx,mess8
116          mov  ah,09h
117          int     21h
118          lea     si,bina
119          lea     di,octa
120          call    bintooct
121          crlf
122          lea     dx,mess0
123          mov  ah,09h
124          int     21h
125          lea     di,hexad
126          call    hextodec
127          crlf
128 exit:  
129          mov  ah,4ch
130          int     21h
131 main  endp
132 hexin proc           ;輸入一個字節的十六進制數
133 inputh:       mov  ah,01h        ;輸入第一個字符
134          int     21h
135          inc     count3        ;字節計數器
136          cmp  al,13
137          jz      endh
138          sub    al,30h
139          jl       exih   ;輸入出錯
140          cmp  al,10h
141          jl       inh1  ;輸入數字
142          cmp  al,16h
143          jl       inh2
144          cmp  al,36h
145          jg       exih
146          sub    al,20h
147 inh2: sub    al,07h
148 inh1: mov  [di],al         ;存入內存
149          inc     di
150          jmp   inputh
151 endh: dec    count3
152          jz      exih
153          mov  ch,1
154          jmp   endh0
155 exih:  mov  ch,0
156 endh0:        ret
157 hexin endp
158 turn   proc           ;逆置存放
159          mov  cl,count0
160          mov  bx,word ptr count0
161 xch:   dec    bx
162          mov  al,[si]
163          inc     si
164          mov  [di+bx],al
165          dec    cl
166          jnz    xch
167          ret
168 turn   endp
169 decin proc           ;輸入一個字節的十進制數
170 input:         mov  ah,01h        ;輸入第一個字符
171          int     21h
172          inc     count0        ;字節計數器
173          cmp  al,13
174          jz      end1
175          sub    al,30h
176          jl       exid   ;輸入出錯
177          cmp  al,9d
178          jg       exid   ;輸入出錯
179          mov  [di],al         ;存入內存
180          inc     di
181          jmp   input
182 end1: dec    count0
183          jz      exid
184          mov  ch,1
185          jmp   end0
186 exid:  mov  ch,0
187 end0: ret
188 decin endp
189 
190 dectohex     proc  ;十進制轉十六進制
191 change:       xor    ax,ax
192          xor    bx,bx
193          mov  count1,al
194          mov  ch,count0
195          cmp  ch,0   ;判斷decimal是否爲空
196          jz      outh1
197 rot:    mov  al,[di]
198          inc     di
199          cbw
200          add    ax,bx
201          mov  cl,16
202          div    cl
203          cmp  al,0
204          jnz    d2
205          cmp  ah,0
206          jz      d3
207 d2:    mov  [si],al
208          inc     si
209          inc     count1
210          sub    ch,1
211          jz      d5
212          jmp   d4
213 d3:    sub    ch,1
214          jz      d5
215          jmp   rot
216 d4:    mov  al,ah
217          mov  cl,10
218          mul   cl
219          mov  bx,ax
220          jmp   rot
221 d5:    mov  bx,word ptr count2
222          xchg  di,bp
223          mov  [di+bx],ah
224          xchg  di,bp
225          inc     count2        ;十六進制的字節數
226          mov  al,count1
227          mov  count0,al
228          mov  al,count1
229          cbw
230          sub    si,ax
231          mov  bx,si
232          mov  di,bx
233          jmp   change
234 outh1:        mov  al,count2    ;保存位數,留待後用
235          mov  count0,al            
236 outh: dec    count2
237          mov  bx,word ptr count2
238          xchg  di,bp
239          mov  al,[di+bx]
240          xchg  di,bp
241          mov  bh,al
242          add    bh,30h
243          cmp  bh,3ah
244          jl       print
245          add    bh,7h
246 print:          mov  dl,bh
247          mov  ah,02h
248          int     21h
249          mov  al,count2
250          cmp  al,0
251          jnz    outh
252          ret
253 dectohex     endp
254 ;*************************************
255 hextodec     proc  ;十六進制轉十進制
256          xor    ax,ax
257          xor    dx,dx
258          xor    bx,bx
259          mov  ch,count3
260 ro0:   mov  al,[di]         ;由第一個數開始取
261          inc     di
262          mov  cl,4    ;將其左移*16
263          cmp  ch,4
264          jg       getd
265          rol     bx,cl
266          add    bl,al
267          dec    ch
268          jnz    ro0
269          jmp   tr1
270 getd:  rol     dx,cl
271          add    dl,al
272          dec    ch
273          jmp   ro0
274 tr1:    mov  cx,0
275          mov  ax,bx
276 tran:  push ax
277          mov  ax,dx
278          mov  dx,0
279          div    ten
280          mov  si,ax
281          pop   ax
282          div    ten
283          mov  bx,dx
284          push bx
285          inc    cx
286     mov           dx,si
287     cmp           dx,0
288     jne    tran
289     cmp           ax,0
290     jne    tran
291 printd:  
292     pop bx
293     mov           dx,bx 
294     add   dx, 30h  
295     mov           ah, 02h  
296     int    21h  
297     loop          printd
298          ret    
299 hextodec     endp
300 ;*************************************
301 hextobin     proc  ;將十六進制數轉爲二進制
302          mov  bx,0
303          xor    ax,ax
304          mov  ch,count0
305 lar:    mov  al,[si]
306          inc     si
307          mov  cl,4             ;高位爲0,只有低位有效
308 sma:  mov  ah,al
309          and    ah,01
310          mov  [di+bx],ah
311          mov  ah,0
312          ror    ax,1            ;反向取出一位轉化爲ASCII輸出
313          inc     bx
314          dec    cl
315          jnz    sma
316          dec    ch
317          jnz    lar
318          mov  count0,bl    ;保存二進制個數,待用
319          dec    bx
320 outb: mov  al,[di+bx]  
321          add   al,30h
322          mov           dl,al
323          mov           ah,2
324          int    21h
325          dec    bx
326          cmp  bx,0
327          jnl     outb
328          ret
329 hextobin     endp
330 ;*************************************
331 bintooct     proc           ;二進制轉八進制
332          xor    ax,ax
333          xor    bx,bx
334          mov  ch,0
335          mov  cl,count0
336 O:     mov  al,[si]
337          inc     si
338          dec    cx
339          test   al,01h
340          jz      o1
341          add    bl,1
342 o1:    mov  al,[si]
343          inc     si
344          dec    cx
345          test   al,01h
346          jz      o2
347          add    bl,2  
348 o2:    mov  al,[si]
349          inc     si
350          dec    cx
351          test   al,01h
352          jz      o3
353          add    bl,4
354 o3:    mov  [di],bl
355          mov  bl,0
356          inc     di
357          inc     ah     
358          cmp  cx,0
359          jg       O
360          mov  count0,ah
361          mov  cl,count0
362 outo: dec    di
363          mov  al,[di]
364          add   al,30h
365          mov           dl,al
366          mov           ah,2
367          int    21h
368          dec    cl
369          jnz    outo
370          ret
371 bintooct     endp
372 ;*************************************
373 code  ends
374          end    start
375  
376  
相關文章
相關標籤/搜索