編譯鏈結執行原理 函式呼叫約定

2021-08-31 13:53:18 字數 1780 閱讀 6466

一、定義:函式呼叫約定,是指當乙個函式被呼叫時,函式的引數會被傳遞給被呼叫的函式和返回值會被返回給呼叫函式。函式的呼叫約定就是描述引數是怎麼傳遞和由誰平衡堆疊的,當然還有返回值。

呼叫約定,約束的是:

1.實參入棧順序

2.形參的開闢和清理方式

3.約定函式符號的生成

二、幾種型別:__stdcall,__cdecl,__fastcall,__thiscall,__nakedcall,__pascal

__caecl c標準呼叫約定

__stdcall windows標準的呼叫約定

__fastcall 快速呼叫約定

__thiscall 類成員方法呼叫約定

三、函式引數傳遞順序和方式:

1.從右到左依次入棧:__stdcall,__cdecl,__thiscall

2.從左到右依次入棧:__pascal,__fastcall

四、棧的維護方式(開闢和清理方式)

__caecl c     呼叫方開闢,呼叫方清理

__stdcall      呼叫方開闢,被呼叫方清理

__fastcall      若為內建型別<=4 前兩個形參不開闢記憶體,暫存器帶入

其他情況呼叫方開闢記憶體,被呼叫方清理記憶體

五、名字修飾的策略(符號生成):

c語言的函式名的修飾規則為:直接在函式名前加乙個下化線,(__functionname@number;(functionname為函式名,number為引數位元組數))

c++的函式名的修飾規則為:(?functionname@@ya******@z;(「******」為函式返回值型別和引數型別表))

例:extern int __cdecl sum(int,int)   //?sum@@y

引數從右向左壓入堆疊;

函式被呼叫者清理堆疊;

c編譯器函式名的修飾規則為:__sum@8

c++編譯器函式名的修飾規則為:?sum@@yghhh@z;

使用場合:windows 標準呼叫協議;

引數從右向左壓入堆疊;

函式呼叫者清理堆疊;

c編譯器函式名的修飾規則為:__sum@8;

c++編譯器函式名的修飾規則為:?sum@@yhhh@z;

使用場合:c標準呼叫約定;

編譯鏈結執行原理 函式堆疊呼叫

首先先提出下面五個問題 1 形參開闢記憶體嗎?由誰開闢?2 形參的入棧順序?3 返回值如何帶出?4 被呼叫方結束後如何知道回退到呼叫方棧幀上?5 函式呼叫完成如何知道執行下一行指令?要解決這些問題,我們就要從彙編的角度切入。通過彙編 能夠使我們更加清晰地掌握函式的堆疊呼叫。彙編分為兩種形式inter...

編譯鏈結執行原理 編譯鏈結執行過程

乙個.c cpp源程式檔案要最後變成.exe windows 或者.out linux 可執行檔案,要經過編譯和鏈結過程。四個步驟 預編譯,編譯,彙編,連線 一 預編譯 處理以 開頭的預編譯指令,比如 include,define等,規則如下 1 刪除所有的 define,並展開所有的巨集替換 文字...

編譯鏈結執行原理

預編譯.i 刪除 define 文字替換 處理 include 遞迴展開 處理 if end if等預編譯指令 刪除注釋 新增行號和檔案標識 保留 pragma 編譯.s 1.詞法分析 2.語法分析 3.語義分析 4.優化 5.生成彙編指令 低階語言 以下是彙編指令的 int main 彙編.o 翻...