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文件之前,先执行我们自己定义的入口,这样就能争取打印字符了。


posted @ 2011-12-18 19:11  lovemychobits  阅读(442)  评论(0编辑  收藏  举报