最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年02月21日 14:45:39   作者:tjh94512  
這篇文章主要為大家詳細介紹了C語言函數(shù)棧幀的創(chuàng)建與銷毀,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

前言

大家在學習的時候一定有以下困惑: 局部變量是怎么創(chuàng)建的?為什么局部變量的值是隨機值?函數(shù)是怎么傳參?傳參的順序是怎樣的?形參與實參是什么關系?函數(shù)調用是怎么做到的?函數(shù)調用完成不是銷毀了嗎,如何帶回的返回值?

以上這些都可以通過了解函數(shù)棧幀的創(chuàng)建與銷毀來理解。接下來我就帶大家來了解函數(shù)棧幀的創(chuàng)建與銷毀。

本次使用的編輯器是VS2013,因為越先進的編輯器,越不容易觀察到底層。好了,我們回到正題。

一、函數(shù)棧幀是什么?

1.寄存器

寄存器里有eax,ebx,ecx,edx,ebp,esp等,我們今天要重點了解的是ebp與esp這兩個寄存器。

2.ebp與esp

這兩個寄存器中存放的是地址,整兩個地址使用來維護函數(shù)棧幀的。每一個函數(shù)調用,都要在棧區(qū)創(chuàng)建一個空間,這塊空間叫做函數(shù)棧幀,用esp與ebp來維護。

二、函數(shù)棧幀的創(chuàng)建

1.代碼塊

#include<stdio.h>
int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int a = 10;
	int b = 20;
	int ret = Add(a, b);
	printf("ret=%d\n", ret);
	return 0;
}

這個代碼只是一個很簡單的實現(xiàn)了加法函數(shù),不用多說。

2.調用堆棧

接下來開始調試程序來看底層代碼如何實現(xiàn),首先打開調用堆棧

在這里插入圖片描述

從這里可以清楚地知道,main函數(shù)之前還有兩個函數(shù)在調用,所以大家平時認為的main函數(shù)就是最初的開始是錯誤的哦。

3.esp與ebp如何維護棧幀

在棧的使用中,是從高地址開始的。其中ebp指向棧底,esp指向棧頂。

在這里插入圖片描述

main函數(shù)被調用后,程序會為main函數(shù)分配??臻g。接下來調試并右擊鼠標轉到反匯編。可以看到

在這里插入圖片描述

這些代碼的意思是

將ebp的值壓棧,然后將esp賦給ebp,給esp減去0E4h的大小,之后分別將ebx,esi,edi壓棧

壓棧的意思是將元素放到棧頂。在上面調用堆??梢钥吹絤ain函數(shù)由__tmainCRTStartup調用。圖解如下:

在這里插入圖片描述

值得一提的是,在棧頂放元素是esp會自動指向新放元素的上方。

在這里插入圖片描述

在這里插入圖片描述


上圖中我們很容易的看出在調用main函數(shù)是為main函數(shù)開辟的??臻g即棧幀,并且將esp的值給ebp,ebp和esp指向同一塊空間,然后esp變小指向上面的區(qū)域,接下來將ebx,esi,edi壓棧。

在這里插入圖片描述

在這里插入圖片描述

接下來這四句,lea是加載有效地址,從上圖中,我們知道ebp指向的地址,那么edi存放的就是ebp-0E4h的地址也就是③esp處的地址,最后一句rep stos dword ptr es:[edi] 意思是從edi里面重復拷貝ecx次eax的內容。一次拷貝四個字節(jié),dword是四個字節(jié)的意思。

在這里插入圖片描述

接下來這三個匯編代碼的意思就是將值放入相應的空間。至于為什么是為什么是ebp-8和ebp-20,這個和編譯器有關,就不過多敘述。

在這里插入圖片描述

在這里插入圖片描述

由匯編代碼可知,接下來就開始創(chuàng)建形式參數(shù),將要傳遞的參數(shù)值存入eax與ecx這兩個寄存器中并壓入棧頂,所以創(chuàng)建的形式參數(shù)并不在add函數(shù)的函數(shù)棧幀哦,并且我們之前常說的形參是實參的一份臨時拷貝無疑是非常正確的。

在這里插入圖片描述

在這里插入圖片描述

接下來開始add函數(shù)調用。call是調用的意思,后面是add函數(shù)的地址用來找到調用函數(shù)。這里值得一提的是call指令下一條指令的地址被存儲來方便執(zhí)行完add函數(shù)可以跳回來。

Add函數(shù)創(chuàng)建棧幀的過程其實和main函數(shù)一樣的,先將ebp壓棧方便找到指向main函數(shù)棧底的空間,再將esp的地址存放到ebp里面,此時,esp和ebp指向同一位置,再將esp上移0CCh個位置,然后就是ebx,esi,edi壓棧,這里不多作說明,由下圖可清晰理解:

在這里插入圖片描述

在這里插入圖片描述

接下來初始化z與執(zhí)行加法也沒什么要說的,z=x=y是找到之前創(chuàng)建的形參來進行加法。并將結果移動到z里。

在這里插入圖片描述

返回z的操作是將z的值存放到eax這個寄存器中,所以函數(shù)銷毀變量與返回的值這個操作并不沖突。

在這里插入圖片描述

最后銷毀add函數(shù)棧幀,pop就是彈出元素然后把元素放入后面的寄存器,每次pop都會銷毀一個棧頂元素然后esp自動++往下挪移。三下pop之后要回收空間了,操作是把ebp的值傳給esp這樣esp指向的空間是main函數(shù)的棧頂,然后popebp這個操作會將之前棧底存放的之前存放的main函數(shù)的棧底指針傳給ebp,這樣ebp就指向了main函數(shù)的棧底。如下圖:

在這里插入圖片描述

接下來銷毀main函數(shù)的操作也與之前一樣,就不細說了。

總結 

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!        

相關文章

  • C語言開發(fā)實現(xiàn)通訊錄管理系統(tǒng)

    C語言開發(fā)實現(xiàn)通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言開發(fā)實現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 用C語言實現(xiàn)井字棋游戲代碼

    用C語言實現(xiàn)井字棋游戲代碼

    大家好,本篇文章主要講的是用C語言實現(xiàn)井字棋游戲代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C中實現(xiàn)矩陣乘法的一種高效的方法

    C中實現(xiàn)矩陣乘法的一種高效的方法

    本篇文章介紹了,在C中實現(xiàn)矩陣乘法的一種高效的方法。需要的朋友參考下
    2013-05-05
  • 在C語言中輸入中文字符串講解

    在C語言中輸入中文字符串講解

    這篇文章主要介紹了在C語言中輸入中文字符串講解,本文通過概念和案例相結合講述了如何在C語言中使用中文,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 簡單掌握桶排序算法及C++版的代碼實現(xiàn)

    簡單掌握桶排序算法及C++版的代碼實現(xiàn)

    桶排序是將要排序的算法按桶分組排序之后再遍歷匯總的一種線性排序算法,下面就讓我們來通過小例子簡單掌握桶排序算法及C++版的代碼實現(xiàn)^^
    2016-07-07
  • c語言操作文本的基本使用方法

    c語言操作文本的基本使用方法

    這篇文章主要介紹了c語言操作文本的基本使用方法,需要的朋友可以參考下
    2014-04-04
  • 深入理解Qt信號槽機制

    深入理解Qt信號槽機制

    信號槽是 Qt 框架引以為豪的機制之一。本文主要介紹了Qt信號槽機制,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言詳細講解if語句與switch語句的用法

    C語言詳細講解if語句與switch語句的用法

    用 if 語句可以構成分支結構,它根據(jù)給的條件進行判定,以決定執(zhí)行哪個分支程序段,C 語言中還有另外一種分支語句,就是 switch 語句
    2022-05-05
  • C++17結構化綁定的實現(xiàn)

    C++17結構化綁定的實現(xiàn)

    這篇文章主要介紹了C++17結構化綁定的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • C語言動態(tài)規(guī)劃之背包問題詳解

    C語言動態(tài)規(guī)劃之背包問題詳解

    這篇文章主要介紹了C語言動態(tài)規(guī)劃之背包問題詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04

最新評論

台州市| 石景山区| 分宜县| 咸阳市| 金堂县| 康平县| 水城县| 荣昌县| 汤原县| 株洲县| 鄂伦春自治旗| 九龙县| 九龙城区| 丰顺县| 黎城县| 老河口市| 连南| 天长市| 盈江县| 通州市| 旺苍县| 沙湾县| 靖宇县| 东乌| 会同县| 简阳市| 策勒县| 黑山县| 漳州市| 鄂伦春自治旗| 东兰县| 芜湖县| 石台县| 皮山县| 汉川市| 福泉市| 荥经县| 左权县| 东丽区| 治县。| 太保市|