呼叫約定:
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中,計算 機沒有辦法知道乙個函式呼叫需要多少個 ...