1、什么是棧幀?
棧幀也叫過程活動記錄,是編譯器用來實現(xiàn)函數(shù)調(diào)用過程的一種數(shù)據(jù)結(jié)構(gòu)。C語言中,每個棧幀對應著一個未運行完的函數(shù)。從邏輯上講,棧幀就是一個函數(shù)執(zhí)行的環(huán)境:函數(shù)調(diào)用框架、函數(shù)參數(shù)、函數(shù)的局部變量、函數(shù)執(zhí)行完后返回到哪里等等。棧是從高地址向低地址延伸的。每個函數(shù)的每次調(diào)用,都有它自己獨立的一個棧幀,這個棧幀中維持著所需要的各種信息。寄存器ebp指向當前的棧幀的底部(高地址),寄存器esp指向當前的棧幀的頂部(低地址)。
2、Add()函數(shù)的調(diào)用過程
我們以Add()函數(shù)為例深入的研究一下函數(shù)的調(diào)用過程。
先看一段簡單的代碼:
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 }
當講程序調(diào)試的時候, 查看【調(diào)用堆棧】(按F10進入調(diào)試-窗口-調(diào)用堆棧,或按快捷鍵ctrl+alt+C) ,用VS2015調(diào)試 如下圖:
如果用版本更老的,或其他如VC6.0等編輯器則可以看到更多信息,VS2008調(diào)試如圖:
我們發(fā)現(xiàn)其實main函數(shù)在 __tmai nCRTStartup 函數(shù)中調(diào)用的,而 __tmai nCRTStartup 函數(shù)是在 mai nCRTStartup