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


转载于:https://www.cnblogs.com/chobits/archive/2011/12/18/2291938.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值