assembly x86(nasm)子程序1

  • T:
  • 将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
  • 思路:
  • Main主调程序,循环调用HEXAC子程序10次
  • HEXAC子程序,将十六进制数,除以16分解成两个独立部分,再利用数据结构堆栈的后进先出的性质来调整顺序,同时进行转码。
  • DISP子程序,起显示作用。

 

  • 问题:子程序中对栈的使用需要小心,一个子程序push后,在return之前必须有对应的pop,要不然子程序无法返回。

 

代码如下:

data    segment
message        db    'Binary to hexadecimal',0dh,0ah,'Press any key to continue!',0dh,0ah,'$'
buf1        db  4eh,0ch,37h,04h,7dh,60h,21h,33h,44h,55h
buf2        db    '00h  $'
data    ends
code    segment
assume    cs:code,ds:data
;---------------------------------------------------------------------------------------------------------------------
main proc        far
start:        mov    ax,data
            mov    ds,ax            
            lea dx,message    
            mov    ah,9                        
            int    21h
            mov cx,10
loopa:        
            call HEXAC
            loop loopa
exit:        mov    ah,4ch                        
            int    21h
main endp
;---------------------------------------------------------------------------------------------------------------------
HEXAC    proc    near                ;码型转换子程序
            mov al,buf1[si]
            push cx
            push si
            mov si,2
            xor cx,cx
            cbw
loopb:
            xor dx,dx
            inc cl
            mov bx,16
            div bx                    ;ax商,dx余
            push dx                    ;余数入栈
            cmp ax,0
            jne loopb
            mov buf2[0],'0'
            sub si,cx
loopc:
            pop dx
            cmp dl,9
            jna change
            add dl,55
            mov buf2[si],dl
            jmp next
change:        or  dl,00110000b
            mov buf2[si],dl
next:        inc si
            loop loopc
            pop si
            inc si
            pop cx
            call DISP
            ret
HEXAC endp
;---------------------------------------------------------------------------------------------------------------------
DISP    proc    near                ;显示子程序
            lea dx,buf2
            mov ah,9
            int 21h
            ret
DISP endp
;---------------------------------------------------------------------------------------------------------------------
code    ends
end    start

 

posted @ 2019-06-06 21:21  Lancelot&  阅读(591)  评论(0编辑  收藏  举报