那先有個問題,什麼是棧?數據結構
在數據結構中, 棧是限定僅在表尾進行插入或刪除操做的線性表。棧是一種數據結構,它按照後進先出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,須要讀數據的時候從棧頂開始彈出數據。
在計算機系統中,棧也能夠稱之爲棧內存是一個具備動態內存區域,存儲函數內部(包括main函數)的局部變量和方法調用和函數參數值,是由系統自動分配的,通常速度較快;存儲地址是連續且存在有限棧容量,會出現溢出現象程序能夠將數據壓入棧中,也能夠將數據從棧頂彈出。壓棧操做使得棧增大,而彈出操做使棧減少。 棧用於維護函數調用的上下文,離開了棧函數調用就無法實現。
而什麼是棧幀(Stack Frame)呢?
每一次函數的調用,都會在調用棧(call stack)上維護一個獨立的棧幀(stack frame).每一個獨立的棧幀通常包括:函數
在函數調用的過程當中,有函數的調用者(caller)和被調用的函數(callee).
調用者須要知道被調用者函數返回值;
被調用者須要知道傳入的參數和返回的地址;指針
函數調用分爲如下幾步:code
push ebp
</br>mov ebp, esp
</br>sub esp, XXX
</br>函數返回分爲如下幾步:orm
mov eax, xxx
mov ebp, esp
pop ebp
ret