2014-11-16 22 views
1

根據http://msdn.microsoft.com/en-us/us-en/library/ms235286.aspxhttp://msdn.microsoft.com/en-us/us-en/library/ew5tede7.aspx 調用者必須始終爲4個註冊參數分配足夠的空間,即使被調用者沒有那麼多參數。即使參數本身從未寄存到堆棧,空間也始終爲寄存器參數分配。x64調用約定中前4個參數的陰影空間的用法

這個陰影空間用於4個寄存器參數的用法是什麼?

我反編譯了一些由VS和G ++編譯的程序,發現被調用者在開始時將註冊參數保存在陰影空間中。例如,的WinMain(HINSTANCE *的hInstance,HINSTANCE * hPrevInstance,字符* lpCmdLine,INT的nCmdShow)功能執行以下操作在其開始推:

mov  [rsp+arg_18], r9d 
mov  [rsp+arg_10], r8 
mov  [rsp+arg_8], rdx 
mov  [rsp+arg_0], rcx 

爲什麼被叫方的影子空間保存寄存器參數?如果被調用者必須將寄存器參數保存在堆棧中,爲什麼他們使用寄存器來傳遞參數,而不是直接通過堆棧傳遞所有參數?

+0

它使您的代碼更易於調試,一般來說x64代碼存在重大問題。你的代碼片斷顯示未經優化的代碼,調試器很容易檢索並顯示函數參數的值。讓調用者而不是被調用者分配陰影空間對調試優化代碼非常重要。編譯器可以預先爲所調用的函數調用的所有函數分配陰影存儲。讓他們輸入相同的RSP值。 –

回答

0

被調用者可能需要也可能不需要保存它們,這完全取決於情況。例如,只返回參數總和的函數可能不需要保存它們。在這種情況下,使用寄存器可以節省一個存儲和一個負載,而在另一個情況下它不會產生任何開銷(商店剛剛從調用者移動到被調用者)。

如果在調用方中將它與本地變量一起使用,分配陰影空間實際上是免費的,並且具有以下優點:如果被調用方需要保存參數,則結果塊將與其餘參數連續已經在堆棧上。