使用棧傳遞引數,ESP與EBP

2021-10-02 22:35:03 字數 872 閱讀 5393

棧的訪問有兩種:

隱式,由處理器執行如push,pop,call,ret等指令時自動進行,需用到esp(指令指標暫存器);

將棧視為一般的資料段,直接訪問其中內容,需要到ebp(棧基址暫存器)。

如指令mov edx,[ebp]:使用ebp時不用字首,預設ss,ss描述符快取記憶體器中32位基位址+ebp提供32位偏移==> 32位線性位址,訪問取得乙個雙字,傳送到edx。

先將要傳的引數壓棧,最後執行指令mov ebp,esp儲存最後乙個引數棧中偏移量,esp由於永遠指向棧頂會發生變化,則可以通過esp訪問所有的引數。

上圖為壓入必要引數之後,執行指令mov ebp,esp後的棧狀態。

注在32位模式下,訪問棧用的是esp,預設運算元為雙字,所以如上圖最後執行指令push es之後,實際是先零擴充套件,將16位值擴充套件成32位,高16位全0,再入棧,pop則相反。

按呼叫約定__stdcall 呼叫函式print(int p1,int p2)

//呼叫前esp = nn

//開始呼叫,此時還沒進入函式內部

push p2 ;引數2入棧, esp = nn - 4h

push p1 ;引數1入棧, esp = nn - 8h

call print ;近呼叫,eip入棧, esp = nn - 0ch

//進入函式內部

ESP(棧頂指標)EBP(棧底指標)

1 esp 棧指標暫存器 extended stack pointer 其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的棧頂。由於棧的位址大小是從上到下從大到小,所以esp指在棧的最底端。2 ebp 基址指標暫存器 extended base pointer 其內存放著乙個指標,該指標永遠指...

函式幀的esp與ebp操作

每乙個函式都有乙個函式幀 就是以ebp為基位址,esp為頂位址 而函式之間的呼叫會出現幀的切換,這時用到了兩個暫存器,esp與ebp,那麼它們的作用與關心是怎樣的呢 由兩句話可知 esp 棧 頂 指標,始終指向棧頂,當遇到push pop call ret等指令時它會改變,因此,程式設計師使用它來進...

esp暫存器與ebp暫存器介紹

esp extended stack pointer 是指標暫存器的一種 另一種為ebp 用於堆疊指標。esp為棧指標,用於指向棧的棧頂 下乙個壓入棧的活動記錄的頂部 而ebp為幀指標,指向當前活動記錄的頂部。棧指標與幀指標標識出了當前活動記錄的位置。當函式被呼叫的時候,執行如下操作 將幀指標壓入棧...