使用内联ASM调用函数

时间:2017-02-27 14:30:36

标签: c assembly inline-assembly

有没有办法通过使用内联汇编来调用 MessageBox

#include<windows.h>
#pragma comment(lib,"user32.lib");

int main()
{
    MessageBox(0,"Hello","Title",1);
    return 0;
}

编辑:您提供的链接很棒,但“睡眠”只有一个参数。我需要一种方法将多个参数传递给我需要调用的函数。像MessageBox函数一样。

1 个答案:

答案 0 :(得分:0)

我认为关于这个问题的评论对于实际调用的方式非常清楚,现在让我们看看如何传递参数。

这是关于Microsoft ABI的直接问题。它如下 -

前4个参数在寄存器%rcx,%rdx,%r8,%r9中传递,其余参数在堆栈上传递。 所以剩下的就可以推到堆叠上,顶部是第5个,第6个是第6个。

现在有一个特点,你必须要小心。您还必须在堆栈中为前4个参数留出空间。这意味着在调用后第5个参数将在5(8个字节)的插槽之后(1表示返回地址和4个参数)。 您可以通过在推送第5个参数后执行subq $ 32,%rsp来实现此目的。

这个额外的空间留给被调用者交换寄存器以防它们需要使用它们。

所以对你的情况来说,

movq $0, %rcx

movq $hello, %rdx

movq $title, %r8

movq $1, %r9

callq MessageBox

PS:这个例子是保持64位架构和AT&amp; T语法编写的。 对于* NIX环境,ABI也不相同。 希望这会有所帮助。

编辑:事实上,在使用快速调用约定调用函数之前总是在堆栈上留空是更好的,因为它们可能会交换寄存器并且您不希望覆盖堆栈帧。