C 筆記 函式堆疊呼叫 呼叫約定 形參預設值

2021-09-21 02:08:02 字數 1490 閱讀 7254

1.通過加斷點—除錯----視窗-----轉到反彙編可以檢視函式的堆疊呼叫過程:

#includeint sum(int lhs, int rhs)

int main()

知識點補充:

1.底層對於變數沒有使用變數名進行區分而是使用棧底指標偏移量進行區分。

2.等號是右結合性,先運算等號的右邊。

3.對小於8位元組的返回值是交給eax暫存器(四位元組由乙個暫存器,大於4小於8由兩個暫存器(eax,edx)帶回),由eax暫存器將返回值帶回

大於8位元組由臨時量把值帶回來,臨時量的位址記錄在eax暫存器中,是由臨時量帶回的。

4.函式傳參:壓入實參的值,壓入順序(從右向左壓)

5.c語言呼叫約定中,形參記憶體清理誰開闢誰清理。

函式呼叫流程:

2.函式的呼叫約定

呼叫約定:是乙個呼叫規範,約定了一些呼叫規則。

1.約束了符號的生成。

2.約束了入棧順序(c/c++體系所有的呼叫約定入棧順序都是從右向左,其他語言會有改變)。

3.約束了形參記憶體的棧幀開闢和清理。

1._cdcel

c標準的呼叫約定,所有c++中的全域性函式或者普通函式都是_cdcel的呼叫約定。

形參棧幀開闢由呼叫方開闢,清理由呼叫方。

2._stdcall

windows的標準呼叫約定

連線時發生符號解析的錯誤,sum函式預設的呼叫約定是_cdcel

外部引用的符號在符號表中存放在undefine區域中。

引數棧幀開闢由呼叫方開闢,由被呼叫方清理。

前倆個形參是由暫存器帶入被呼叫方,沒有記憶體開闢以後的形參都是與stdcall相同的呼叫約定。

4._thiscall 只屬於c++的成員函式的呼叫約定

3.c++中帶預設值的函式

針對形參的預設值進行分析。

形參預設值:一定要沿著形參列表從右向左依次給值。

通過多個宣告,最後分析得到的為

預設值只能賦值一次。

函式呼叫約定和堆疊

編譯器一般使用堆疊實現函式呼叫。堆疊是儲存器的乙個區域,嵌入式環境有時需要程式設計師自己定義乙個陣列作為堆疊。windows為每個執行緒自動維護乙個堆疊,堆疊的大小可以設定。編譯器使用堆疊來堆放每個函式的引數 區域性變數等資訊。函式呼叫經常是巢狀的,在同一時刻,堆疊中會有多個函式的資訊,每個函式占用...

函式呼叫約定和堆疊

編譯器一般使用堆疊實現函式呼叫。堆疊是儲存器的乙個區域,嵌入式環境有時需要程式設計師自己定義乙個陣列作為堆疊。windows為每個執行緒自動維護乙個堆疊,堆疊的大小可以設定。編譯器使用堆疊來堆放每個函式的引數 區域性變數等資訊。函式呼叫經常是巢狀的,在同一時刻,堆疊中會有多個函式的資訊,每個函式占用...

函式呼叫約定和堆疊

編譯器一般使用堆疊實現函式呼叫。堆疊是儲存器的乙個區域,嵌入式環境有時需要程式設計師自己定義乙個陣列作為堆疊。windows為每個執行緒自動維護乙個堆疊,堆疊的大小可以設定。編譯器使用堆疊來堆放每個函式的引數 區域性變數等資訊。函式呼叫經常是巢狀的,在同一時刻,堆疊中會有多個函式的資訊,每個函式占用...