在 x86 架構下,`EIP` (指令指標)、`EBP` (基底指標)、`ESP` (堆疊指標) 三大暫存器共同維護函數呼叫的堆疊幀結構,實現區域變數儲存、參數傳遞、返回位址保存與呼叫鏈追蹤。
| 暫存器 | 全名 | 核心角色 | 指向內容 |
|---|---|---|---|
| EIP | Instruction Pointer | 下一條指令位址 | 程式碼區,CPU 取指依據 |
| EBP | Base Pointer | 堆疊幀基址 (Frame Pointer) | 當前函數堆疊幀底部 |
| ESP | Stack Pointer | 堆疊頂指標 | 當前堆疊最頂端 (增長方向向下) |
void fun(void) {
printf("hello world");
}
void main(void) {
fun();
printf("函數調用結束");
}
EIP: 指向 `call fun` 指令 ESP: 指向 main 的堆疊頂 EBP: 指向 main 的堆疊幀基址
push ebp ; 保存呼叫者 EBP
mov ebp, esp ; 建立新堆疊幀基址
sub esp, N ; 配置區域變數空間 (N bytes)
EBP: 新堆疊幀基址 (指向保存的舊 EBP) ESP: 配置區域變數後的堆疊頂 堆疊佈局 (高位址 → 低位址): [呼叫者 EBP] ← EBP [返回位址] [區域變數...] ← ESP
mov esp, ebp ; 恢復堆疊指標 (釋放區域變數)
pop ebp ; 恢復呼叫者 EBP
ret ; 彈出返回位址到 EIP,ESP += 4
EIP: 指向 main 中 `call fun` 後的 `printf("函數調用結束")`
ESP: 還原為呼叫前狀態
EBP: 還原為 main 的堆疊幀基址
編譯器最佳化 (`-O2` `/O2`) 可能啟用 FPO (Frame Pointer Omission):
理解 EIP/EBP/ESP 協作機制,是掌握 x86 程式執行模型、撰寫系統級程式碼、進行深度除錯與安全分析的基石。