看板 CSSE 關於我們 聯絡資訊
※ 引述《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 呢? : 高位址 : +--------------------+ : + parameters + : +--------------------+ : + return address + : +--------------------+ : EBP -> + previous frame + ------ : +--------------------+ | : ESP -> + local variable + | : +--------------------+ | : + parameters + | : +--------------------+ | : + return address + | : +--------------------+ | : + previous frame + <----- : +--------------------+ : + local variable + : +--------------------+ : 低位址 : 謝謝。 這裡你要先搞懂 frame 的意思是什麼以及它的範圍 由於我們無法確定函數進來的時候的堆疊狀況 唯一能夠在堆疊裡定位的指標是進來當下的 ESP 值 (參數在它後面, 區域變數在它前面) 因此進一個函數時第一個動作就是 MOV EBP, ESP (寫成 C 就是 EBP = ESP) 把這個定位點留在 EBP 裡面, 之後要存取參數或區域變數就能用 EBP 為基準去找 所謂的 frame 就是從這個 EBP 定位點往前往後抓到的範圍 不過問題來了, 進來之前前面那個函數的 EBP 要怎麼辦? 函數結束時他的 EBP 要幫他還原, 不然他之後的動作就會爆炸 因此其實 MOV EBP, ESP 會是第二個動作, 第一個動作是要先把前面函數的 EBP 收好 那最簡單的收法就是推進堆疊, 它會存放在呼叫進來時的回傳位址的下一格 然後就可以把自己的定位點留起來了 (所以你上面那張圖其實畫反了, 低位址是後來的函數, 右邊的箭頭應該要反過來指才對) 因此你的問題, EBP 就是「定位 frame 位置的定位點」 推進堆疊的 EBP (你的 "previous frame") 其實是「上一個函數的定位點」的意思 (BP 這個名字是 base pointer 的簡寫, 由此也能看出它做為定位點的功能 不過除了這個名字之外, 它並沒有跟其他指令進行隱式聯繫 不像 SP 會跟著推進或彈出堆疊的動作調整) 剛才提到函數結束時要幫忙還原 EBP, 所以這裡會在清掉區域變數之後 把留下來的值彈出堆疊回到 EBP 裡 而再下一個值就是 return address 了, 所以這裡就會把它彈出來把流程轉回上一個函數 這樣在回去之後上一個函數的 EBP 還是保持的好好的 最後, 你可以仔細想想上面這樣講的操作, 新舊 EBP / ESP 的值之間的關係是什麼 這樣就能夠理解為什麼我會說你這圖右邊的箭頭畫反了 -- ˊ_▂▃▄▂_ˋ. ◣          ▅▅ ▅▅ ι●╮   ./◤_▂▃▄▂_◥ \'▊   HARUHI █████ <■┘   ◤◤◥█◥◥█Δ   ISM    By-gamejye ¢|\   ▌▌ζ(▏●‵◥′●)Ψ ▏           █    ⊿Δ    /|▋ |\ ▎         ハルヒ主義      ▄█ ◥◥|◣ ‵′ ◢/'◢◢S.O.S 世界をいに盛り上げるための宮ハルヒの    -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.192.32 ※ 文章網址: https://www.ptt.cc/bbs/CSSE/M.1535550748.A.72C.html