2016-03-27 42 views
0

我有一个.asm模块,我想在.c模块中使用它的过程。 因为我是用我的MASM代码会看起来像:将变量传递给nasm过程

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”下描述的变量?

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

+0

这一切都取决于。你是否想在Ubuntu上编写64位代码或32位代码?调用约定根据您要生成的代码而有所不同。有了_NASM_,您必须了解调用约定,因为_MASM_通过PROC语句隐藏了大部分细节。 –

+0

我打算在x86和x86-64上写一个描述GCC函数调用ABI的答案,但后来我在标签为'C'的后面看到了'extern“C”{...}'。育。在我看来,那些以这种错误观念开始的人太过任性。 –

回答

0

有几件事情要指出:

通过寄存器
  • 你的汇编过程传递参数, 堆栈或两者的组合。检查你的平台ABI。
  • 你想从C调用的汇编程序函数通常有一个下划线前缀_。你可以为你做这个是要揭露所有的功能:

section .text global _func

_func: 
    ; Do stuff 
    ret 

,或者通过NASM编译参数(这将做到这一点对所有的功能)--prefix _

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

玩得开心!