函數調用過程

原文鏈接:https://blog.csdn.net/u012474535/article/details/80230386
  • 函數的形參實參一般是用棧來儲存,這種棧叫做運行棧

  • 運行棧的數據分爲一個一個棧幀,每個棧幀對應一次函數調用,棧幀中包含這次函數調用的形參值、控制信息、局部變量、和臨時數據。每次函數調用都會有一個棧幀被壓入運行棧中,而調用返回後,相應的棧幀會被彈出。

  • 當一個函數要調用其他函數時,要爲它所調用的函數設置實參,即將實參壓入棧中,運行棧的這一部分空間是主調函數與被調函數都可以直接訪問的。(參數的形實參結合,就是通過訪問這一部分公共空間完成的)。

  • 被調函數的形參和局部變量的地址是不確定的,但它們的地址相對於棧頂的地址卻是確定的,所以可以通過棧頂的地址定位形參與局部變量。

  • esp 寄存器就是用來記錄棧頂的地址,稱爲棧指針

  • ebp 寄存器,用來記錄棧頂地址,稱爲幀指針,記錄函數剛調用時棧指針的的位置。所以形參和實參的變量地址通常是通過幀指針來計算,而非棧指針。

返回地址入棧:將當前代碼區調用指令的下一條指令地址壓入棧中,供函數返回時繼續執行
代碼區跳轉:處理器從當前代碼區跳轉到被調用函數的入口處
棧幀調整:a、保存當前棧幀狀態值,已備後面恢復本棧幀時使用(EBP入棧)
         b、將當前棧幀切換到新棧幀。(將ESP值裝入EBP,更新棧幀底部)
         c、給新棧幀分配空間。(把ESP減去所需空間的大小,擡高棧頂)``

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