C++/C程序內存佈局及函數棧結構

一:系統的程序佈局圖:

 

 

 

 

 

二、詳解:

程序空間:

包括.txt代碼段,.data數據段, .bss段,堆段,棧段。程序的地址從低往高。堆空間增長方向從低地址往高地址增長。

棧空間從高地址往低地址方向增長。從左往右方向爲單字節增長方向。

 

 

棧空間:

棧空間由一個一個函數的棧幀構成,第一幀爲main函數的棧幀。第二幀是被main函數調用的函數(假設爲fun)的幀,

第三幀也就是當前幀是被fun調用的函數的棧幀。

第一幀的棧頂內存單元中值:0x7FFFFFFC,黃色標記,表示是第一幀的幀起始位置地址。

第二幀的棧頂內存單元值:0x7FFFFFF8,橙色標記,表示的是第二幀的幀起始位置地址。

當前幀的幀起始位置爲0x7FFFF0C,綠色標記,由於當前幀是當前函數真正運行,其棧頂由ESP寄存器的值標記,

其幀起始位置存放在EBP中。

 

函數調用:

函數調用時,進入到被調函數中時,被調函數會保護前面的棧幀。並初始化本幀。

 

push %ebp    
mov %ebp, %esp

1)第一句:

把EBP保存到棧中,也就是把前面一個棧幀的起始地址存入棧中。所以會出現前面所有棧幀的

棧頂都是存放了其自身幀起始地址(各種相同顏色的地址)。

 

2)第二句:

把esp的值存放到ebp中,此時esp指向當前函數的棧起始位置(因爲剛進入函數,並未構建臨時變量),

那麼ebp就也指向了函數的棧幀起始位置。

 

3)所有函數調用都會重複以上步奏,那麼整個程序的棧空間都是類似的結構。

 

 

注:在被保存的棧幀中,在棧頂內存單元中存放了幀起始的地址,緊接着其下,是被調用函數的返回地址,

再往下是第一個參數,再往下是第二個參數。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章