※ 引述《gn00618777 (非常念舊)》之銘言:
: 首先,我為我天資駑鈍感到抱歉,翻了google 好幾頁,我仍然看不懂。
: stack 從上往下長 (高位址 -> 低位址)
: step1 caller 會將 callee 的 parameters 推入 stack
: step2 caller 將 callee 的 return address 推入 stack
: step3 ..
: 問題1: ESP 指向 stack top,所以 pop 時,會先從 local variable 拿出並歸還空間。
: 那拿出 return address 要幹嘛? 直接返回了嗎? 那這樣一開始放的 parameters
: 不就沒處理到?
所以需要有人來處理
以你在找的 x86 來說, 常見的做法是呼叫方處理 (關鍵字: cdecl)
你有辦法看到函數呼叫的組語時的話會看到在 call 之後會有一條 ADD ESP, xx
那就是在處理掉參數的部份, 直接把 ESP 往高位址加就等於丟掉中間這一塊的範圍
不過因為這個算是函數呼叫的約定 (關鍵字: calling convension / 呼叫慣例)
所以只要有約定好, 那也是能夠讓被呼叫方在回去時順便處理的
(就是彈出一個值, 跳過去, 順便幫忙彈出 N 個值)
只是這個在 C 語言裡相對沒有上面那種那麼常見而已 (關鍵字: stdcall)
: 問題2: EBP呢? EBP定義是指向目前的 frame
: 會怎樣運作? 我知道 ESP 每次 pop,他就會 ESP = ESP - 4,那 EBP 呢?
: 高位址
: +