在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;
}
答案 0 :(得分:1)
实际上它确实会生成阴影空间。但是在通话的最开始。(未显示在堆栈上方)我认为它会在呼叫之前创建阴影空间,显然情况并非如此。 所以我将关闭这个问题,并打开一个更合适的问题。