文章目錄🚀write in front🚀
📝個(gè)人主頁:認(rèn)真寫博客的夏目淺石.
🎁歡迎各位→點(diǎn)贊👍 + 收藏?? + 留言📝
📣系列專欄:凡人修C傳
💬總結(jié):希望你看完之后,能對你有所幫助,不足請指正!共同學(xué)習(xí)交流 🖊
??為什么我們不知疲倦,因?yàn)槲覀兌荚谧鲎约核鶡釔鄣氖??
之前學(xué)習(xí)C語言函數(shù)遞歸的時(shí)候,遇到了許多的疑惑和困難,所以今天就講一講函數(shù)遞歸的一些基本原理—函數(shù)棧幀的創(chuàng)建與銷毀,來揭開函數(shù)遞歸的神秘面紗。
??之前學(xué)習(xí)遞歸的時(shí)候產(chǎn)生的疑惑:
??而這些疑惑,今天我都會帶著大家解開。并且今天的內(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ù)和位址。
清除數(shù)碼
:將寄存器里的原有數(shù)碼清除。接收數(shù)碼
:在接收脈沖作用下,將外輸入數(shù)碼存入寄存器中。存儲數(shù)碼
:在沒有新的寫入脈沖來之前,寄存器能保存原有數(shù)碼不變。輸出數(shù)碼
:在輸出脈沖作用下,才通過電路輸出數(shù)碼。??僅具有以上功能的寄存器稱為數(shù)碼寄存器;有的寄存器還具有移位功能,稱為—移位寄存器
。
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è)棧幀的棧頂。
??對于每一個(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ù),也就是說,ESP
與EBP
是專門維護(hù)新創(chuà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ù)棧幀的
??(一)指令1.push
??(二)指令2.move
??(三)指令3.sub
??(四)指令4,5,6.push
前面指令的匯總:
??(五)指令7,8,9,10
PS:mov39h個(gè)內(nèi)容,全部改成0cccccccch
?? dword是四個(gè)字節(jié)的意思
??(一)指令1.將0Ah賦值給[ebp-8]
??(二)指令2.將14h賦值給[ebp-14h]
??(三)指令3.將0賦值給[ebp-20h]
這里沒見過的 詳細(xì)講,見過的就不說了。比如push
指令1.把[ebp-14h]放到eax
指令2.把[ebp-8]放到ecx
指令3.call指令
這里由于前面講解,并且指令簡單,所以就直接給大家上圖啦~
??以上是整理?xiàng)⒌闹R圖譜
??三連pop之后就是把我的ebp賦值給esp
??最后,執(zhí)行最后一條ret
指令,而此時(shí) ret 指令要回到的,又恰恰是此前call 指令
存儲在EBP彈出后變?yōu)闂m數(shù)哪莻€(gè)地址:00C21450
??然后按照指令依次釋放就算是銷毀了之前的函數(shù)棧幀,直到主函數(shù)的return 0
;
??寫到這里,函數(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)查看詳情吧