c語言呼叫約定(x86下的呼叫棧示意)

2021-06-17 17:11:46 字數 1174 閱讀 3722

呼叫約定:

1、在執行子函式之前,程式先壓入子函式的所有引數,以逆序的方式壓入(即先壓入最後乙個引數)。

2、然後程式執行call指令,指定哪一函式即將執行,call指令主要做了以下兩件事情:

a)第一,將下一指令的位址壓入棧(即函式的返回位址);

b)第二,更改%eip,使其指向函式的起始位址。

該操作後,函式棧如下所示:

parameter #n

...parameter 2

parameter 1

return address <--- (%esp)

3、接下來函式本身需要做以下事情:

a)首先,執行pushl %ebp儲存函式幀指標;

b)其次,執行movl %esp, %ebp拷貝棧指標到函式幀指標暫存器中;此操作使得使用者可以通過%ebp來訪問到到函式的引數,%ebp通常是函式開始時的棧指標,每個引數可以用%ebp基址指標定址的方式進行訪問;

c)然後,函式需要預留一定的棧空間,來儲存所有的區域性引數,他們的宣告週期與該函式相同

執行後,其函式棧如下所示:

parameter #n <--- n*4+4(%ebp)

...parameter 2 <--- 12(%ebp)

parameter 1 <--- 8(%ebp)

return address <--- 4(%ebp)

old %ebp <--- (%ebp)

local variable 1 <--- -4(%ebp)

local variable 2 <--- -8(%ebp) and (%esp)

4、當函式結束時,將做以下3件事

a)將返回值儲存至%eax;

b)恢復棧資訊, 

(movl %ebp, %esp) (popl %ebp)

c)執行ret指令。將棧頂值(函式返回位址)彈出,並設定%eip為該值

備註:(%ebp) 

has the old 

%ebp

, 4(%ebp) 

has the return address, and 

8(%ebp) 

is the location of the first parameter to the function.

X86 X64 函式呼叫約定

c 語言有 cdecl stdcall fastcall naked pascal。c 語言有 cdecl stdcall fastcall naked pascal thiscall,比 c 語言多出一種 thiscall 呼叫方式。下面詳細介紹如上六種呼叫方式 1 cdecl cdecl呼叫約定...

C 開棧 清棧 呼叫約定

1.開棧 1.壓入實參 給形參做初始化,自右向左入棧 2.壓入下一行指令位址 回退後能沿著呼叫點繼續執行 3.push ebp 壓入呼叫方棧底位址 能回退到呼叫方棧幀 4.被呼叫方開闢記憶體並做cccccccc初始化 2.清棧 1.被呼叫方預留的棧幀清理 2.pop ebp 棧幀回退到呼叫方 3.p...

C語言函式呼叫約定

在c語言中,假設我們有這樣的乙個函式 int function int a,int b 調 用時只要用result function 1,2 這樣的方式就可以使用這個函式。但是,當高階語言被編譯成計算機可以識別的機器碼時,有乙個問題就凸現出來 在cpu中,計算 機沒有辦法知道乙個函式呼叫需要多少個 ...