CSSE 板


LINE

※ 引述《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://webptt.com/m.aspx?n=bbs/CSSE/M.1535550748.A.72C.html







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP