C語言 深度理解函式的呼叫(棧幀)

2021-08-25 08:43:51 字數 1146 閱讀 7941

本文講解的函式呼叫棧幀,需要用到彙編。又不知道同學可以自學一下。

我們可以知道函式的呼叫是乙個過程,我們通常將這個過程稱之為函式的呼叫過程。

從邏輯上講,棧幀就是乙個函式執行的環境:函式引數、函式的區域性變數、函式執行完後返回到**等等。

這個過程要為函式開闢棧空間,⽤於本次函式的呼叫中臨時變數量的儲存、現場保護。這塊棧空間 我們稱之為函式棧幀

而棧幀的維護我們必須了解ebp和esp兩個暫存器。在函式呼叫的過程中這兩個暫存器存放了維護這個棧的棧底和棧頂指標

接下來我們利用一段**來深刻理解函式的呼叫:

#include#includeint add(int a, int b)

int main()

我們可以看一下他的彙編**:

接下來我會用**演示每個過程:

在了解了函式棧幀的呼叫過程後,我們來思考一下為什麼要研究棧幀呢?

乙個碼農要是沒遇見過coredump,那就幸運了。core file(coredump的轉儲檔案)中儲存的最重要內容之一,就是函式的call trace。還原這部分內容(棧回溯),並與原**對應上,盡快找出程式崩潰的位置和原因,是碼農們一生的責任。當然,你如果有良好的開發環境和開發習慣,保留了現場環境(core file and lib file等)和unstrip的原程式,那麼恭喜,也許你不用太費神,直接用gdb的backtrace功能,就可以找到癥結所在。當然如果棧被沖掉了一部分,backtrace出來的就是一堆問號,要找出call trace就不容易了。這在緩衝區溢位時經常碰到。

總而言之,研究棧幀可以對記憶體管理有更深刻的認識。

C語言 深度理解函式 函式的棧幀

c語言函式是如何呼叫的呢?初學時我想當然地回答 從呼叫部分轉到函式部分逐句執行,就是那麼簡單啊,然而你有沒有想過 函式呼叫前需要做哪些準備工作?函式是如何傳參的?傳參後又是如何使用的?引數使用完後又是如何銷毀的?呼叫的整個過程是怎樣的呢?今天就通過下面這個簡單的 帶大家走進函式的世界,一 竟 inc...

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

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

C語言函式呼叫及棧幀結構

原文 一 位址空間與物理記憶體 1 位址空間與物理記憶體是兩個完全不同的概念,真正的 及資料都存在物理記憶體中。物理儲存器是指實際存在的具體儲存器晶元,cpu在操縱物理儲存器的時候都把他們當做記憶體來對待,把他們看成由若干個儲存單元組成的邏輯儲存器,這個邏輯儲存器就是我們所說的位址空間。位址空間大小...