有没有办法通过使用内联汇编来调用 MessageBox ?
#include<windows.h>
#pragma comment(lib,"user32.lib");
int main()
{
MessageBox(0,"Hello","Title",1);
return 0;
}
编辑:您提供的链接很棒,但“睡眠”只有一个参数。我需要一种方法将多个参数传递给我需要调用的函数。像MessageBox函数一样。
答案 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也不相同。 希望这会有所帮助。
编辑:事实上,在使用快速调用约定调用函数之前总是在堆栈上留空是更好的,因为它们可能会交换寄存器并且您不希望覆盖堆栈帧。