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

2021-08-31 13:39:04 字數 1419 閱讀 6960

首先先提出下面五個問題:

(1)形參開闢記憶體嗎?由誰開闢?

(2)形參的入棧順序?

(3)返回值如何帶出?

(4)被呼叫方結束後如何知道回退到呼叫方棧幀上?

(5)函式呼叫完成如何知道執行下一行指令?

要解決這些問題,我們就要從彙編的角度切入。通過彙編**能夠使我們更加清晰地掌握函式的堆疊呼叫。 彙編分為兩種形式inter x86(從右向左看) 和at&t unix(從左向右看),我們學習的主要是inter x86下的彙編**。

1、先來了解一下反彙編的一些指令

int a = 20;

inter x86(從右向左看) mov dword ptr [a] , 14h;

at&t unix(從左向右看)mov 14h , dword ptr [a];

都是指將十六進製制的20 放在dword ptr [a]中;

led eax ,[ebp-4]   將ebp-4的位址傳送到eax中;

push 10;  將10壓入棧中

pop eax ; ==> eax = pop();

add eax, 4; ==> eax+=4;

sub eax, 4; ==> eax-=4;

2、暫存器

儲存資料:eax、ebx、ecx、edx.

ebp:棧底指標暫存器

esp:棧頂指標暫存器

pc:下一行指令暫存器

舉例:

進入debug版本檢視該程式的interx86反彙編**如下:

有反彙編**解釋可以回答問題

(1)形參開闢記憶體嗎?由誰開闢?

形參開闢記憶體,由於這是在main函式的棧幀上,所以是由被呼叫方開闢。

(2)形參的入棧順序?

形參的入棧順序是自右向左。

(3)返回值如何帶出?

<=4位元組返回值由eax暫存器帶出;

4位元組《返回值<=8位元組時,由eax和ebx暫存器共同帶出;

>8位元組,由臨時量帶出。

這是sum函式呼叫返回值之後的一些操作:

(4)函式呼叫完成後如何知道回退到呼叫方棧幀上?

(5)函式呼叫完成如何知道執行下一行指令?

總結:

開棧:清棧:

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

一 定義 函式呼叫約定,是指當乙個函式被呼叫時,函式的引數會被傳遞給被呼叫的函式和返回值會被返回給呼叫函式。函式的呼叫約定就是描述引數是怎麼傳遞和由誰平衡堆疊的,當然還有返回值。呼叫約定,約束的是 1.實參入棧順序 2.形參的開闢和清理方式 3.約定函式符號的生成 二 幾種型別 stdcall,cd...

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

乙個.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 翻...