c - 将变量传递给 nasm 过程

标签 c assembly nasm masm

我有一个 .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"下描述的变量?

我还听说,有一个关于使用堆栈将参数传递给过程的约定。我可以在这里使用吗?请给我一些例子好吗?

最佳答案

有两点需要指出:

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

节.text 全局_func

_func:
     ; Do stuff
    ret

或者通过 nasm 编译参数(它将对所有函数执行)--prefix _

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

玩得开心!

关于c - 将变量传递给 nasm 过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36244943/

相关文章:

无法从 switch 正确调用函数,无法调用函数

c - 分析 C 程序 - Time Shell 命令

计算嵌套for循环的执行时间

c++ - 迭代 OpenCl 内核

c++ - 将非原子加载到与原子变量相同的缓存行会导致原子变量失败吗?

c++ - 在 C 函数末尾的循环中,break 和 return 之间是否存在显着的性能差异?

assembly - MIPS 中的递归

c - 当我尝试从 C 程序调用已编译的 NASM 函数时出现 undefined reference 错误

eclipse - 什么是编写 NASM 的好 IDE?

macos - x64 nasm : pushing memory addresses onto the stack & call function