函式的呼叫過程之棧幀的建立和銷毀

2021-12-30 04:48:41 字數 1732 閱讀 9243

1.cpu中的暫存器:

通用暫存器:eax,ebx,ecx,edx

程式計數器(eip(pc)):存放當前正在執行的指令的下一條指令的位址。

棧頂:esp暫存器

棧底:ebp暫存器

2.將記憶體中的指令複製到cpu中:

讀取指令--->分析指令--->執行指令

3.什麼是棧?

>棧是一種特殊的鍊錶形式的資料結構,只允許在鍊錶的一端進行新增和刪除。

>棧有棧底和棧頂。從棧頂入棧稱為push,從棧底入棧稱為pop。

>棧是先進後出,後進先出

4.什麼 是棧幀?

下面我們看乙個**:

#include

#include

int add(int x,int y)

int main()

(1)每一次函式呼叫都是乙個過程這個過程我們稱為函式的呼叫過程,這個過程要為函式開闢棧空間,用於本次函式的呼叫中臨時變數的儲存,現場保護。這塊棧空間我們稱為函式棧幀

(2)暫存器ebp:稱為「基址指標」:指向函式幀棧底的位址。

暫存器esp:稱為「棧指標」:指向函式棧幀棧頂的位址。

比如呼叫main函式分配棧空間:

(3)當我們要詳細研究函式呼叫過程,必須得對照的彙編**。

從main函式的地方開始,要展開main函式的呼叫就得為main函式建立棧幀。

>ebp和esp用來維護函式的棧底指標和棧頂指標,push ebp:將_tmaincrtstartup的函式ebp壓棧,在棧頂開闢一塊空間放入它的ebp。

>mov ebp,esp:將esp賦給ebp,esp和ebp同時指向新開闢空間的頂端。

>sub ebp,0e4h:棧空間中元素存放順序是由高位址到低位址,則該步驟在ebp的上面開闢了0e4h大小的記憶體空間.

>lea edi,[ebp-0e4h]:將ebp-0e4h這個位址放到edi中

>mov dword ptr [ebp-8],14h:給a賦值,在esp-4處賦上10.

>mov dword ptr [ebp-8],14h:給b賦值,在esp-8處開闢空間。

>呼叫call指令:call指令(1)對當前正在執行指令的下一條指令的位址進行儲存。儲存的目的是為了恢復。將位址儲存在棧上。 (2)跳轉至目標函式的位址處。

按f11進入到add函式中:

乙個變數修改另乙個變數,只需知道乙個變數的位址然後通過指標的來訪問:

#include

#include

int add(int x,int y)

int main()

不用改變a,b的值通過改變*p的值來修改變數,來修改結果。

函式的呼叫過程 棧幀的建立和銷毀

首先我們要了解一些概念。1.棧 stack 由編譯器自動分配釋放,存放為執行函式而分配的區域性變數 函式引數 返回函式 返回位址等。操作方式類似於資料結構中的棧。棧向下生成 先定義的位址高,後定義的位址低 2.堆 heap 由程式設計師分配釋放 若程式設計師不釋放,程式結束時可能由os 分配方式類似...

函式的呼叫過程,棧幀的建立和銷毀

我們大家學習c語言肯定都知道函式,但大家可能都只會用函式,對它的了解只是上層的,並不知道它的呼叫過程,今天我們就一起來深入的研究一下函式的呼叫過程。首先,我們要知道的是,在函式呼叫時,程式將使用乙個執行時堆疊,它裡邊存區域性變數和返回位址,執行時堆疊由ebp 存放維護這個棧的棧底指標 和esp 存放...

函式的呼叫過程 函式呼叫棧幀的建立

函式的呼叫過程 我們知道每一次函式呼叫都是乙個過程,這個過程我們通常稱之為 函式的呼叫過程。而這個過程要為函式開闢棧空間,用於本次函式呼叫中臨時變數的儲存,現場保護,這塊棧空間我們稱之為 函式棧幀。而函式棧幀的維護需要兩個暫存器 esp和ebp,在呼叫過程中,這兩個暫存器存放了維護這個棧的棧頂和棧底...