彙編中為什麼需要幀指標 ebp

時間 2021-06-02 21:43:58

1樓:土地測量員

幀指標ebp主要是用於對應高階語言(特指c/c++這樣編譯成機器碼的)的函式呼叫(但我沒考證出來這是先有雞還是先有蛋...)。在IA32上,通常每個函式呼叫的時候都會分配乙個棧幀,棧幀內儲存了一些資料,比如引數,區域性變數之類的。

ebp和esp就指向棧幀的一頭一尾。由於esp會經常改變,所以ebp作為stack frame base pointer,這樣定位棧幀中的資料會比較方便。當然,這也只是通常,隨著calling conversion的改變而改變。

比如說X86_64通常就只用到了rsp而不再需要幀指標,而且IA32上也能通過frame pointer omission optimization把幀指標優化掉。

2樓:

其他答主說的很清楚了,這裡我再補充一下,現在很多編譯器優化開起來其實都沒有push ebp; mov ebp, esp這個操作了。之所以要用ebp,是為了讓偏移固定,更好寫+更好讀,但是現在編譯器優化開起來生成的彙編就不是給你讀的,所以就直接優化掉然後全部拿esp來訪問了。

當然,如果你也是做逆向的/想要做逆向的,當我沒說

3樓:void

在子過程裡,也可能會有壓棧出棧的操作,而esp始終指向棧頂,這樣的話,你每次引用父過程的引數時,都要計算引數相對於esp的偏移量,很不方便和容易出錯,而且一旦偏移量不對時,比如引用改寫了父過程的返回位址,那子過程可能不能正常返回到父過程

所以,使用ebp壓棧,並把此時esp傳遞給ebp後,一是為了安全,在子過程和父過程的棧之間有ebp,二是方便操作,在子過程裡不用考慮esp在哪,都可以始終用ebp+8(這裡描述的是32位處理器模式)來引用第乙個引數,ebp+12引用第二個引數等,從子過程返回時,直接ebp賦值給esp,然後彈出恢復原ebp,此時esp指向父過程的返回位址,子過程正常返回

C 中的 this 為什麼是指標而不是引用?

中二青年 這個是c 作者的個人主頁,可以看一下答案,裡面還回答了,為什麼引入ref的原因。Why is this not a reference?Because this was introduced into C really into C with Classes before referenc...

為什麼 C 中,基類指標可以指向派生類物件?

WangKX 語法就這麼規定這叫多型性,如果往深點說,因為子類物件一般比父類物件大,因此這麼指並沒問題,但反過來不行比如子類指標指向父類物件 馬東啥梅來著 不同型別的指標在記憶體中所佔大小是相同的,區別在於編譯器對於指標的解釋是不同的。乙個指標指向某個類的物件,實際上是指向該物件所佔記憶體的首位址位...

為什麼 Windows 中預設需要滑鼠雙擊開啟某個專案?

雙擊這個東西,只是一些年紀大的人接受起來比較困難,但是後來的人肯定都是可以習慣雙擊的。如果要把這個方式改掉,我覺得可能又會造成一代人用不習慣。另一方面,也不要把所有的原因都歸於 歷史經驗 若如題主所說,設單機開啟,那雙擊還能做別的嗎?少了一種功能,沒法選定,不是又平添了很多煩惱?然後,如何解決那些覺...