ESP,EBP,棧回溯基本原理

2021-07-04 00:23:48 字數 806 閱讀 5682

[軟體除錯].張銀奎

我們看到,儘管可以使用相對於棧頂(esp暫存器)的偏移來引用區域性變數,但是因為esp暫存器經常變化,所以用這種方法引用同乙個區域性變數的偏移值是不固定的。這種不確定性對於cpu來說不成什麼問題,但在除錯時,如果要跟蹤這樣的**,那麼很容易就被轉得頭暈眼花,因為現實的函式大多有多個區域性變數,可能還有層層巢狀的迴圈,棧指標變化非常頻繁。

為了解決以上問題,x86 cpu 設計了另乙個暫存器,這就是ebp暫存器。ebp的全稱是extended base pointer,即拓展的基址指標。使用ebp暫存器,函式可以把自己將要使用的棧空間的基準位址記錄下來,然後使用這個基準位址來引用區域性變數和引數。在同一函式內,ebp暫存器的值是保持不變的,這樣函式內的區域性變數便有了乙個固定的參照物。

通常,乙個函式在入口處將當時的ebp值壓入堆疊,然後把esp值(棧頂)賦給ebp,這樣ebp中的位址就是進入本函式時的棧頂位址,這一位址上面(位址值遞減方向)的空間便是這個函式將要使用棧空間,它下面(位址值遞增方向)是父函式使用的空間。如此設定ebp後,便可以使用ebp加正數偏移來引用父函式的內容,使用ebp加負數便宜來引用本函式的區域性變數,比如ebp+4 指向的是call指令壓入的函式返回位址;ebp+8是父函式壓在棧上的第乙個引數,ebp+0xc是第二個引數,一次類推;ebp-n是第乙個區域性變數的起始位址(n為變數的長度)。

因為在將棧頂位址(esp)賦給ebp暫存器之前先把舊的ebp值儲存在棧中,所以ebp暫存器所指向的棧單元中儲存的是前乙個ebp暫存器的值,這通常也就是父函式的ebp的值。類似的父函式的ebp所指向的棧單元中儲存的是更上一層函式的ebp值,以此類推,直到當前執行緒的最頂層函式。這也正是棧回溯的基本原理。

mysql的基本原理 Mysql 基本原理

mysql 基本原理 mysql是一種關聯式資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,而不是將所有資料放在乙個大倉庫內,這樣就增加了速度並提高了靈活性 ysql是資料庫登入命令 uroot預設超級使用者登入 p 預設沒密碼 中寫密碼 mysqladmin uroot password 12...

8 2 1 基本原理

乙個舞台動畫物件在包含許多舞台資訊 出現在何處,佔多大面積,處在什麼角度,是否可見 這些資訊分別儲存在動畫物件的屬性中。在 中讀取這些屬性可以了解物件的位置 大小 角度等狀態資訊 修改這些屬性可以改變物件的位置 大小 角度等狀態。如果從資料的角度去理解,動畫就是在固定時間間隔點不斷修改動畫物件某項屬...

Csocket基本原理

我通過幾個採用 csocket 類編寫並基於 client server 客戶端 服務端 的網路聊天和傳輸檔案的程式 在除錯這些程式的過程中,追蹤深入至 csocket 類核心原始碼 sockcore.cpp 對於csocket 類的執行機制可謂是一覽無遺,並且對於阻塞和非阻塞方式下的 socket...