nasm过程调用
通常都是将一些通用的功能封装成一些函数,然后方便以后的调用,现在来看一下在nasm中是如何实现的。
先定义一个print.pro 的nasm过程文件,文件内容如下:
1 print_char:
2 pusha
3 mov dl, al
4 mov ah, 02h
5 int 21h
6 popa
7 ret
其中print_char, print_str就是过程的名字,每个过程需要使用ret去跳回调用者。
然后写一个调用print.pro的文件,proc.asm, 代码如下:
[org 0x0100]
[BITS 16]
%include "print.pro"
[section .data]
msg DB 'hello', 0Dh, 0Ah, '$'
[section .text]
mov al, 65h
call print_char
ret
使用%include导入我们的过程文件print.pro,然后通过AL传递一个参数,传递给print_char,再使用call调用指定的过程。不过发现屏幕上没有打印任何内容,这是为什么呢?这是因为com文件属于纯二进制格式,编译器是按照我们的输入方式和顺序进行编译的,产生的代码也是按照这个顺序。由于我们%include "print.pro"在程序的最前面,所以在程序编译运行的时候,其实先执行了print.pro的内容,可以通过debug命令,就能看出来。然后又因为,al和ax没有内容,所以没有输出任何东西。我们只要稍微改下程序,就可以了。
修改后的程序,如下:
1 [org 0x0100]
2 [section .code]
3 jmp start
4 %include "print.pro"
5 [section .code]
6 start:
7 mov al, 'A'
8 call print_char
9 ret
在我们%include .pro文件之前,先执行我们自己定义的入口,这样就能争取打印字符了。