【汇编】进制转换程序

时间:2024-03-05 13:48:08

 

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

 

设计内容

1.从键盘输入一个不少于8位的十进制数(如12345678),把其分别转换成二进制、八进制、十六进制数显示在屏幕上。

2.从键盘输入一个不少于5位的十六进制数(如1FED5H),把其分别转换成二进制、八进制、十进制数显示在屏幕上。

思路

1.本程序应用分支程序功能实现菜单选择操作,在主程序中通过带参数的调用子函数,来完成部分功能的实现。

2.子程序decin:实现十进制的输入功能,设一个计数器,保存输入字符的个数,因为输入的是十进制数,对其输入进行了严格的审核,防止出现乱码的情况,采用了带参数调用可以使得更改存放内存时的方便

3.子程序hexin:实现了十六进制的输入功能,类似decin,对其存入进行了相应的调整,使得存入的就是输入的字符

4.子程序turn:实现了将存储单元中的元素进行了倒置存入,本子程序是为了能直接调用子程序dextobin而设计的

5.子程序dectohex:实现了十进制到十六进制的转换,本子程序应用了书本上用除法将十进制转换为十六进制的计算

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