每乙個函式都有乙個函式幀(就是以ebp為基位址,esp為頂位址),而函式之間的呼叫會出現幀的切換,這時用到了兩個暫存器,esp與ebp,那麼它們的作用與關心是怎樣的呢:由兩句話可知:
esp:棧(頂)指標,始終指向棧頂,當遇到push、pop、call、ret等指令時它會改變,因此,程式設計師使用它來進行資料定址是不方便的。
ebp:棧指標,一旦賦值,除非顯式修改其值不會改變。它便於程式設計師用來在棧上資料的定址程式設計。ebp就是用來計算棧上資料位置的乙個相對固定的參照點。
其實,只要弄懂函式呼叫前和呼叫後的**就可以弄清楚一切:
呼叫前:
push 函式位址;儲存函式返回位址。
push ebp ;儲存原幀的幀底。
move ebp, esp; 開始新幀的幀底。
呼叫後:
move esp , ebp; 返回原幀幀頂。
pop ebp; 返回原幀的幀底。
ret; 返回原函式位址,這裡等於eip = ss:(esp+2);這裡的esp+2什麼意思呢,因為 在**move esp , ebp;執行時,esp的位址距離函式的返回位址之間隔了兩個esp單位,相對位置為 esp +2*4b;所以要加個2,就程式指標就指向了函式的返回位址。
ebp 函式堆疊esp 什麼是堆疊?
堆與棧是兩種資料結構,並不是一種資料結構,堆是堆,棧是棧。1 棧 是一種只能在一端進行插入和刪除的資料結構。允許插入與刪除的一端被稱為棧頂,另一端被稱為棧底。按照先進後出的順序儲存資料。最先進入的資料存放在棧底,最後進入的資料存放在棧頂。當棧裡的元素為空時,稱為空棧。在函式呼叫的時候用於儲存斷點,遞...
使用棧傳遞引數,ESP與EBP
棧的訪問有兩種 隱式,由處理器執行如push,pop,call,ret等指令時自動進行,需用到esp 指令指標暫存器 將棧視為一般的資料段,直接訪問其中內容,需要到ebp 棧基址暫存器 如指令mov edx,ebp 使用ebp時不用字首,預設ss,ss描述符快取記憶體器中32位基位址 ebp提供32...
esp暫存器與ebp暫存器介紹
esp extended stack pointer 是指標暫存器的一種 另一種為ebp 用於堆疊指標。esp為棧指標,用於指向棧的棧頂 下乙個壓入棧的活動記錄的頂部 而ebp為幀指標,指向當前活動記錄的頂部。棧指標與幀指標標識出了當前活動記錄的位置。當函式被呼叫的時候,執行如下操作 將幀指標壓入棧...