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