c++ - 在 MS x64 调用约定中,是否需要为 WinAPI 调用创建影子空间?

标签 c++ assembly 64-bit win64

<分区>

在 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;
   }

最佳答案

实际上它确实会生成阴影空间。但是在调用的最开始。(未在堆栈上方显示)我认为它会在调用之前创建阴影空间,显然事实并非如此。 所以我将关闭这个问题并打开一个更合适的问题。

关于c++ - 在 MS x64 调用约定中,是否需要为 WinAPI 调用创建影子空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27344915/

相关文章:

java - 使用通用网络摄像头进行对象检测

c++ - 从 boost::time_duration 中检索微秒

c++ - 是否可以在C++中添加到空双端队列的迭代器?

c++ - MIPS : loop goes to infinity

c++ - 64 位土地中的堆碎片

c++ - Qt 和 OpenGL 窗口 - 调整大小时闪烁

assembly - x86 程序集 : Output from swap function is incorrect even when the implementation is correct

ios - iOS 中的反编译可能性以及如何防止它们

c - 为什么复杂的 memcpy/memset 更胜一筹?

c - 将字符串扫描为十六进制字符数组