如何将参数从C main函数传递给汇编函数?我知道我的自定义函数必须看起来像:

void function(char *somedata) __attribute__((cdecl));

现在我将如何在汇编文件中使用somedata。我的操作系统是Linux Ubuntu,处理器是x86。

最佳答案

我对此不太满意,但希望本示例可以助您一臂之力。我已经对其进行了测试,并且可以正常工作,唯一的问题就是软件不可用。我正在使用nasm进行组装。

main.c

extern void myFunc(char * somedata);

void main(){
    myFunc("Hello World");
}

myFunc.asm
section .text
    global myFunc
    extern printf

    myFunc:
        push ebp
        mov  ebp, esp

        push dword [ebp+8]
        call printf

        mov esp, ebp
        pop ebp
        ret

编译
nasm -f elf myFunc.asm
gcc main.c myFunc.o -o main

笔记:

您需要安装nasm(汇编程序)(ubuntu是:sudo apt-get install nasm)

C代码中基本上发生的事情是通过消息调用myFunc。在myFunc.asm中,我们获得字符串的第一个字符的地址(在[ebp + 8]中,有关信息,请参见此处(http://www.nasm.us/xdoc/2.09.04/html/nasmdoc9.html参见9.1.2,它在某种程度上描述了c调用约定。),并将其传递给printf函数(通过将其压入堆栈)。printf在c标准库中,默认情况下,gcc会自动链接到我们的代码中,除非我们不说至。

我们必须将myFunc导出到程序集文件中,并在main.c文件中将myFunc声明为外部函数。在myFunc.asm中,我们还从stdlib导入了printf函数,以便我们可以尽可能简单地输出消息。

希望这会有所帮助。

10-07 19:26
查看更多