2014-12-07 35 views
-1

在MS x64調用約定中,如果我們調用Win64 API,那麼調用者應該創建一個陰影空間。在MS x64調用約定中,是否正在爲WinAPI調用創建陰影空間必要性?

不過,我創建了一個簡單的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

某些APi調用會修改傳遞給它們的參數,特別是字符串緩衝區如果要保留這些值,則需要在調用這些值之前複製這些值。除非你有_explicitly_創建了一個副本,否則在反彙編中將不會看到它。你爲什麼認爲編譯器會爲你做到這一點? – 2014-12-07 17:04:19

+0

也許顯示整個功能? – 2014-12-07 17:20:47

+0

我不認爲問題是相同的。我只是指出文檔中是這樣說的,但編譯器生成的代碼在其他方面做不到。並試圖弄清楚這是否合法。 – 2014-12-07 17:26:53

回答

0

實際上它確實產生陰影的空間。但在通話的最初階段(未在上圖中顯示),我認爲它會在通話之前創建影子空間,但情況並非如此。 所以我會關閉這個問題並打開一個更合適的問題。

相關問題