【问题标题】:Splitting NASM assembly source code into libraries将 NASM 汇编源代码拆分为库
【发布时间】:2020-08-09 04:17:22
【问题描述】:

我想将我的 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 完成吗?还有什么其他方法可以包含静态库? (可能还有一些宏。但是我不确定“宏”在这里是正确的词)

【问题讨论】:

  • 这方面我没有急用,我只是想了解一下NASM是如何工作的。感谢您抽出宝贵的时间

标签: nasm ld yasm


【解决方案1】:

不需要静态库 - 您可以将函数声明为外部函数。在您的情况下,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 更好的处理方式。

【讨论】:

  • 谢谢。但是我不必将 dummy_func 声明为全局标签吗?它只能以这种方式工作
  • 在 main.asm 中将其声明为 extern,但在 header.asm 中将其声明为全局。一般来说,任何你想使用函数的地方都把它写成extern,而在实际定义它的源文件中把它写成global
猜你喜欢
  • 2012-05-09
  • 2014-01-03
  • 2012-03-23
  • 2016-02-10
  • 2013-06-28
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多