呼叫堆疊是程式執行時期儲存函數呼叫資訊的動態資料結構,包含返回位址、參數、區域變數、呼叫者框架指標。
高位址 +----------------+ | 呼叫者參數 | ← EBP + 8, +C, ... +----------------+ | 返回位址 | ← EBP + 4 +----------------+ | 舊 EBP (Caller)| ← EBP, [EBP] +----------------+ | 區域變數 | ← EBP - 4, -8, ... +----------------+ 低位址
int SumFromOne(int d) {
int sum = 0xABCD; // 特徵值方便識別
if (d == 1) sum = 1;
else sum = d + SumFromOne(d-1);
return sum;
}
main() { SumFromOne(10); }
cl /Zi test.c (產生 PDB)windbg test.exebp test!SumFromOne+0x... (第 4 行)gr ebpVirtual = EBP-10,格式 Long Hex| 位置 | 內容 | 驗證值 |
|---|---|---|
EBP+4 | 返回位址 | 0040106B (呼叫後下一指令) |
EBP+8 | 參數 d | 0x0A (10) |
EBP-4 | 區域變數 sum | 0xABCD (初始值) |
[EBP] 指向呼叫者 EBP,形成單向鏈表push ebp; mov ebp, esp 建立框架pop ebp; ret 恢復並返回EBP 負偏移,參數在正偏移為什麼這些資料在這些位置?→ 呼叫慣例 定義了壓棧順序、清理責任、暫存器分配規則。