引用外部文件允许我们从程序中移动代码,并将其放入单独的文件中。这种技术对于编写干净、易于维护的程序非常有用。可重用代码位可以作为子例程编写,并存储在称为库的单独文件中。当您需要一段逻辑时,您可以在程序中包含该文件,并将其当作同一文件的一部分来使用。
在这节课中,我们将把字符串长度计算子例程移动到一个外部文件中。我们还使字符串打印逻辑和程序退出逻辑成为一个子程序,我们将把它们移到这个外部文件中。一旦它完成,我们实际的程序将是干净的,更容易阅读。
然后,我们可以声明另一个消息变量并两次调用print函数,以演示如何重用代码。
注意:我不会在函数中显示代码。Asm后这一课除非它改变。如果需要,它将被包括在内。
functions.asm
;------------------------------------------
; int slen(String message)
; String length calculation function
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)
; String printing function
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()
; Exit program and restore resources
quit:
mov ebx, 0
mov eax, 1
int 80h
ret
helloworld-inc.asm
; Hello World Program (External file include)
; Compile with: nasm -f elf helloworld-inc.asm
; Link with (64 bit systems require elf_i386 option): ld -m elf_i386 helloworld-inc.o -o helloworld-inc
; Run with: ./helloworld-inc
%include 'functions.asm' ; include our external file
SECTION .data
msg1 db 'Hello, brave new world!', 0Ah ; our first message string
msg2 db 'This is how we recycle in NASM.', 0Ah ; our second message string
SECTION .text
global _start
_start:
mov eax, msg1 ; move the address of our first message string into EAX
call sprint ; call our string printing function
mov eax, msg2 ; move the address of our second message string into EAX
call sprint ; call our string printing function
call quit ; call our quit function
~$ nasm -f elf helloworld-inc.asm
~$ ld -m elf_i386 helloworld-inc.o -o helloworld-inc
~$ ./helloworld-inc
Hello, brave new world!
This is how we recycle in NASM.
This is how we recycle in NASM.
第二个消息输出了两次。这将在下一课中确定。