Call Stack(呼叫堆疊)是執行期記錄「尚未返回的函數」資訊的資料結構。每個未完成的函數調用佔用一個 Stack Frame(棧幀),棧幀包含參數、返回位址、暫存器備份、區域變數等。現代 CPU 多以「向下增長」的記憶體模型管理堆疊,Stack Pointer (SP) 指向棧底。
$4-$7,其餘入堆疊且須預留空間。高位址 | 先前幀殘留 | ← 較舊的呼叫者 |------------------| | 參數 6..1 | ← 呼叫者幀:溢位參數區 |------------------| ← previous SP | 返回位址 (RA) | |------------------| | 被呼叫者保存暫存器 | ← $16-$23 等 callee-saved |------------------| | 區域變數 | |------------------| | 下一層調用參數區 | ← 當前 SP 低位址
圖中 SP 指向幀底部。進入函數時 SP 向下移動 N bytes 完成配置;期間 SP 不再移動,所有存取以固定偏移完成。這與 x86 的 push/pop 動態移動 SP 截然不同。
RISC 架構指令長度固定(≤32 bits),無法直接編碼 32-bit 絕對位址,故需 RA (Return Address, $31) 暫存器實現返回。非葉子函數必須將 RA 存入自身幀,防止後續呼叫覆蓋。
MIPS 等無專用 BP 的架構,進入函數一次性配置整個幀,後續皆用 SP + offset 定址。優點是釋放一個通用暫存器;缺點是偏移計算較複雜,除非編譯器最佳化極佳。
理解棧幀不僅是編譯器作者的必修課,對除錯最佳化代碼、分析核心傾印、編寫高效能系統程式同樣關鍵。