函式堆疊呼叫

2021-09-25 10:27:43 字數 1055 閱讀 8615

函式堆疊呼叫過程:

(1)開闢形參內容並初始化

(3)壓入呼叫方棧底指標的值

(4)開闢區域性變數所需要的棧空間並初始化

1、開棧:

壓入實參 形參初始化 自右向左

壓呼叫方的棧底位址

跳轉到被呼叫方函式棧幀上

被呼叫方函式活動開闢空間  //給被呼叫方的活動開闢空間

2、清棧

清理空間

清理形參  

3.函式返回值

函式的返回值由暫存器帶出來  

<= 4    eax

>4 <=8  eax edx

>8      臨時量

4、四種呼叫約定

(1)_cdecl      c標準呼叫約定  ya         //?sum@@yahhh@z

(2)_stdcall    windows標準呼叫約定 yg  //?sum@@yghhh@z 自右向左依次入棧

(3)_fastcall   快速呼叫約定 yi        //?sum@@yihhh@z

(4)_thiscall   類成員呼叫約定

5、呼叫約定約定了

(1)函式符號的生成

(2)實參的入棧順序

(3)形參的開闢和清理

_cdecl    //形參的開闢由呼叫方開闢,呼叫方清理

_stdcall  //呼叫方開闢,被呼叫方清理

_fastcall //沒有形參開闢,如果有實參的壓棧,呼叫方開闢,被呼叫方清理

6、形參的入棧順序由右向左

支援可變參,從左向右不知道實參個數大小,從右向左,能遍歷到最後面,表明已經知道了引數的個數

7、函式的執行都是在棧上開闢記憶體

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

8、在call乙個函式時,有兩件事要做:

函式呼叫堆疊

一 函式呼叫堆疊 認真體會每一行指令位址!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函式的反彙編指令 其中,...