【发布时间】:2016-07-14 16:26:57
【问题描述】:
我有一个 .asm 模块,我想在 .c 模块中使用它的过程。 由于我使用的是 MASM,因此我的代码如下所示:
SECTION .text
func PROC arg1: DWORD, arg2:DWORD
...
ret
ENDPROC
在 .c 模块中:
extern "C"{
void func (int arg1, int arg2);
}
现在我使用 ubuntu 并决定尝试 NASM。 所以我有以下问题:我如何将参数传递给 nasm 中的过程,因为它只是一个标签?如何在我的 NASM 代码中使用 .c 模块中的 extern "C" 下描述的变量?
我还听说,有一个关于使用堆栈将参数传递给过程的约定。我可以在这里以某种方式使用吗?请给我一些例子好吗?
【问题讨论】:
-
这一切都取决于。您想在 Ubuntu 上编写 64 位代码还是 32 位代码?调用约定因您要生成的代码而异。使用 NASM 您必须了解调用约定,因为 MASM 通过 PROC 语句隐藏了大部分细节。
-
我本来打算写一个答案来描述 x86 和 x86-64 上的 GCC 函数调用 ABI,但后来我在标记为
C的帖子中看到了extern "C" { ... }。玉。在我看来,那些以这种误解开始的人太任性而无法提供帮助。