91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解C語言的函數棧幀

發布時間:2021-11-22 13:32:32 來源:億速云 閱讀:116 作者:iii 欄目:開發技術

本篇內容介紹了“怎么理解C語言的函數棧幀”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    一、函數棧幀的創建

    1.寄存器

    一般來說,計算機中的寄存器有六種

    分別是:eax, ebx, ecx,edx,ebp,esp

    而ebp,esp這兩個寄存器中存放的是地址,與此同時,這兩個地址是來維護函數棧幀的。

    2.函數棧幀

    每一個函數的調用,都需要在棧區為其開辟一個空間,這塊為其開辟的空間就是函數棧幀。

    ebp:棧底指針

    esp:棧頂指針

    對于棧這種數據結構一共有兩種棧操作
    1.pop 出棧
    2. push 壓棧

    怎么理解C語言的函數棧幀

    如上圖所示,當main函數創建是便是會為其開辟函數棧幀,而其函數棧幀的地址范圍則由棧頂指針:esp,棧底指針:ebp來標識。同時,ebp和esp所指示的位置會隨著函數棧幀的創建和銷毀而不斷的發生改變。

    需要明白的是,在VS編譯器中,main函數也是由其他函數調用的

    在main函數的棧幀創建完成之后呢,就會用一個特定值將函數棧幀內的空間覆蓋,這個特定值就是0xcccccccc(十六進制表示)。

    相信大家在跑代碼的時候都遇到過打印好多“燙燙燙燙燙燙燙燙燙”的情況,這其實是訪問的內存越界了,而錯誤訪問的內存中存放的正好就是上面那個特定值。

    函數棧幀創建好以后,在函數中創建的變量便可以存放在函數棧幀中了。

    3.函數中調用函數

    1.如果調用的函數有參數的話,先要將參數壓棧,這里的參數是實參的一份臨時拷貝。

    2.同時將調用函數結束之后的下一步操作的地址壓棧。(根據這個地址,我們們就可以在內存中找到相應的操作)

    3.將調用之前的函數棧幀對應的ebp地址壓棧,這是為了方便我們在函數調用結束之后找到對應的函數棧幀的地址。

    4.再次執行函數棧幀的創建操作。

    函數形參并不是在函數棧幀中創建的,而是在函數棧幀創建之前就已經在棧中創建了(對應第一步),當要使用時,就可以從相應位置找到。

    5.函數的返回值會存在一個寄存器中(當函數棧幀釋放后,返回值不會隨之消失)。

    二、函數棧幀的銷毀

    1.將一些函數調用中使用的寄存器彈出棧。

    2.修改相應的ebp,esp的值,使其還原為函數調用前所指向的位置。具體為:出棧操作后,esp將指向當前ebp所指向的位置,之后彈出棧中所存儲的ebp的地址,讓ebp也指向正確的位置。這也是為何要在函數調用之前存儲當前ebp的地址。同時,因為出棧操作,esp的位置也相應的發生改變。

    3.此時的棧頂元素對應的是函數調用之后的下一條指令的地址(在調用函數之前我們就將其壓棧了),根據地址我們就可以執行相應的操作。之后出棧,變更esp地址。

    4.執行完第三步操作后,esp所指向的地址發生改變。同時釋放形參的空間,函數也相應的結束了。

    “怎么理解C語言的函數棧幀”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    延川县| 洛隆县| 南澳县| 湘乡市| 屏边| 偏关县| 崇礼县| 台东市| 大姚县| 嵩明县| 黎川县| 和顺县| 广汉市| 广平县| 惠水县| 梨树县| 龙州县| 金沙县| 华池县| 公主岭市| 凯里市| 治多县| 英超| 寻乌县| 上栗县| 江都市| 阿尔山市| 昌邑市| 陆丰市| 鹤峰县| 靖西县| 漳浦县| 德惠市| 伊宁市| 揭阳市| 多伦县| 黎平县| 舟山市| 重庆市| 乌审旗| 夏津县|