根據http://msdn.microsoft.com/en-us/us-en/library/ms235286.aspx和http://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
爲什麼被叫方的影子空間保存寄存器參數?如果被調用者必須將寄存器參數保存在堆棧中,爲什麼他們使用寄存器來傳遞參數,而不是直接通過堆棧傳遞所有參數?
它使您的代碼更易於調試,一般來說x64代碼存在重大問題。你的代碼片斷顯示未經優化的代碼,調試器很容易檢索並顯示函數參數的值。讓調用者而不是被調用者分配陰影空間對調試優化代碼非常重要。編譯器可以預先爲所調用的函數調用的所有函數分配陰影存儲。讓他們輸入相同的RSP值。 –