2011-08-21 19 views
7

我正在學習Windows上的x64程序集以獲得「樂趣」。該MSDN documentation for the x64 calling convention on Windows說:在Win64 ABI中,保留的參數堆棧空間是否可用於通用存儲?

調用者負責爲參數到被叫分配空間,必須始終分配足夠的空間爲4個寄存器參數,即使被叫方不具有如此之多的參數。這有助於支持C unprototyped函數和vararg C/C++函數的簡單性。

由於我的功能不是C unprototyped功能或可變參數C/C++函數,這意味着什麼我可以隨時我的函數內使用[rsp+8][rsp+32](假設rsp未修飾的值的調用後右)通用存儲,像局部變量一樣?

回答

6

是的,您可以使用入站參數暫存空間用於任何目的。但是您已經知道這一點:修改入站參數的合法性已經暗示了執行此操作的權限。

void somefunction(int arg1) 
{ 
    arg1 = anyvalue; // mov [rsp+8], anyvalue 
} 
+0

感謝您的明確答案。但是,由於參數是通過'rcx'傳遞的,所以修改入站參數應該是'mov rcx,anyvalue',這就是爲什麼我不確定'[rsp + 8]'。 – Trillian

+3

但你也被允許泄漏入站參數。畢竟,這就是爲什麼預留的空間在那裏。 'void somefunction(int arg1){/ * spill:mov [rsp + 8],rcx */arg1 = anyvalue;/* mov [rsp + 8],anyvalue * /}' –

1

我想他正試圖做的是更多這樣的事情:

*(decltype(&anyvalue))((PBYTE)&arg1+8) = anyvalue; // mov [rsp+8+8], anyvalue 

據我瞭解,微軟表示你需要爲被叫方存儲四個分配足夠的空間寄存器(rcx,rdx,r8,r9),即使在只有一個參數的函數中(在rcx中)也是如此。

注意:對於醜陋的c代碼和混合了新decltype關鍵字的舊學校演員表抱歉

相關問題