我想将nasm代码分割成几个文件,以便可以分别处理不同的代码。但是,我发现的唯一方法是使用nasm %include
宏。例如。 main.asm
文件看起来像这样,
; ---- main.asm ----
%include "./header.asm"
section .text
global _start
_start:
call dummy_func
mov rax, 0x3c
mov rdx, 0x0
syscall
而header.asm
仅包含
section .text
dummy_func:
ret
我听说过在链接过程中执行此操作的方法。我对此很感兴趣,但是找不到合适的东西。真的有可能吗?如果是这样,可以用ld
完成吗?还有什么其他方法可以包含静态库? (可能还有更多的宏。但是,我不确定“宏”是否是正确的词)
不需要静态库-您可以将函数声明为外部函数。在您的情况下,main.asm
看起来像:
; ---- main.asm ----
section .text
global _start
extern dummy_func
_start:
call dummy_func
mov rax, 0x3c
mov rdx, 0x0
syscall
然后将源文件编译为目标文件:
nasm main.asm -o main.o
nasm header.asm -o header.o
然后您最终可以使用ld将2个目标文件链接到一个可执行文件中:
ld -o [desired executable name] main.o header.o
extern
关键字基本上意味着函数dummy_func
位于不同的目标文件中,并且包含dummy_func
的目标文件必须最后链接到可执行文件中。与使用%include
相比,这是一种更好的处理方式。