c語言函式呼叫原理底層分析

2021-09-13 19:28:05 字數 1080 閱讀 9917

1函式的功能主要是為了復用性,不同的屬性可以引數化

2函式呼叫機制

2.1按呼叫約定傳遞引數

2.1呼叫約定

呼叫方(caller)和被調方(callee)需要約定以下內容:

1傳參順序

2傳遞引數的媒介(是放棧還是暫存器)

3清理引數的責任歸屬

4返回值的傳遞媒介(返回值是放棧還是暫存器)

__cdecl:傳參順序從右往左;

使用棧頂傳遞引數;

由呼叫方清理引數;

__stdcall:傳參順序從右往左;

使用棧頂傳遞引數;

由被調方清理引數;

__fastcall傳參順序從右往左;

左邊前兩個基本屬性型別的引數通過處理器傳遞,其餘各引數使用棧 頂傳遞引數;

由被呼叫方清理引數;

2.2儲存函式返回位址

2.2.1流程轉移到被呼叫方

2.3儲存呼叫方的棧底

2.4設定當前棧頂為被呼叫方的棧底(此時被調方處於空棧狀態)

2.5根據區域性變數所需的總空間抬高棧頂(為區域性變數分配空間)

2.6儲存處理器環境(把呼叫方的處理器中的值複製到棧頂(不儲存的話,呼叫方寄存

器的值會被被調方覆蓋))

2.7debug選項組在此時設定區域性變數的初值為0xcccccccc

2.8執行函式體

2.9恢復處理器的環境(把棧頂的值複製到處理器中)

2.10釋放區域性變數空間

2.11從棧頂取值恢復到呼叫方的棧底

2.12從棧頂取值作為返回位址

2.12.1__stdcall,__fastcal被呼叫方此時釋放引數空間

2.13流程恢復到呼叫方的**

2.13.1__cdecl呼叫方此時釋放引數空間

這些流程可以用圖表示,也可以在記憶體中檢視棧的存放順序如下圖

記憶體中棧存放如下圖

C語言底層函式

在linux系統中如果用 標準庫函式fopen,fwrite 他們會快取,如果在併發處理時,快取資料會造成資料不一致 一般用底層函式 read,write 在乙個程序中,開啟另乙個程序,system 函式是執行完命令 如果後台執行命令,就直接執行下面的 然後再輸出後台命令 再執行這個程序下面的 ex...

class底層原理分析

class 類名 會把類構造出來 實際上是 元類例項化產生類 這個物件 類例項化產生物件,一定是 類名 person 類是由type例項化產生,傳一堆引數 type 呼叫類的 init 方法 type type object or name,bases,dict object or name 類的名...

C語言底層呼叫的實現機制

call指令其實隱式完成了乙個push操作,把下一條語句的位址push進了堆疊,當然是在引數之後被push進堆疊。為了保持堆疊平衡,就要有乙個pop相對應,這個pop在函式退出的時候由ret指令完成,類似於call,ret隱式完成了乙個pop操作,把call壓入堆疊的位址pop出去,然後回到了這個位...