zoukankan      html  css  js  c++  java
  • 【汇编】进制转换程序

     原文地址: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  

      

  • 相关阅读:
    NodeJS实例系列~环境搭建,Hello world归来!
    Node.js教程系列~目录
    poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串
    利用手工编码的方式对srtus2进行输入验证
    介绍linux下Source Insight强大代码编辑器sublime_text_3
    【机器学习】支持向量机[续1]
    boost库在工作(33)网络服务端之三
    HNCU1099:堆积木
    HNCU1100:彩票
    Lua获取网络时间
  • 原文地址:https://www.cnblogs.com/tenderwx/p/5401450.html
Copyright © 2011-2022 走看看