分析程序如何執行一)
習慣了使用高級語言編程,很簡單的幾行代碼,就可以實現很復雜的計算,你是否考慮過,這幾行代碼是如何在計算機中存儲和運行的?面對這樣的問題,我把自己所認識的程序執行的具體過程分享給大家。一孔之見,理解可能有不對的地方,還請大家指正。
首先給出我們的示例程序
#include <stdio.h>
int recursiveFun(int i)
{
if(i<1)
return recursiveFun(i+1);
else return i;
}
int fun(){
int i=0;
i=recursiveFun(i);
return i;
}
int main(){
int i;
i=fun();
printf("%d",i);
}
我們常說入口地址這個概念,那對於main函數的入口地址是什麼呢首次給出這個地址ebp=0x0022ff18之後我會解釋為什麼會是這個值
我們平時執行的程序,主要存儲在代碼段,例如圖中上面這個程序我們給出代碼段地址,這個要在vc中反匯編得到0x002a1490就是代碼段中的指令地址,我們寫的c語言程序被編譯器翻譯成匯編語言,然後被翻譯成機器指令,通過調試我們看看002a1490這個內存單元中存放的東西是什麼大家看到 在0x002a1490 這個內存單元存放的指令便是機器指令55
說過代碼段當然要說數據段,如果我們沒有顯示的申請內存空間,程序執行在棧中,棧中存放的就是常說的活動記錄,活動記錄中有返回地址,申請的變量等。函數中我們常會嵌套函數,執行的過程就是棧的壓棧和彈棧的過程,在這裡有兩個寄存器很重要,就是ebp,和esp,每個函數的入口地址都會在ebp中記錄,ebp就是基址寄存器,ebp中存放的就是入口地址,入口地址這個內存單元存放的又是什麼呢? 這個是需要讀者思考下的問題,其實這個入口地址內存單元中存放的就是調用當前函數那個函數的入口地址,通過調試我們來看看,是不是這樣的當前執行到i=fun()這個代碼處ebp的值為 我們來看看0022fec8這個內存單元中存放的是什麼0022ff18
當函數執行到這裡時,ebp值為那0022fde8這個內存單元中值是什麼呢存放的是0022fec8讀者看到有什麼聯系了麼?對,每個函數的入口地址單元中存放的就是調用它的那個函數的入口地址,這樣在函數執行完彈棧後,我們就能找到調用它的那個函數,繼續進行函數執行。
先寫到這裡,下面給大家介紹這個棧是如何執行的