汇编语言学习_5_包含外部文件
第五节
包含外部文件
外部包含文件允许我们从我们的程序中移动代码并将其放入单独的文件中。这种技术对于编写干净、易于维护的程序很有用。可重用的代码位可以编写为子程序并存储在称为库的单独文件中。当您需要一段逻辑时,您可以将该文件包含在您的程序中并使用它,就好像它们是同一文件的一部分一样。
在本课中,我们将把我们的字符串长度计算子程序移动到一个外部文件中。我们还填充了我们的字符串打印逻辑和程序退出逻辑一个子例程,我们将把它们移到这个外部文件中。一旦完成,我们的实际程序将变得干净且更易于阅读。
这样,我们可以声明再声明一个变量,调用 print
函数两次,来演示如何重用代码。
注意: 除非它发生变化,否则我不会在本课后展示 functions.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)
; 编译: nasm -f elf helloworld-inc.asm
; 链接 (64 bit systems require elf_i386 option): ld -m elf_i386 helloworld-inc.o -o helloworld-inc
; 运行: ./helloworld-inc
%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 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.
错误:我们的第二条消息输出了两次。这将在下一课中修复。