英文原版地址:NASM Assembly Language Tutorials - asmtutor.com
外部包含文件允许我们从程序将代码移动到单独的文件中。这个技术对于编写清晰且易于维护的程序是非常有用的。可复用的少量代码可以被写作子程序并存入到被叫做库的独立文件中。当你需要一段逻辑,你可以在你的程序中包含这个文件并把它当作同一个文件的一部分来使用。
在本节课中,我们将移动计算字符串长度的子程序到外部文件中。我们还将字符串打印以及程序退出作为子程序并移动到这个外部文件中。当它完成时,我们的实际程序将变得简洁且易于阅读。
我们可以声明另一个消息变量并调用两次我们的打印函数两次来演示我们如何复用代码。
使用下边的命令编译,链接然后执行这个程序
functions.asm文件
;------------------------------------------
; int slen(String message)
; 字符串长度计算函数
slen:
push ebx
mov ebx, eax
nextchar:
cmp byte [eax], 0
jz finished
inc eax
jmp nextchar
finished:
sub eax, ebx
pop ebx
ret
;------------------------------------------
; void sprint(String message)
; 字符串打印函数
sprint:
push edx
push ecx
push ebx
push eax
call slen
mov edx, eax
pop eax
mov ecx, eax
mov ebx, 1
mov eax, 4
int 80h
pop ebx
pop ecx
pop edx
ret
;------------------------------------------
; void exit()
; 退出程序并复原资源
quit:
mov ebx, 0
mov eax, 1
int 80h
ret
hello.asm文件
%include 'functions.asm' ; 包含我们的外部文件
SECTION .data
msg1 db 'Hello, brave new world!', 0Ah ; 第一个字符串
msg2 db 'This is how we recycle in NASM.', 0Ah ; 第二个字符串
SECTION .text
global _start
_start:
mov eax, msg1 ; 将第一个字符串的地址给EAX
call sprint ; 调用字符串打印函数
mov eax, msg2 ; 将第二个字符串的地址给EAX
call sprint ; 调用字符串打印函数
call quit ; 调用退出函数
编译命令
nasm -f elf hello.asm
链接命令
ld -m elf_i386 hello.o -o hello
执行命令
./hello
错误:第一个字符串被输出两次,这个bug将在下一节被修复。