一:系統的程序佈局圖:
二、詳解:
程序空間:
包括.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)所有函數調用都會重複以上步奏,那麼整個程序的棧空間都是類似的結構。
注:在被保存的棧幀中,在棧頂內存單元中存放了幀起始的地址,緊接着其下,是被調用函數的返回地址,
再往下是第一個參數,再往下是第二個參數。