C 開棧 清棧 呼叫約定

2021-09-29 05:36:59 字數 865 閱讀 5637

1.開棧:

1.壓入實參(給形參做初始化,自右向左入棧);

2.壓入下一行指令位址(回退後能沿著呼叫點繼續執行);

3.(push ebp)壓入呼叫方棧底位址(能回退到呼叫方棧幀);

4.被呼叫方開闢記憶體並做cccccccc初始化;

2.清棧:

1.被呼叫方預留的棧幀清理;

2.pop ebp (棧幀回退到呼叫方);

3.pop pc(**沿著呼叫方接著執行);

4.清理形參; 形參由呼叫方開闢記憶體,呼叫方清理。

小於等於四個位元組都由乙個暫存器帶出(eax)

大於四個且小於八個位元組由兩個暫存器帶出(eax+edx)

大於八個位元組由臨時量tmp帶出(在呼叫方棧幀);

3.呼叫約定:

_cdcallc標準呼叫約定

_stdcall

windows標準呼叫約定

_fastcall

快速呼叫約定

_thiscall

類成員方法的標準呼叫約定

函式呼叫過程 棧幀 呼叫約定

考慮函式呼叫 func 1,2 需要把1和2這兩個引數進行傳遞,這裡的引數傳遞可以通過兩種方式 1.引數入棧 記憶體 2.引數傳遞到暫存器 大多數情況下,也是c c 的預設形式是通過棧進行傳遞,因為雖然暫存器傳遞方式快但是暫存器數量有限 引數壓入棧中 記憶體 cs ip指向下一條指令位址需要進行跳轉...

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

呼叫約定 1 在執行子函式之前,程式先壓入子函式的所有引數,以逆序的方式壓入 即先壓入最後乙個引數 2 然後程式執行call指令,指定哪一函式即將執行,call指令主要做了以下兩件事情 a 第一,將下一指令的位址壓入棧 即函式的返回位址 b 第二,更改 eip,使其指向函式的起始位址。該操作後,函式...

棧 呼叫約定 函式預設值 inline函式

data存放已初始化但初始化不為0的資料 bss存放未初始化或初始化為0的資料 強弱符號 強符號 已初始化的全域性變數 弱符號 未初始化的全域性變數 規則 1 兩強符號 重定義錯誤 2 一強一弱,選強符號 3 兩弱符號,針對編譯器不同選擇不同 函式堆疊呼叫 move 移值 lea 移位址 四個暫存器...