欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[编译] 将二进制数转换为 ASCII 十六进制数

最编程 2024-05-22 17:55:06
...

汇编语言模块化设计:子程序中涉及到了参数传递。在参数传递中,最常用的也是最自然的就是寄存器传递参数。但是由于寄存器个数有限,因此只适合传递少量数据。
"十六进制显式程序“是出于熟悉汇编操作来写的。它的作用是将给出的二进制数值转化为十六进制数并且以ASCII码的形式在屏幕上写出来。
思路

4位二进制数=1位十六进制数。0 ~ 9、A ~ F分别对应的ASCII码分别为30H ~ 39H、41H ~ 46H。
因此对于十六进制0~9来说,+30H就可以转化为ASCII的0到9;
对十六进制的A ~ F来说,+30H+7就可以转化为 ASCII的 A~F。

以下程序为16位8086处理器的汇编指令
    include io.inc
    .model small
    .stack
    .data
regw db 'AX=',4 dup(0),'H','$' 
    .code
    .startup
        xor  bx,bx
        mov  ax ,13ach  ;将要转化的数字。(在机器中为二进制)
        mov  cx,4  ;循环4次
again: rol ax,1
        rol ax,1
        rol ax,1
        rol ax,1 ;不带进位的循环左移,将高4位移到低4位
        push ax 
        call translate
        mov regw+3[bx] ,al ;因为regw前面有3位,所要从regw[3]开始
        pop ax
        inc bx  ;bx自增1
        loop again  
        mov dx,offset regw
        mov ah,9
        int 21h
        .exit
translate proc  ;子程序开始
        and al,0fh;  ;质保留下了 al的低4位
        or al,30h   ;给al加上了30h
        cmp al,39h;查看是否小于等于39h(对应十进制的9)
        jbe labe
        add al,7
labe: ret
translate endp
    end

另一种子程序的写法

translate proc
      push bx ;保护起来bx
      and al,0fh;
      mov bx ,ax
      mov al, ASCII[bx]  ;以数组的形式查找,十分巧妙
      pop bx
      ret
ASCII db '0123456789ABCDEF'
translate endp

推荐阅读