理解函數調用過程中棧幀的建立與銷毀,是掌握 C 語言運行時機制、調試崩潰堆棧、編寫高性能代碼的基礎。
CALL 指令將下一條指令地址壓棧。PUSH EBP,將調用者 A 的 EBP 保存。MOV EBP, ESP,以當前 ESP 為 B 的棧底。SUB ESP, N,在棧上預留空間。EBP + offset 訪問參數,EBP - offset 訪問局部變量。MOV ESP, EBP(或 LEAVE):恢復 ESP 到幀基址,釋放局部變量空間。POP EBP:恢復調用者 EBP。RET:彈出返回地址跳轉,調用者再清理參數(cdecl)。leave # 等價於 mov %ebp, %esp ; pop %ebp ret # 彈出返回地址並跳轉
[高地址] | 調用者 A 的局部變量 | <- EBP_A (舊 EBP) | 返回地址 (指向 A 後續) | <- ESP 執行 CALL 後 | 被調用者 B 的舊 EBP | <- EBP_B (新幀基址) <- PUSH EBP 後 | B 的局部變量空間 | <- ESP (棧頂) <- SUB ESP 後 [低地址]
bt 回溯堆棧正是沿 EBP 鏈遍歷。