函式呼叫堆疊

2021-08-09 23:57:25 字數 1215 閱讀 3928

1.函式呼叫堆疊

壓棧

呼叫函式:

1.壓入形參變數的位址和值

2.壓入函式呼叫返回後要執行的指令的位址

被呼叫函式:

1.壓入呼叫函式的棧底指標,把棧底指標暫存器指向被呼叫函式的棧底

2.開闢被呼叫函式的棧幀大小,並初始化為cc

清棧

被呼叫函式

1.清理被呼叫函式開闢的棧幀大小

2.回退棧底指標到呼叫函式的棧底

3.把回退到呼叫函式要執行的指令位址給pc暫存器

呼叫函式:

1.清理形參變數的記憶體

2.函式的返回值

1.    <=4 eax  值

2.    <4<=8 eax edx

3.    >8 開闢乙個臨時量(函式呼叫之前就產生,被呼叫函式return處通過ebp-8訪問)

eax  帶出臨時量的位址

迴圈拷貝到接收返回值的變數的位址空間

3.函式的呼叫約定

_cdecl           c的呼叫約定

_stdcall         windows下的標準呼叫約定

_fastcall        快速呼叫約定

_thiscall        c++的成員函式呼叫約定

1.符號的生成方式不同

ld 合併符號表

main: 符號表 _cdecl    ?sum@@yahhh@z  *und*  global

符號解析    

test:        _stdcall  ?sum@@yghhh@z  .text  global

_fastcall ?sum@@yihhh@z

2.引數的壓棧方式不同(引數入棧順序不同)

3.函式的形參記憶體清理

_cdecl  呼叫方開闢  呼叫方清理

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

_fastcall

<= 8  

暫存器帶值   不需要形參變數的清理

>  8

前2個形參暫存器帶值   不需要形參變數的清理

後面的和stdcall呼叫方式一樣

函式呼叫堆疊

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