簡體   English   中英

x64 程序集中的“陰影空間”是什么?

[英]What is the 'shadow space' in x64 assembly?

我找到了很多關於這個陰影空間的話題,但我都找不到答案,所以我的問題是:

在進入過程之前,我需要從堆棧指針中減去多少字節?

在減去“陰影空間”之前,我應該將過程參數推入堆棧嗎?

我已經反匯編了我的代碼,但我找不到邏輯。

Shadow 空間(有時也稱為Spill 空間Home 空間)位於被調用函數擁有的返回地址上方 32 個字節(並且可以用作臨時空間),低於堆棧參數(如果有)。 調用者必須在運行call指令之前為其被調用者的影子空間保留空間。

它旨在用於使調試 x64 更容易。

回想一下, 前 4 個參數是通過寄存器傳遞的 如果您闖入調試器並檢查線程的調用堆棧,您將看不到任何傳遞給函數的參數。 存儲在寄存器中的值是瞬態的,在調用堆棧向上移動時無法重建。

這就是Home 空間發揮作用的地方:編譯器可以使用它在堆棧上保留寄存器值的副本,以便稍后在調試器中進行檢查。 這通常發生在未優化的構建中。 但是,當啟用優化時,編譯器通常將Home 空間視為可用於臨時使用。 堆棧上沒有任何副本,調試故障轉儲變成了一場噩夢。

調試優化 x64 代碼的挑戰提供了有關該問題的深入信息。

影子空間是必須為被調用過程保留的強制性 32 字節(4x8 字節)。 這只是意味着您必須在調用之前在堆棧上提供 32 個字節。 這個空間可以保持未初始化,沒關系。

請注意,在 x64 調用約定中,第 4 個之后的參數被壓入堆棧,這些參數位於此影子空間的頂部(壓入 32 個字節之前)。

簡而言之,您可以看到好像 x64 中的函數至少有 4 個參數,但寄存器中的 4 個參數的值在前。

調用 x64 時還應考慮堆棧對齊等問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM