Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将参数从C传递给程序集?_C_Assembly_Cdecl - Fatal编程技术网

将参数从C传递给程序集?

将参数从C传递给程序集?,c,assembly,cdecl,C,Assembly,Cdecl,如何将参数从C主函数传递到汇编函数?我知道我的自定义函数必须看起来像: void function(char *somedata) __attribute__((cdecl)); 现在,我将如何在程序集文件中使用somedata。我的操作系统是Linux Ubuntu,处理器是x86。我在这方面有点不在行,但希望这个例子能让你上路。我已经测试过了,它可以正常工作,唯一的问题是软件不可用。我正在使用nasm进行组装 main.c myFunc.asm 编撰 笔记: 你需要安装nasm(汇编程序)

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

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

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

我在这方面有点不在行,但希望这个例子能让你上路。我已经测试过了,它可以正常工作,唯一的问题是软件不可用。我正在使用nasm进行组装

main.c myFunc.asm 编撰 笔记: 你需要安装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函数,以便尽可能简单地输出消息


希望这能有所帮助。

这正是我想要的。@jwvishart你现在有1337的声誉。如果有人投票支持你,那会很遗憾,不是吗?^^这是怎么回事?特别是这句话
推送dword[ebp+8]
。如果我理解正确,这会将ebp+8内存地址处的值推送到堆栈上?宽度为32位。我认为这与printf函数的参数有关-但有人能解释得更详细吗?
extern void myFunc(char * somedata);

void main(){
    myFunc("Hello World");
}
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