函式堆疊呼叫

2021-09-25 09:45:56 字數 696 閱讀 6182

以上兩張圖做了四件事情:

(1)將呼叫方的棧底指標入棧.

(2)讓原本指向呼叫方棧底的ebp指向當前函式的棧底.

(3)給當前函式開闢棧幀.

(4)對開闢的棧幀進行初始化.

總結:函式的執行都是在棧上開闢記憶體的.

棧是通過esp(棧頂指標),ebp(棧底指標)兩個指標來標識的

對於棧上的訪問都是通過棧底指標的偏移來訪問的

在call乙個函式時,有兩件事情:先將呼叫函式的下一行指令的位址壓入棧中,再進行跳轉.

在函式呼叫時檢查函式是否宣告,函式名是否相同,函式的引數列表是否匹配,函式的返回值多大.

(1)如果(函式的返回值<=4個位元組),則返回值通過暫存器eax帶回.

(2)如果(4《函式的返回值<=8個位元組),則返回值通過兩個暫存器eax和edx帶回.

(3)如果(函式的返回值》8個位元組),則返回值通過產生的臨時量帶回.

6.函式結束ret指令幹了兩件事:先出棧,再將棧的值放到cpu的pc暫存器中,因為pc暫存器中永遠放的是下一次執行指令的位址,所以就在函式呼叫完之後依舊接著原來的**繼續執行.

函式呼叫堆疊

一 函式呼叫堆疊 認真體會每一行指令位址!include intsum int a,int b mov ebp,esp 讓esp回退到ebp的位置,回退棧幀的過程中,沒有對棧幀中的值進行清0的操作 pop ebp 出棧並把出棧的值賦給ebp int main 下圖為上面示例函式,程式在sum函式中,...

函式呼叫堆疊

一 棧 1 傳統的棧 被定義為乙個特殊的容器,使用者可以將資料壓入棧中,也可以將壓入 棧中的資料彈出,但必須遵守一條規則 先進後出。2 計算機系統中的棧 是乙個有以上屬性的動態記憶體區域,壓棧操作使得棧增大,彈出操作使棧減小。棧通常是向下增長的。3 最重要的是棧儲存了乙個函式呼叫所需的維護資訊,這通...

函式呼叫堆疊

乙個函式的執行在棧上開闢記憶體。在函式呼叫時,第乙個進棧的是主函式呼叫語句的下一條可執行語句的位址,然後是函式的各個引數。在大多編譯器中,引數是由右往左入棧的,然後再是函式中的區域性變數。下面給乙個例項 int sum int a,int b int main 其中,main函式的反彙編指令 其中,...