程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 小覽call stack(調用棧) (一)

小覽call stack(調用棧) (一)

編輯:關於C++

棧在計算機領域中是個經常提到的名詞,數據結構中有棧;網絡傳輸中有協 議棧。今天我們討論的調用棧(call stack),指的是在程序的執行過程中存儲函 數調用信息的動態數據結構。

這個定義可能太抽象了一些,在給出具體的例子之前,請大家先思考一個問 題,哪些信息是函數調用過程中所需要的?或者這麼問,一個編譯器,在面對一 個函數的調用指令時,該生成哪些代碼?

首先,函數的返回地址要保存下來。就好像你和你的小狗玩仍飛碟游戲,每 一個函數調用好比扔一個飛碟,當你的狗狗哼茲哼茲的撿來飛碟,函數完執行的 時候,它一定得知道去哪裡把飛碟還給你。

然後,函數的參數是個必不可少的元素,這個很直觀,就不多羅嗦了。第三 ,被調用的函數的局部變量也要存儲在棧上。因為根據局部標量的定義,對相同 函數的不同調用,局部變量有不同的存儲空間,不會互相影響,所以這些數據也 是跟函數調用息息相關的信息。

下面,我們通過一個例子,來看看函數的調用棧中的信息:

對於下面一段c++程序

   [Ctrl+A 全部選擇 提示:你可 先修改部分代碼,再按運行]

編譯之,Cl /Zi a.cpp (/Zi生成pdb,調試的時候使用)

大家選用熟悉的調試器,在這裡,筆者用的是windbg 大家可以去這個地址下 載(http://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx)

從調試器中啟動程序:Windbg a.exe

然後在第4行設置一個斷點(F9)。開始執行這個程序(F5),直到程序中斷在斷 點處

找到程序的調用棧:

1.察看當前的ebp,在command窗口中應該已經看到。否則的話,在command中 輸入r

2.在memory察看窗口中,virtual欄中輸入ebp-10的值,並且把display format改成long hex,以利於觀察棧中的值

我把我的windbg截圖粘貼如下,並和大家一起觀察幾個地方

1.返回地址0040106b。參見反匯編的結果,0040106b正是main調完 SumFromOne之後的那條指令。

2.參數。主程序傳給他的是10,(0xa),在memory窗口ebp+8的位置找到他。

3.局部變量,我在程序中故意將sum初始化為0xabcd,大家可以在memory窗口 ebp-4的位置找到他。

有興趣地同學可以按F5,在下一個斷點中察看相關信息。

好,今天的這片博客中我們對調用棧有了感性的認識,在ebp周圍找到了返回 地址,參數以及局部變量。下一片博客中,我將解釋為什麼這些信息存儲在這些 位置,敬請期待。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved