C語言筆記 函式的呼叫過程(棧楨)

2021-08-21 05:27:42 字數 1653 閱讀 4150

堆和棧的理解

一、什麼是棧楨

2、棧幀表示程式的函式呼叫記錄,而棧幀又是記錄在棧上面,很明顯棧上保持了n個棧幀的實體,(實際上我們這裡說的棧幀是軟體上的概念,據說有硬體概念,不是很了解),那就可以說棧幀將分割成了n個記錄塊,但是這些記錄塊大小不是固定不變的,因為棧不僅儲存諸如:函式入參,出參,返回位址和上乙個棧幀的棧底指標等資訊,還儲存了函式內部的自動變數,因此不是所有的棧幀的大小都是相同。

二、直接上**分析

1、這是乙個簡單的函式呼叫程式

//源**

#include

int myfun(int x,int y)

int main()

2、上面函式的彙編**(下面有逐步講解)

//彙編**

9: int main()

10:

004010b9 pop edi

004010ba pop esi

004010bb pop ebx

004010bc add esp,4ch

004010bf cmp ebp,esp

004010c1 call __chkesp (00401170)

004010c6 mov esp,ebp

004010c8 pop ebp

004010c9 ret

3、分析彙編**(1)下面彙編**不用關心,是因為main函式也是被其他函式所呼叫地,

需要儲存儲存斷點位址和資料資訊。我們這次主要討論main函式裡面

呼叫其他子函式的過程,所以分析main函式被呼叫的過程。

執行ret相當於pop棧頂資料到eip

(9)函式呼叫結束,返回到main函式

C語言 函式呼叫過程(棧幀)

首先舉個栗子 include int add int x,int y int main 在這個程式裡,函式被呼叫才會發揮函式的功能,而函式的呼叫其實是乙個過程,在這個過程計算機要為函式開闢棧空間,用於本次函式臨時變數的儲存和現場保護,這塊空間稱為函式的棧幀。現場保護的作用是為了在呼叫完另乙個函式,返...

C語言函式呼叫過程 棧幀

在學習過函式宣告和定義,了解了函式的引數 實參 形參 引數的設計 函式的使用等一些函式基礎知識之後,函式逐漸變為我們編寫 時重要工具。無論是編寫時引用的庫函式,還是實現程式部分功能時使用的自定義函式,都體現函式的重要性。函式特點 使 開發更高效 提高 復用性 使 邏輯更加清晰。函式所佔據的重要地位,...

函式呼叫過程(棧幀)

眾所周知,程式每呼叫乙個函式,系統都會為其開闢一塊空間,當它返回時,才收回這塊空間。程式崩潰有一部分原因就是因為無限制的呼叫函式,卻沒有及時返回,導致記憶體空間不夠。為了更好的維護這一塊空間 通常稱為棧空間 我們需要了解兩個暫存器,乙個為 esp 指向棧頂的指標 乙個為 ebp 指向棧底的指標 棧空...