真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C語言---函數(shù)棧幀---超詳解-創(chuàng)新互聯(lián)

在這里插入圖片描述

成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)與策劃設(shè)計(jì),北林網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:北林等地區(qū)。北林做網(wǎng)站價(jià)格咨詢:028-86922220

🚀write in front🚀
📝個(gè)人主頁:認(rèn)真寫博客的夏目淺石.
🎁歡迎各位→點(diǎn)贊👍 + 收藏?? + 留言📝
📣系列專欄:凡人修C傳
💬總結(jié):希望你看完之后,能對你有所幫助,不足請指正!共同學(xué)習(xí)交流 🖊
??為什么我們不知疲倦,因?yàn)槲覀兌荚谧鲎约核鶡釔鄣氖??

文章目錄
  • 前言
  • 一、寄存器概念
    • ?寄存器百度百科簡介:
    • ?寄存器最起碼具備的4種功能
    • ?寄存器的類型
    • ?指針和變址寄存器
    • ?兩個(gè)特別的寄存器
  • 二、函數(shù)棧幀的指令介紹
    • ?函數(shù)棧幀中的幾個(gè)重要指令
    • ?所用用到的指令
  • 三、函數(shù)棧幀的創(chuàng)建
    • ??函數(shù)__tmainCRTStartup的建立
    • ??main函數(shù)建立
    • ??Add函數(shù)建立
  • 四、函數(shù)棧幀的銷毀
  • 總結(jié)


前言

在這里插入圖片描述

之前學(xué)習(xí)C語言函數(shù)遞歸的時(shí)候,遇到了許多的疑惑和困難,所以今天就講一講函數(shù)遞歸的一些基本原理—函數(shù)棧幀的創(chuàng)建與銷毀,來揭開函數(shù)遞歸的神秘面紗。

??之前學(xué)習(xí)遞歸的時(shí)候產(chǎn)生的疑惑:

  • 局部變量是怎么創(chuàng)建的?
  • 為什么局部變量的值是隨機(jī)值?
  • 函數(shù)是怎么傳參的?傳參的順序又是怎樣的?
  • 形參和實(shí)參是什么關(guān)系?
  • 函數(shù)調(diào)用是怎么做的?
  • 函數(shù)調(diào)用結(jié)束后是怎么返回的?

??而這些疑惑,今天我都會帶著大家解開。并且今天的內(nèi)容,建議使用的環(huán)境是Visual Studio 2013,建議不要使用太高級的編譯器,因?yàn)槲覀冊趯W(xué)習(xí)的過程中需要隨時(shí)對我們的程序運(yùn)行過程進(jìn)行觀測,而越是高級的編譯器會自動優(yōu)化,封裝更加復(fù)雜,隨之而來的就是越不容易學(xué)習(xí)和觀察。

??并且,在不同的編譯器下,函數(shù)調(diào)用過程中棧幀的創(chuàng)建和銷毀大體邏輯上是相同的,但細(xì)節(jié)上是略有差異的,具體細(xì)節(jié)取決于編譯器的實(shí)現(xiàn)。


一、寄存器概念

在這里插入圖片描述

??在開始了解函數(shù)棧幀的創(chuàng)建與銷毀之前,我們首先要了解一下計(jì)算機(jī)CPU內(nèi)部的重要組成——寄存器

?寄存器百度百科簡介:

??寄存器是CPU內(nèi)部用來存放數(shù)據(jù)的一些小型存儲區(qū)域,用來暫時(shí)存放參與運(yùn)算的數(shù)據(jù)和運(yùn)算結(jié)果。其實(shí)寄存器就是一種常用的時(shí)序邏輯電路,但這種時(shí)序邏輯電路只包含存儲電路。寄存器的存儲電路是由鎖存器或觸發(fā)器構(gòu)成的,因?yàn)橐粋€(gè)鎖存器或觸發(fā)器能存儲1位二進(jìn)制數(shù),所以由N個(gè)鎖存器或觸發(fā)器可以構(gòu)成N位寄存器。寄存器是中央處理器內(nèi)的組成部分。寄存器是有限存儲容量的高速存儲部件,它們可用來暫存指令、數(shù)據(jù)和位址。


?寄存器最起碼具備的4種功能
  • 清除數(shù)碼:將寄存器里的原有數(shù)碼清除。
  • 接收數(shù)碼:在接收脈沖作用下,將外輸入數(shù)碼存入寄存器中。
  • 存儲數(shù)碼:在沒有新的寫入脈沖來之前,寄存器能保存原有數(shù)碼不變。
  • 輸出數(shù)碼:在輸出脈沖作用下,才通過電路輸出數(shù)碼。

??僅具有以上功能的寄存器稱為數(shù)碼寄存器;有的寄存器還具有移位功能,稱為—移位寄存器。


?寄存器的類型

在這里插入圖片描述

  • 通用寄存器組
  • 指針和變址寄存器
  • 段寄存器
  • 指令指針寄存器IP
  • 標(biāo)志寄存器FR

?指針和變址寄存器

在這里插入圖片描述


?兩個(gè)特別的寄存器
  • EBP:擴(kuò)展基址指針寄存器(extended base pointer),其內(nèi)存放著一個(gè)指針,該指針永遠(yuǎn)指向系統(tǒng)棧最上面一個(gè)棧幀的棧底。

  • ESP:擴(kuò)展堆棧指針寄存器(extended stack pointer),其內(nèi)存放著一個(gè)指針,該指針永遠(yuǎn)指向系統(tǒng)棧最上面一個(gè)棧幀的棧頂。


二、函數(shù)棧幀的指令介紹

在這里插入圖片描述

??對于每一個(gè)函數(shù)在進(jìn)行創(chuàng)建和使用時(shí),都會在內(nèi)存中創(chuàng)建一塊臨時(shí)空間,并在臨時(shí)空間內(nèi)進(jìn)行函數(shù)的處理。

??每一個(gè)函數(shù)被創(chuàng)建就會在棧上創(chuàng)建一塊空間,并且會使EBP與ESP來進(jìn)行維護(hù),也就是說,ESPEBP是專門維護(hù)新創(chuàng)立的函數(shù)的。


?函數(shù)棧幀中的幾個(gè)重要指令
  • push—學(xué)過c++的stl的同學(xué)我感覺應(yīng)該熟悉,push意思就是推、壓,這里就是創(chuàng)建一塊空間。
  • sub—就是相減,作差。
  • mov—就是賦值的意思。
  • lea,mov,mov,rep stos的意思是,把lea這個(gè)為起始到reo stos這里之間的16進(jìn)制數(shù)字,將第一個(gè)mov的值全部改寫成第二個(gè)mov的值。
  • pop—學(xué)過stl的其實(shí)知道就是減,其實(shí)應(yīng)用這里就是釋放棧幀其實(shí)就是銷毀。

?所用用到的指令
int main()
{001C18B0  push        ebp  
001C18B1  mov         ebp,esp  
001C18B3  sub         esp,0E4h  
001C18B9  push        ebx  
001C18BA  push        esi  
001C18BB  push        edi  
001C18BC  lea         edi,[ebp-24h]  
001C18BF  mov         ecx,9  
001C18C4  mov         eax,0CCCCCCCCh  
001C18C9  rep stos    dword ptr es:[edi]  
001C18CB  mov         ecx,1CC008h  
001C18D0  call        001C131B  
	int a = 10;
001C18D5  mov         dword ptr [ebp-8],0Ah  
	int b = 20;
001C18DC  mov         dword ptr [ebp-14h],14h  
	int c = Add(a, b);
001C18E3  mov         eax,dword ptr [ebp-14h]  
001C18E6  push        eax  
001C18E7  mov         ecx,dword ptr [ebp-8]  
001C18EA  push        ecx  
001C18EB  call        001C10B4  
001C18F0  add         esp,8  
001C18F3  mov         dword ptr [ebp-20h],eax  
	printf("%d + %d = %d\n", a, b, c);
001C18F6  mov         eax,dword ptr [ebp-20h]  
001C18F9  push        eax  
001C18FA  mov         ecx,dword ptr [ebp-14h]  
001C18FD  push        ecx  
001C18FE  mov         edx,dword ptr [ebp-8]  
001C1901  push        edx  
001C1902  push        1C7B30h  
001C1907  call        001C10D2  
001C190C  add         esp,10h  
 
	return 0;
001C190F  xor         eax,eax  
}
001C1911  pop         edi  
001C1912  pop         esi  
001C1913  pop         ebx  
001C1914  add         esp,0E4h  
001C191A  cmp         ebp,esp  
001C191C  call        001C1244  
001C1921  mov         esp,ebp  
001C1923  pop         ebp  
001C1924  ret

??(一)這里先寫一個(gè)程序以便于后續(xù)的講解:

#includeint Add(int x,int y)
{int z=0;
	z=x+y;
	return z;
}

int main()
{int a=10;
	int b=20;
	
	int c=0;
	
	c=Add(a,b);
	
	printf("%d\n",c);
	
	return 0; 
}

??(二)這里根據(jù)VS2013就可以看到這里的指令

在這里插入圖片描述

??這里是為了main函數(shù)做準(zhǔn)備,所以下面就開始講解函數(shù)棧幀的


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

在這里插入圖片描述

??函數(shù)__tmainCRTStartup的建立

??(一)指令1.push

在這里插入圖片描述

??(二)指令2.move

在這里插入圖片描述

??(三)指令3.sub

在這里插入圖片描述

??(四)指令4,5,6.push

在這里插入圖片描述
前面指令的匯總:
在這里插入圖片描述

??(五)指令7,8,9,10

在這里插入圖片描述

PS:mov39h個(gè)內(nèi)容,全部改成0cccccccch
?? dword是四個(gè)字節(jié)的意思

在這里插入圖片描述
在這里插入圖片描述


??main函數(shù)建立

在這里插入圖片描述

??(一)指令1.將0Ah賦值給[ebp-8]

??(二)指令2.將14h賦值給[ebp-14h]

??(三)指令3.將0賦值給[ebp-20h]

在這里插入圖片描述


??Add函數(shù)建立


這里沒見過的 詳細(xì)講,見過的就不說了。比如push
指令1.把[ebp-14h]放到eax
指令2.把[ebp-8]放到ecx
指令3.call指令
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
這里由于前面講解,并且指令簡單,所以就直接給大家上圖啦~

在這里插入圖片描述
??以上是整理?xiàng)⒌闹R圖譜


四、函數(shù)棧幀的銷毀

在這里插入圖片描述
在這里插入圖片描述

??三連pop之后就是把我的ebp賦值給esp

在這里插入圖片描述
??最后,執(zhí)行最后一條ret指令,而此時(shí) ret 指令要回到的,又恰恰是此前call 指令存儲在EBP彈出后變?yōu)闂m數(shù)哪莻€(gè)地址:00C21450

??然后按照指令依次釋放就算是銷毀了之前的函數(shù)棧幀,直到主函數(shù)的return 0


總結(jié)

??寫到這里,函數(shù)棧幀的創(chuàng)建以及銷毀算是講完了,但是奈不住我講的不好或者同學(xué)們沒聽懂,我的建議是給我提意見或者仔細(xì)多看幾遍,這樣才能學(xué)明白函數(shù)棧幀。

??我是夏目淺石,希望和你一起學(xué)習(xí)進(jìn)步,刷題無數(shù)?。?!希望各位大佬能一鍵三連支持一下博主,hhhh~我們下期見嘍

在這里插入圖片描述

? 原創(chuàng)不易,還希望各位大佬支持一下 \textcolor{blue}{原創(chuàng)不易,還希望各位大佬支持一下} 原創(chuàng)不易,還希望各位大佬支持一下

👍 點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動力! \textcolor{9c81c1}{點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動力!} 點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動力!

?? 收藏,你的青睞是我努力的方向! \textcolor{ed7976}{收藏,你的青睞是我努力的方向!} 收藏,你的青睞是我努力的方向!

?? 評論,你的意見是我進(jìn)步的財(cái)富! \textcolor{98c091}{評論,你的意見是我進(jìn)步的財(cái)富!} 評論,你的意見是我進(jìn)步的財(cái)富!

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


分享標(biāo)題:C語言---函數(shù)棧幀---超詳解-創(chuàng)新互聯(lián)
文章源于:http://weahome.cn/article/dhpodp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部