1、什么是棧幀?

棧幀也叫過(guò)程活動(dòng)記錄,是編譯器用來(lái)實(shí)現(xiàn)函數(shù)調(diào)用過(guò)程的一種數(shù)據(jù)結(jié)構(gòu)。C語(yǔ)言中,每個(gè)棧幀對(duì)應(yīng)著一個(gè)未運(yùn)行完的函數(shù)。從邏輯上講,棧幀就是一個(gè)函數(shù)執(zhí)行的環(huán)境:函數(shù)調(diào)用框架、函數(shù)參數(shù)、函數(shù)的局部變量、函數(shù)執(zhí)行完后返回到哪里等等。棧是從高地址向低地址延伸的。每個(gè)函數(shù)的每次調(diào)用,都有它自己獨(dú)立的一個(gè)棧幀,這個(gè)棧幀中維持著所需要的各種信息。寄存器ebp指向當(dāng)前的棧幀的底部(高地址),寄存器esp指向當(dāng)前的棧幀的頂部(低地址)。

2、Add()函數(shù)的調(diào)用過(guò)程

我們以Add()函數(shù)為例深入的研究一下函數(shù)的調(diào)用過(guò)程。
先看一段簡(jiǎn)單的代碼:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

 1 #include <stdio. h> 2 int Add(int x, int y) 3 { 4 int z = 0; 5 z = x + y; 6 return z; 7 } 8 int main() 9 {10 int a = 10;11 int b = 20;12 int ret = Add(a, b) ;13 printf("ret = %d\n", ret) ;14 return 0;15 }

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

當(dāng)講程序調(diào)試的時(shí)候, 查看【調(diào)用堆?!浚ò碏10進(jìn)入調(diào)試-窗口-調(diào)用堆棧,或按快捷鍵ctrl+alt+C) ,用VS2015調(diào)試 如下圖:
Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

如果用版本更老的,或其他如VC6.0等編輯器則可以看到更多信息,VS2008調(diào)試如圖:Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

我們發(fā)現(xiàn)其實(shí)main函數(shù)在 __tmai nCRTStartup 函數(shù)中調(diào)用的,而 __tmai nCRTStartup 函數(shù)是在 mai nCRTStartup

網(wǎng)友評(píng)論