編譯以下程式,分析此程式以得出棧的精髓:
1、主函式被上層呼叫者呼叫後,執行push ebp,esp-4(因為ebp入棧),ebp值沒有改變,值得注意的是剛開始分配站的時候,第乙個入棧的是return,主函式的返回位址,然後是ebp
2、然後是mov ebp,esp,將esp的值賦給ebp,該語句未執行時,ebp仍為上層呼叫者的棧的棧底指標,執行該語句後,ebp變為新棧的棧底指標(先將其入棧,是為了返回上層時,棧的狀態也會隨之返回,函式呼叫結束,函式的棧即消失)
3、然後就是一些函式內部的資料入棧出棧等操作
4、函式即將結束時,執行mov esp,ebp操作,清空該棧,回到第二步的狀態2
5、上步結束後,執行pop ebp操作,此時ebp指向上層呼叫者的棧底
6、最後一步為return,返回函式呼叫的位址,函式呼叫和函式返回的時候會呼叫棧頂指標esp
函式呼叫棧
當程式進行函式呼叫的時候,系統會用到下面三種暫存器 3.ebp ebp暫存器裡儲存的是棧基址,是在函式呼叫之前,由esp賦值給ebp的。棧底方向,高位位址 call fun arg1,arg2,arg3 修改esp,棧向下增長,引數入棧,返回位址入棧 arg3 arg2 arg1 返回位址 上一層e...
函式呼叫 函式棧
函式呼叫大家都不陌生,呼叫者向被呼叫者傳遞一些引數,然後執行被呼叫者的 最後被呼叫者向呼叫者返回結果,還有大家比較熟悉的一句話,就是函式呼叫是在棧上發生的,那麼在計算機內部到底是如何實現的呢?對於程式,編譯器會對其分配一段記憶體,在邏輯上可以分為 段,資料段,堆,棧 段 儲存程式文字,指令指標eip...
函式呼叫棧恢復
cdecl 引數從右到左壓入,由呼叫者彈出,函式名 前置 stdcall 引數從右到左壓入,由被呼叫者彈出,函式名無變化 pascal 引數從左到右壓入,由呼叫者彈出,函式名大寫 fastcall 引數從左到右壓入,由被呼叫者彈出,函式名 前置 void fun 1,2 1。cdecl 是這樣的 p...