繁体   English   中英

使用内联ASM调用函数

[英]Call a Function with inline ASM

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

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

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

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

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

这是关于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&T语法编写的。 对于* NIX环境,ABI也不相同。 希望这可以帮助。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM