【问题标题】:Call assembly procedure from another assembly file?从另一个程序集文件调用程序集程序?
【发布时间】:2014-06-07 17:33:08
【问题描述】:

一个简单的问题:

假设我有以下两个汇编程序:

1:

add10:
   add eax, 10
   ret
;call add5 from other file

2:

add5:
   add eax, 5
   ret
;call add10 from other file

我可以从第二个文件中调用add10(在第一个文件中声明)吗,反之亦然?如果是这样,怎么办? (即使不可行)

注意:这将在裸机上运行,​​而不是在任何花哨的 NT 调用上!

谢谢。

编辑:我在 Windows 上使用 NASM。

【问题讨论】:

  • 要回答这个问题,我们需要知道您使用的是什么汇编器和链接器。

标签: assembly x86 procedure freestanding


【解决方案1】:

两个文件:

1:

BITS 32

GLOBAL add5

section .code
add5:
    add eax, 5
    ret

2:

BITS 32

EXTERN add5
EXTERN printf
EXTERN ExitProcess

section .data
    fmt db `eax=%u\n`

section .code
add10:
    add eax, 5
    call add5
    ret

_main:
    mov eax, 87
    call add10

    push eax
    push fmt
    call printf
    add esp, 8

    push 0
    call ExitProcess

将它们组装并链接在一起。我用GoLink作为链接器,其他链接器类似:

nasm.exe -fwin32 -o add5.obj add5.asm
nasm.exe -fwin32 -o add10.obj add10.asm
GoLink.exe /ENTRY:_main /console /fo add10.exe add5.obj add10.obj kernel32.dll msvcrt.dll

我将源命名为“add5.asm”和“add10.asm”。汇编器生成“add5.obj”和“add10.obj”。链接器使用“add5.obj”和“add10.obj”以及一些系统库(用于“printf”和“ExitProcess”)。结果是可执行文件“add10.exe”。查看命令行以获取这些名称的顺序。名称是任意的。

HTH

【讨论】:

  • 以防万一您切换到 microsoft assembler(MASM 或 ML),它使用指令 public 而不是 global。
  • 文件名是什么?链接器如何知道要“包含”或链接哪个文件?我的意思是“物理上”它如何知道要打开哪个文件来查找程序?
【解决方案2】:

如果两个文件都链接到同一个可执行文件,是的。查找 EXTERN 或 EXTRN。

【讨论】:

  • 我尝试搜索它,但似乎找不到任何相关内容。有链接吗?
  • nasm.us/doc/nasmdoc6.html 向下滚动到外部 (6.5)。基本上 EXTRN 所做的就是告诉汇编器一个符号/标签是在文件之外定义的。
猜你喜欢
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多