【问题标题】:passing variables to nasm procedure将变量传递给 nasm 过程
【发布时间】: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" { ... }。玉。在我看来,那些以这种误解开始的人太任性而无法提供帮助。

标签: c assembly nasm masm


【解决方案1】:

有几点需要指出:

  • 您的汇编程序通过寄存器传递参数, 堆栈或两者的组合。检查您的平台 ABI。
  • 要从 C 调用的汇编程序函数通常具有下划线前缀 _。您可以为要公开的每个函数执行此操作:

section .text global _func

_func:
     ; Do stuff
    ret

或者通过 nasm compile 参数(所有函数都会这样做)--prefix _

  • 最后,如果从 C++ 程序调用,您只需要 extern "C"

玩得开心!

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 2011-09-15
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    相关资源
    最近更新 更多