【发布时间】:2014-12-07 16:36:03
【问题描述】:
在 MS x64 调用约定中,如果我们调用 Win64 API,调用者应该创建一个影子空间。
但是,我创建了一个简单的 C++ 程序并调用 MessageBox,反汇编后就是我看到的:
00007FF614FC2AD9 mov r9d,136h
00007FF614FC2ADF lea r8,[__xt_z+150h (07FF614FD5BF0h)]
00007FF614FC2AE6 lea rdx,[__xt_z+170h (07FF614FD5C10h)]
00007FF614FC2AED xor ecx,ecx
00007FF614FC2AEF call qword ptr [__imp_MessageBoxW (07FF614FDF6C0h)]
00007FF614FC2AF5 mov dword ptr [msgboxID],eax
我没有看到任何影子空间预留。(甚至在前面未显示的说明中也没有)我错过了什么?
编辑:这是上面的 C++ 代码:
#include <Windows.h>
int main()
{
int msgboxID = MessageBox(
NULL,
(LPCWSTR) L"Resource not available\nDo you want to try again?",
(LPCWSTR) L"Account Details",
MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2
);
return 0;
}
【问题讨论】:
-
一些 APi 调用会修改传递给它们的参数,尤其是字符串缓冲区。如果要保留这些值,则需要在调用这些函数之前对其进行复制。除非您明确创建了一个副本,否则您不会在反汇编中看到它。为什么你认为编译器会为你这样做?
-
也许显示整个功能?
-
我认为问题不一样。我只是指出文档是这样说的,但是编译器生成的代码却不然。并试图弄清楚这是否合法。