• [汇编] 十进制和十六进制数之间的转换


    刚接触汇编,很多细节搞得还不是很清楚,写了一个十进制和十六进制之间相互转换的程序(有点挫。。)就当练手了。

    贴出代码,希望路过的大牛可以给一些指导。

    思路:(10->16)十进制数输入的时候单个字符处理,遇见回车结束输入,最后得到一个十进制数。然后循环左移(只处理4次),取后四位,也就是相当于/16

    最后输出字符。(16->10)类似处理,先转换成10进制数(每次*16),最后依次取出每一位输出。

    ; multi-segment executable file template.
    
    data segment
        ; add your data here!  
        num dw 0
        string1 db  'please choose  1 (dec->hex) or 2 (hex->dec)]:$'
        inputDec db 'please input a Dec number :$'
        inputHex db 'please input a Hex number :$'
    
    ends
    
    stack segment
        dw   128  dup(0)
    ends
    
    code segment 
    
    start:
     ;set segment registers:
        mov ax, data
        mov ds, ax
        mov es, ax  
        
     ;-------------选择模式------------------ 
     model:
        lea dx, string1
        mov ah,9
        int 21h
        
        mov ah,1
        int 21h
        sub al,30h
        cmp al,1 
        mov cx,10  ;乘10
        jz  option1
        call CRLF  
        
        cmp al,2 
        mov cx,16
        jz option2
        call CRLF  
        jmp model  
     ;----------------------------------------
      
     ;***********十进制转十六进制*****************
     
     
     ;-----------输入一个十进制数-------------
     option1: 
        call CRLF
        lea dx,inputDec
        mov ah,9
        int 21h
     rotate1:
        mov ah,1
        int 21h
        cmp al,0dh  ;回车结束十进制数的输入
        jz DectoHex
        sub al,30h
        cbw
        push ax
        mov ax,bx
        mul cx 
        mov bx,ax
        pop ax
        add bx,ax ;输入结果保存在bx中
        jmp rotate1
      ;-----------------------------------------
       
      ;---------开始转换(10->16)------------- 
     DectoHex: 
        call CRLF
        mov ch,4 
     rotatecur:
        mov cl,4
        rol bx,cl
        mov al,bl
        and al,0fh
        add al,30h
        cmp al,3ah
        jl print1
        add al,7h
     print1:
       mov dl,al
       mov ah,2
       int 21h
       dec ch
       jnz rotatecur 
       
       call exit 
     ;**************十六进制转十进制******************* 
     
     ;-------------输入一个十六进制数------------------  
     option2: 
        call CRLF
        lea dx,inputHex
        mov ah,9
        int 21h
     rotate2:
        mov ah,1
        int 21h
        cmp al,0dh  ;回车结束十六进制数的输入
        jz HextoDec  
         
        sub al,30h
        cmp al,9
        jg Other  
     L:
        cbw
        push ax
        mov ax,num
        mul cx 
        mov num,ax
        pop ax
        add num,ax ; 输入结果保存在num中
        jmp rotate2  
        
     Other: 
        sub al,7h
        jmp L
     HextoDec: 
         call  CRLF
         mov cx,1000 
         ;----------重复的输出代码。。。-----
         mov ax, num
         mov dx, 0
         div cx
         mov num, dx
         mov dl, al
    
         add dl,30h
         mov ah,02h
         int 21h  
         ;--------------------
         mov cx,100
          ;----------
         mov ax, num
         mov dx, 0
         div cx
         mov num, dx
         mov dl, al
    
         add dl,30h
         mov ah,02h
         int 21h  
         ;----------
         mov cx,10
         ;----------
         mov ax, num
         mov dx, 0
         div cx
         mov num, dx
         mov dl, al
    
         add dl,30h
         mov ah,02h
         int 21h  
         ;----------
         mov cx,1
          ;----------
         mov ax, num
         mov dx, 0
         div cx
         mov num, dx
         mov dl, al
    
         add dl,30h
         mov ah,02h
         int 21h  
         ;----------
         
         call exit 
        
         
    ;----------取每一位------------------
    
    ;-----------------------------------
    
     
     ;--------回车换行------------------   
      CRLF proc near
              push ax
              push dx
              pushf
              
              mov dl,0dh;回车
              mov ah,2
              int 21h
              
              mov dl,0ah;换行
              mov ah,2
              int 21h
              
              popf
              pop dx
              pop ax
              
              ret
       CRLF endp   
      ;-----------------------------------------
        
      ;-----------------退出---------------------
      exit proc
        mov ax, 4c00h ; exit to operating system.
        int 21h  
      exit endp 
      ;------------------------------------------     
      
      
    
      
    ends
    
    end start ; set entry point and stop the assembler.
  • 相关阅读:
    【UVA116】 单向TSP Unidirectional TSP [动态规划]
    【luogu4408】 [NOI2003]逃学的小孩 [动态规划 树的直径]
    【POJ2631】树的直径 [动态规划 树形dp]
    【luogu 1156】 垃圾陷阱 [动态规划 背包]
    【luogu1472】 奶牛家谱 Cow Pedigrees [动态规划]
    【luogu2747】 [USACO5.4]周游加拿大Canada Tour[动态规划]
    【luogu2737】 [USACO4.1]麦香牛块Beef McNuggets [动态规划 完全背包][数学 扩展欧几里德]
    【luogu3856】【TJOI2008】公共子串 [动态规划]
    【luogu1020】 导弹拦截 [动态规划LIS]
    【luogu1439】 【模板】最长公共子序列 [动态规划][LIS最长上升子序列][离散化]
  • 原文地址:https://www.cnblogs.com/Tach-ac/p/4422581.html
Copyright © 2020-2023  润新知