共用方式為


堆疊配置

函式的初構 (Prolog) 負責配置堆疊空間給區域變數、儲存的暫存器、堆疊參數和暫存器參數。

參數區域固定位於堆疊的底部 (即使使用了 alloca 也是如此),因此它一定會在發出任何函式呼叫期間與傳回位址相鄰。 它至少包含四個項目,但一定會有足夠的空間來存放可能被呼叫的函式所需的所有參數。 請注意,即使參數本身的主要位址並非堆疊,暫存器參數一定會配置得到空間;被呼叫端保證已配置好空間,可供所有參數使用。 暫存器引數需要主要位址 (Home Address),萬一被呼叫的函式需要用到引數清單 (va_list) 的位址或個別引數時,才能使用相鄰區域。 這個區域在執行 Thunk 期間也可以充當暫存器引數的儲存區,或做為偵錯選項 (例如偵錯時,如果初構程式碼中的引數儲存於主要位址內,這個區域可以讓引數輕易被找到)。 即使被呼叫函式的參數數目少於 4 個,這 4 個堆疊位置也會由被呼叫的函式有效地擁有,並可以由被呼叫的函式用在儲存參數暫存器值以外的用途。 因此,在進行函式呼叫時,呼叫端可能無法將資訊儲存在堆疊的這個區域中。

如果函式中的空間是以動態方式配置 (alloca),就必須使用靜態暫存器做為框架指標,才能標示堆疊固定部分的基本處理,且該暫存器必須在初構中儲存及初始化。 請注意,若使用 alloca,則來自同一個呼叫端對同一個被呼叫端的呼叫,其暫存器參數的主要位址可能不相同。

堆疊固定會維持 16 個位元組對齊方式,但在初構之內 (例如在推入傳回位址之後),以及在函式型別中指定的特定框架函式類別除外。

以下是堆疊配置 (Layout) 的範例,其中函式 A 會呼叫非分葉函式 B。 函式 A 的初構在堆疊底部已具備配置的空間,供 B 所需的所有暫存器和堆疊參數使用。 呼叫會推入傳回位址,而 B 的初構則會配置空間供區域變數和靜態暫存器使用,並配置呼叫函式所需的空間。 如果 B 使用 alloca,空間就會配置在區域變數/靜態暫存器儲存區域和參數堆疊區域之間。

AMD 轉換範例 5 圖形

當函式 B 呼叫另一個函式時,傳回位址會被推入 RCX 主要位址的正下方。

請參閱

參考

堆疊使用方式