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

标签 c assembly cdecl

如何将参数从 C 主函数传递到汇编函数?我知道我的自定义函数必须类似于:

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

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

最佳答案

我对此有点菜鸟,但希望这个例子能让你上路。我已经对其进行了测试并且可以正常工作,您可能遇到的唯一问题是软件不可用。我正在使用 nasm 进行组装。

主.c

extern void myFunc(char * somedata);

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

我的函数.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 函数,以便我们可以尽可能简单地输出消息。

希望这能有所帮助。

关于c - 将参数从 C 传递给程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654954/

相关文章:

c++ - 语言如何与硬件对话?

c - 如何在可变参数函数上强制使用 cdecl

c++ - OpenMP 初学者 - 圈内问题

c - 如何防止用户在c中输入0或负数

c - 从结构打印数组

linux - 如何在不改变其功能的情况下将一些垃圾指令插入/删除到 ELF/PE 文件中?

c - 为什么像 "a=b---//a newline, line ends without ;"这样的语法不会产生语法错误?

assembly - .IF 和 CMP 之间的区别?调用和推送调用?使用哪一个?(MASM)

c++ - CDECL 调用约定导致奇怪的警告 ASSEMBLY X86

c++ - 与函数指针、__cdecl 和模板的混淆