【问题标题】:Pass an argument from C to assembly?将参数从 C 传递到程序集?
【发布时间】:2010-12-02 00:37:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: c assembly cdecl


    【解决方案1】:

    我对此有点菜鸟,但希望这个示例能让您顺利上路。我已经对其进行了测试并且可以正常工作,您可能遇到的唯一问题是软件不可用。我正在使用 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 函数,以便我们可以尽可能简单地输出消息。

    希望这会有所帮助。

    【讨论】:

    • 正是我想要的。
    • @jwwisart 你现在有 1337 声望。如果有人投票支持你,那将是一种耻辱,不是吗? ^^
    • 这是如何工作的?特别是push dword [ebp+8]这一行。如果我理解正确,这会将 ebp+8 内存地址处的值推入堆栈?宽度为 32 位。我认为这与 printf 函数的参数有关 - 但谁能更详细地解释它?
    猜你喜欢
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2017-08-28
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多