欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言函數(shù)棧幀的創(chuàng)建與銷毀原理圖解

 更新時間:2022年05月20日 08:42:16   作者:頭發(fā)沒有代碼多  
我們知道c語言中函數(shù)都是被調(diào)用的,main函數(shù)里面能調(diào)用其他函數(shù),其實main函數(shù)也是被別的函數(shù)調(diào)用的,下面通過本文給大家分享c語言函數(shù)棧幀的創(chuàng)建和銷毀過程,一起看看吧

什么是函數(shù)棧幀

我們在寫C語言代碼的時候,經(jīng)常會把一個獨立的功能抽象為函數(shù),所以C程序是以函數(shù)為基本單位的。

那函數(shù)是如何調(diào)用的?函數(shù)的返回值又是如何待會的?函數(shù)參數(shù)是如何傳遞的?這些問題都和函數(shù)棧幀有關(guān)系。

函數(shù)棧幀(stack frame)就是函數(shù)調(diào)用過程中在程序的調(diào)用棧(call stack)所開辟的空間,這些空間是用來存放:

  • 函數(shù)參數(shù)和函數(shù)返回值
  • 臨時變量(包括函數(shù)的非靜態(tài)的局部變量以及編譯器自動生產(chǎn)的其他臨時變量)
  • 保存上下文信息(包括在函數(shù)調(diào)用前后需要保持不變的寄存器)。

什么是棧?

棧(stack)是現(xiàn)代計算機程序里最為重要的概念之一,幾乎每一個程序都使用了棧,沒有棧就沒有函 數(shù),沒有局部變量,也就沒有我們?nèi)缃窨吹降乃械挠嬎銠C語言。

與函數(shù)棧幀有關(guān)的匯編語句

eax:通用寄存器,保留臨時數(shù)據(jù),常用于返回值

ebx:通用寄存器,保留臨時數(shù)據(jù)

ebp:棧底寄存器

esp:棧頂寄存器

eip:指令寄存器,保存當前指令的下一條指令的地址

mov:數(shù)據(jù)轉(zhuǎn)移指令

push:數(shù)據(jù)入棧,同時esp棧頂寄存器也要發(fā)生改變

pop:數(shù)據(jù)彈出至指定位置,同時esp棧頂寄存器也要發(fā)生改變

sub:減法命令

add:加法命令

call:函數(shù)調(diào)用,1. 壓入返回地址 2. 轉(zhuǎn)入目標函數(shù)

jump:通過修改eip,轉(zhuǎn)入目標函數(shù),進行調(diào)用

ret:恢復返回地址,壓入eip,類似pop eip命令(返回子程序)

函數(shù)如何創(chuàng)建棧幀并銷毀

當程序進入main函數(shù)時,要給main函數(shù)在棧區(qū)創(chuàng)建空間,esp(棧頂)和ebp(棧底)對main函數(shù)進行維護

當程序執(zhí)行時,我們在調(diào)試窗口對堆棧段進行調(diào)用,我們可以看到main函數(shù)是被__tmainSRTStartup函數(shù)所調(diào)用,說明main函數(shù)是它的內(nèi)部函數(shù),而__tmainSRTStartup又是被mainCRStartup這個函數(shù)調(diào)用

梳理一下上面的思路

這些函數(shù)在堆棧當中的存儲

main函數(shù)棧幀開辟

接下來重新調(diào)試,我們轉(zhuǎn)到反匯編

調(diào)用main函數(shù)之前,esp和ebp對調(diào)用main函數(shù)的函數(shù)進行維護 ,當棧頂發(fā)生改變時,esp會指向新的棧頂

003118B0 push ebp

003118B1 mov ebp,esp

先把ebp入棧,然后把ebp移動到esp的位置

003118B3 sub esp,0E4h

003118B9 push ebx

003118BA push esi

003118BB push edi

之后又把esp往上移動,移動完把ebx,esi,edi壓棧,esp和ebp現(xiàn)在指的這塊空間是為main函數(shù)預先開辟好的

把edi-0EFH也就是main函數(shù)開始的這里的地址,放到edi里面去,然后從這個地址開始賦值39次的雙字節(jié)數(shù)據(jù),賦值為CCCC

到這里main函數(shù)棧幀開辟完成

接下來就是在main函數(shù)的空間里,創(chuàng)建三個變量,并給賦值

調(diào)用Add函數(shù)

對函數(shù)進行傳參,創(chuàng)建倆個臨時變量,然后壓棧進去

接下來進入call開始調(diào)用函數(shù)call此時的地址是00C2144B

此時按下F11,我們發(fā)現(xiàn)call指令的下一條地址被壓到了棧區(qū)

把call的下一個地址壓棧,ps:后面會用到這條指令,可先放在這不管

接下來進入Add函數(shù),跟前面main函數(shù)一樣,先開辟空間,然后賦值為CCCCCC,再為變量在函數(shù)里創(chuàng)建空間并賦值

接下來執(zhí)行加法運算,由于剛才已經(jīng)創(chuàng)建好了零時變量,所以把他倆進行相加,加完之后把結(jié)果傳過來就行,傳過來之后把這個值放在eax里面去

返回主函數(shù)

按順序出棧,之后把ebp賦值給esp

之后pop,ebp把ebp進行出棧,ebp便回到main函數(shù)這里,ebp此時回到這里,esp也自然而然的往下指一個,ret指令是返回,然后esp來到了call指令的下一條指令

把棧頂指針彈出去,esp自然向下指一條

之后給esp加8即釋放這倆個臨時變量

之后把eax放到ebp-20h,eax是存放剛才加法和的地方

到此這篇關(guān)于C語言函數(shù)棧幀的創(chuàng)建與銷毀原理圖解的文章就介紹到這了,更多相關(guān)C語言函數(shù)棧幀內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++拷貝構(gòu)造函數(shù)防篡改示例

    c++拷貝構(gòu)造函數(shù)防篡改示例

    這篇文章主要介紹了拷貝構(gòu)造函數(shù)防篡改示例,需要的朋友可以參考下
    2014-04-04
  • C語言編寫五子棋游戲

    C語言編寫五子棋游戲

    這篇文章主要為大家詳細介紹了C語言編寫五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++函數(shù)重載的定義與原因詳解

    C++函數(shù)重載的定義與原因詳解

    這篇文章主要為大家詳細介紹了Python實現(xiàn)學生成績管理系統(tǒng),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c語言printf函數(shù)的使用詳解

    c語言printf函數(shù)的使用詳解

    本篇文章是對c語言中printf函數(shù)的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中讀寫交替時出現(xiàn)的問題分析

    C語言中讀寫交替時出現(xiàn)的問題分析

    讀寫命令交替,一定要使用fseek重新定位,否則出現(xiàn)輸入顯示混亂,這篇文章主要介紹了C語言中讀寫交替時出現(xiàn)的問題分析,需要的朋友可以參考下
    2022-12-12
  • C+繼承之同名覆蓋,函數(shù)重寫與多態(tài)詳解

    C+繼承之同名覆蓋,函數(shù)重寫與多態(tài)詳解

    這篇文章主要介紹了C+繼承之同名覆蓋,函數(shù)重寫與多態(tài),是C++面向?qū)ο蟪绦蛟O(shè)計非常重要的概念,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • 一篇文章教你用C語言模擬實現(xiàn)字符串函數(shù)

    一篇文章教你用C語言模擬實現(xiàn)字符串函數(shù)

    這篇文章主要介紹了C語言模擬實現(xiàn)字符串函數(shù),開發(fā)程序的時候經(jīng)常使用到一些字符串函數(shù),例如求字符串長度,拷貝字符串……,需要的朋友可以參考下
    2021-09-09
  • c語言snprintf函數(shù)的用法詳解

    c語言snprintf函數(shù)的用法詳解

    這篇文章主要給大家介紹了關(guān)于c語言snprintf函數(shù)用法的相關(guān)資料,snprintf()函數(shù)用于將格式化的數(shù)據(jù)寫入字符串,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • C語言職工信息管理系統(tǒng)源碼

    C語言職工信息管理系統(tǒng)源碼

    這篇文章主要為大家詳細介紹了C語言職工信息管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++實現(xiàn)四則運算器(無括號)

    C++實現(xiàn)四則運算器(無括號)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)四則運算器,無括號的計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論