国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)

這篇具有很好參考價(jià)值的文章主要介紹了c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前沿:

? ? ? ? 可能很多人也是第一次聽說(shuō)函數(shù)棧幀這個(gè)詞,想問(wèn)什么是函數(shù)棧幀,理解函數(shù)棧幀有什么作用,函數(shù)棧幀的創(chuàng)建銷毀是什么呢?這章節(jié)我們就來(lái)了解一下c語(yǔ)言中函數(shù)棧幀的創(chuàng)建和銷毀。

思維導(dǎo)圖:

c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)目錄

?

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

?1.1?? 函數(shù)棧幀:

1.2? 棧:

?1.3寄存器:

? ?1.3.1? 寄存器的概念是:

1.3.2寄存器的功能:

1.3.3相關(guān)的寄存器為:

1.3.4 相關(guān)匯編命令:

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

2.1首先了解運(yùn)行時(shí)棧堆的使用:

2.2 代碼演示棧幀創(chuàng)建銷毀:

2.2.1首先對(duì)這個(gè)代碼進(jìn)行調(diào)試:?編輯

2.2.2 代碼反匯編:

2.2.3函數(shù)棧幀的創(chuàng)建:

2.2.4函數(shù)棧幀的銷毀:

三、總結(jié):


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

?1.1?? 函數(shù)棧幀:

? ? ? ? 1.1.1? 函數(shù)被調(diào)用時(shí),系統(tǒng)會(huì)在棧區(qū)為該函數(shù)開辟一塊棧空間,這個(gè)??臻g就是該函數(shù)的函數(shù)棧幀。以main函數(shù)的調(diào)用為例,main函數(shù)是被 invoke_main函數(shù)調(diào)用的,nvoke_main函數(shù)被那個(gè)函數(shù)調(diào)用我們先不去了解。當(dāng)main函數(shù)被調(diào)用時(shí)就會(huì)在棧區(qū)為其開辟一塊空間來(lái)用于main函數(shù)的執(zhí)行,而當(dāng)main函數(shù)結(jié)束時(shí)這塊空間將會(huì)進(jìn)行銷毀,這個(gè)過(guò)程就是函數(shù)棧幀的創(chuàng)建和銷毀的初步了解和認(rèn)識(shí)。

1.2? 棧:

? ? 1.2.1? 學(xué)習(xí)棧幀前我們先了解一下棧 棧的概念是:棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入?;驂簵?,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個(gè)棧刪除元素又稱作出?;蛲藯#前褩m斣貏h除掉,使其相鄰的元素成為新的棧頂元素。
? ? ?1.2.2? 棧 通俗的理解可以理解為我們所住的賓館,當(dāng)我們需要的時(shí)候就入住,而入住時(shí)間結(jié)束則需要退房,所以在計(jì)算機(jī)里面棧就是指數(shù)據(jù)暫時(shí)存儲(chǔ)的地方,所以才有進(jìn)棧、出棧的說(shuō)法。
? ? 1.2.3 在計(jì)算機(jī)系統(tǒng)中,棧則是一個(gè)具有以上屬性的動(dòng)態(tài)內(nèi)存區(qū)域。程序可以將數(shù)據(jù)壓入棧中,也可以將數(shù)據(jù) 從棧頂彈出。壓棧操作使得棧增大,而彈出操作使得棧減小。 在經(jīng)典的操作系統(tǒng)中,??偸窍蛳略鲩L(zhǎng)(由高地址向低地址)的。 在我們常見的i386 或者 x86-64 下,棧頂由成為 esp 的寄存器進(jìn)行定位的。
c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)

?1.3寄存器:

~同樣的我們也需要了解一下什么是寄存器。

? ?1.3.1? 寄存器的概念是

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

1.3.2寄存器的功能:

①清除數(shù)碼:將寄存器里的原有數(shù)碼清除。

②接收數(shù)碼:在接收脈沖作用下,將外輸入數(shù)碼存入寄存器中。

③存儲(chǔ)數(shù)碼:在沒有新的寫入脈沖來(lái)之前,寄存器能保存原有數(shù)碼不變。

④輸出數(shù)碼:在輸出脈沖作用下,才通過(guò)電路輸出數(shù)碼。

1.3.3相關(guān)的寄存器為

①?eax:通用寄存器,保留臨時(shí)數(shù)據(jù),常用于返回值。
②?ebx:通用寄存器,保留臨時(shí)數(shù)據(jù)。
③?ebp:棧底寄存器。
④?esp:棧頂寄存器。

⑤?eip:指令寄存器,保存當(dāng)前指令的下一條指令的地址。

1.3.4 相關(guān)匯編命令:

1、mov :數(shù)據(jù)轉(zhuǎn)移指令
2、push :數(shù)據(jù)入棧,同時(shí) esp 棧頂寄存器也要發(fā)生改變
3、pop :數(shù)據(jù)彈出至指定位置,同時(shí) esp 棧頂寄存器也要發(fā)生改變
4、sub:減法命令
5、add:加法命令
6、call :函數(shù)調(diào)用, 1 . 壓入返回地址 2. 轉(zhuǎn)入目標(biāo)函數(shù)
7、jump :通過(guò)修改 eip ,轉(zhuǎn)入目標(biāo)函數(shù),進(jìn)行調(diào)用
8、ret :恢復(fù)返回地址,壓入 eip ,類似 pop eip 命令

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

2.1首先了解運(yùn)行時(shí)棧堆的使用:

c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)

函數(shù)被調(diào)用時(shí),系統(tǒng)會(huì)在棧區(qū)為該函數(shù)開辟一塊??臻g,這個(gè)??臻g就是該函數(shù)的函數(shù)棧幀,而以用到的寄存器esp 和 ebp , ebp 記錄的是棧底的地址, esp 記錄的是棧頂 的地址。

2.2 代碼演示棧幀創(chuàng)建銷毀:

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

?代碼是很簡(jiǎn)單的主要是為了我們來(lái)進(jìn)行深入的了解棧幀的創(chuàng)建和銷毀。

2.2.1首先對(duì)這個(gè)代碼進(jìn)行調(diào)試:c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)

? ? ? 我們剛開始就已經(jīng)說(shuō)啦,main函數(shù)是被invoke_main函數(shù)調(diào)用的,invoke_main函數(shù)被那個(gè)函數(shù)調(diào)用我們先不去了解。但函數(shù)棧幀的創(chuàng)建和銷毀過(guò)程,在不同的編譯器上實(shí)現(xiàn)的方法大同小異,可能不同的編譯器main調(diào)用函數(shù)不一樣但是方法都是相同的。這樣我們就可以知道invoke_main函數(shù)肯定存在自己的棧幀,相同的main函數(shù)和Add函數(shù)也會(huì)存在自己的棧幀,每個(gè)函數(shù)棧幀都有自己的 ebp esp 來(lái)維護(hù)棧幀空間。

2.2.2 代碼反匯編:

c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)

2.2.3函數(shù)棧幀的創(chuàng)建:

? 上面代碼的反匯編們來(lái)幫助我們進(jìn)行理解?

00 BE1820? ? push? ? ? ? ? ?ebp???????? // ebp 寄存器中的值進(jìn)行壓棧,此時(shí)的 ebp 中存放的是
invoke_main 函數(shù)棧幀的 ebp , esp-4
00 BE1821? ? mov? ? ? ? ? ? ebp , esp ???????? //move 指令會(huì)把 esp 的值存放到 ebp 中,相當(dāng)于產(chǎn)生了 main 函數(shù)的 ebp,這個(gè)值就是 invoke_main 函數(shù)棧幀的 esp
00 BE1823? ? sub? ? ? ? ? ? ?esp , 0E4 h???????? //sub 會(huì)讓 esp 中的地址減去一個(gè) 16 進(jìn)制數(shù)字 0xe4, 產(chǎn)生新的esp,此時(shí)的 esp main 函數(shù)棧幀的 esp ,此時(shí)結(jié)合上一條指令的 ebp 和當(dāng)前的 esp , ebp esp 之間維護(hù)了一 個(gè)塊棧空間,這塊棧空間就是為main 函數(shù)開辟的,就是 main 函數(shù)的棧幀空間,這一段空間中將存儲(chǔ) main 函數(shù) 中的局部變量,臨時(shí)數(shù)據(jù)已經(jīng)調(diào)試信息等。
00 BE1829? ? push? ? ? ? ? ?ebx // 將寄存器 ebx 的值壓棧, esp-4
00 BE182A? ? push? ? ? ? ? ?esi // 將寄存器 esi 的值壓棧, esp-4
00 BE182B push edi // 將寄存器 edi 的值壓棧, esp-4
// 上面 3 條指令保存了 3 個(gè)寄存器的值在棧區(qū),這 3 個(gè)寄存器的在函數(shù)隨后執(zhí)行中可能會(huì)被修改,所以先保存寄
存器原來(lái)的值,以便在退出函數(shù)時(shí)恢復(fù)。
// 下面的代碼是在初始化 main 函數(shù)的棧幀空間。
//1. 先把 ebp-24h 的地址,放在 edi
//2. 9 放在 ecx
//3. 0xCCCCCCCC 放在 eax
//4. 將從 edp-0x2h ebp 這一段的內(nèi)存的每個(gè)字節(jié)都初始化為 0xCC
00 BE182C? ? lea? ? ? ? ? ? ? ? edi ,[ ebp - 24 h ]
00 BE182F? ? mov? ? ? ? ? ? ? ecx , 9
00 BE1834? ? mov? ? ? ? ? ? ? eax , 0 CCCCCCCCh
? c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)

?這里我們知道一個(gè)小的知識(shí)點(diǎn):

? ? ?為什么局部變量的時(shí)候一定要初始化,因?yàn)槿魺o(wú)初始化系統(tǒng)在內(nèi)存中初始化都為0xCC,產(chǎn)生的隨機(jī)值我們是不知道的,所以一定要初始化你定的數(shù)。

?????????????????int a = 3;

00 BE183B ???????????mov??????????? ? dword ptr [ ebp - 8 ], 3 // 3 存儲(chǔ)到 ebp-8 的地址處, ebp-8 的位置其就是 變量
????????????????int b = 5 ;
00 BE1842? ? ? ? ? ? mov ?????????????dword ptr [ ebp - 14 h ], 5 // 5 存儲(chǔ)到 ebp-14h 的地址處, ebp-14h 的位置 其實(shí)是b 變量
????????????????int ret = 0 ;
00 BE1849? ? ? ? ? ? mov ?????????????dword ptr [ ebp - 20 h ], 0 // 0 存儲(chǔ)到 ebp-20h 的地址處, ebp-20h 的位 置其實(shí)是ret 變量
// 以上匯編代碼表示的變量 a,b,ret 的創(chuàng)建和初始化,這就是局部的變量的創(chuàng)建和初始化
// 其實(shí)是局部變量的創(chuàng)建時(shí)在局部變量所在函數(shù)的棧幀空間中創(chuàng)建的
// 調(diào)用 Add 函數(shù)
????????????????ret = Add ( a , b );
// 調(diào)用 Add 函數(shù)時(shí)的傳參
// 其實(shí)傳參就是把參數(shù) push 到棧幀空間中
00 BE1850? ? ? ? ? ? mov? ? ? ? ? ? ? ??eax , dword ptr [ ebp - 14 h ] ???????? // 傳遞 b ,將 ebp-14h 處放的 5 放在 eax 寄存器中
00 BE1853? ? ? ? ? ?push ???????????????eax ???????? // eax 的值壓棧, esp-4
00 BE1854? ? ? ? ?? mov ????????????????ecx , dword ptr [ ebp - 8 ] ???????? // 傳遞 a ,將 ebp-8 處放的 3 放在 ecx 寄存器中
00 BE1857? ? ? ? ?? push ???????????????ecx ???????? // ecx 的值壓棧, esp-4
//跳轉(zhuǎn)調(diào)用函數(shù)
00 BE1858? ? ? ? ?? call????????????????? 00 BE10B4
00 BE185D? ? ? ? ? add???????????????? esp , 8
00 BE1860? ? ? ? ??mov ????????????????dword ptr [ ebp - 20 h ], eax

c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)

Add的傳參?:?

????????//調(diào)用 Add 函數(shù)
????????ret = Add ( a , b );
????????//調(diào)用 Add 函數(shù)時(shí)的傳參
????????//其實(shí)傳參就是把參數(shù) push 到棧幀空間中,這里就是函數(shù)傳參
00 BE1850 ????????mov ????????eax , dword ptr [ ebp - 14 h ]???????? // 傳遞 b ,將 ebp-14h 處放的 5 放在 eax 寄存器中
00 BE1853???????? push ????????eax ???????? // eax 的值壓棧, esp-4
00 BE1854 ????????mov???????? ecx , dword ptr [ ebp - 8 ] ???????? // 傳遞 a ,將 ebp-8 處放的 3 放在 ecx 寄存器中
00 BE1857 ????????push ????????ecx ???????? // ecx 的值壓棧, esp-4
// 跳轉(zhuǎn)調(diào)用函數(shù)
00 BE1858 ????????call???????? 00 BE10B4
00 BE185D ????????add ????????esp , 8
00 BE1860 ????????mov ????????dword ptr [ ebp - 20 h ], eax

?

c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)

?函數(shù)調(diào)用過(guò)程:

00 BE1858 ????????call ???????? 00 BE10B4
00 BE185D ????????add???????? esp , 8
00 BE1860 ????????mov ????????dword ptr [ ebp - 20 h ], eax
? ? ? ? call 指令是要執(zhí)行函數(shù)調(diào)用邏輯的,在執(zhí)行 call 指令之前先會(huì)把 call 指令的下一條指令的地址進(jìn)行壓棧操作,這個(gè)操作是為了解決當(dāng)函數(shù)調(diào)用結(jié)束后要回到call 指令的下一條指令的地方,繼續(xù)往后執(zhí)行。
Add函數(shù)的反匯編:

?int Add(int x, int y)

{
00 BE1760 ????????push???????? ebp ???????? // main 函數(shù)棧幀的 ebp 保存 ,esp-4
00 BE1761 ????????mov ????????ebp , esp ???????? // main 函數(shù)的 esp 賦值給新的 ebp , ebp 現(xiàn)在是 Add 函數(shù)的 ebp
00 BE1763???????? sub ????????esp , 0 CCh ???????? // esp-0xCC ,求出 Add 函數(shù)的 esp
00 BE1769 ????????push ????????ebx ???????? // ebx 的值壓棧 ,esp-4
00 BE176A ????????push ????????esi ???????? // esi 的值壓棧 ,esp-4
00 BE176B ????????push???????? edi???????? // edi 的值壓棧 ,esp-4
int z = 0 ;
00 BE176C ????????mov ????????dword ptr [ ebp - 8 ],???????? ? // 0 放在 ebp-8 的地址處,其實(shí)就是創(chuàng)建 z
z = x + y ;
// 接下來(lái)計(jì)算的是 x+y ,結(jié)果保存到 z
00 BE1773 ????????mov ????????eax , dword ptr [ ebp + 8 ] // ebp+8 地址處的數(shù)字存儲(chǔ)到 eax
00 BE1776 ????????add ????????eax , dword ptr [ ebp + 0 Ch ] // ebp+12 地址處的數(shù)字加到 eax 寄存中
00 BE1779 ????????mov ????????dword ptr [ ebp - 8 ], eax ???????? // eax 的結(jié)果保存到 ebp-8 的地址處,其實(shí) 就是放到z
return z ;
00 BE177C???????? mov ????????eax , dword ptr [ ebp - 8 ] ???????? // ebp-8 地址處的值放在 eax 中,其實(shí)就是把z 的值存儲(chǔ)到 eax 寄存器中,這里是想通過(guò) eax 寄存器帶回計(jì)算的結(jié)果,做函數(shù)的返回值。
}
00 BE177F ????????pop ????????edi
00 BE1780 ????????pop ????????esi
00 BE1781 ????????pop ????????ebx
00 BE1782???????? mov ????????esp , ebp
00 BE1784 ????????pop ????????ebp
00 BE1785???????? ret
? ? 代碼執(zhí)行到Add函數(shù)的時(shí)候,就要開始創(chuàng)建Add函數(shù)的棧幀空間了。
?在Add函數(shù)中創(chuàng)建棧幀的方法和在main函數(shù)中是相似的,在棧幀空間的大小上略有差異而已。就不再進(jìn)行演示啦。

2.2.4函數(shù)棧幀的銷毀:

1、要知道我們創(chuàng)建的棧就好比我們住的賓館,當(dāng)不用的時(shí)候要退房間,棧也一樣,當(dāng)調(diào)用完成后要進(jìn)行銷毀。而如何銷毀呢我們可以看一下。

00BE177F???????? pop ????????edi ????????//在棧頂彈出一個(gè)值,存放到edi中,esp+4

00 BE1780 ????????pop ????????esi ???????? // 在棧頂彈出一個(gè)值,存放到 esi 中, esp+4
00 BE1781 ????????pop ????????ebx ???????? // 在棧頂彈出一個(gè)值,存放到 ebx 中, esp+4
00 BE1782 ????????mov ????????esp , ebp ???????? //再將 Add 函數(shù)的 ebp 的值賦值給 esp ,相當(dāng)于回收了 Add 函數(shù)的棧幀空間
00 BE1784 ????????pop???????? ebp???????? // 彈出棧頂?shù)闹荡娣诺?/span> ebp ,棧頂此時(shí)的值恰好就是 main 函數(shù)的 ebp, esp+4,此時(shí)恢復(fù)了 main 函數(shù)的棧幀維護(hù), esp 指向 main 函數(shù)棧幀的棧頂, ebp 指向了 main 函數(shù)棧幀的棧底。
00 BE1785???????? ret ???????? //ret 指令的執(zhí)行,首先是從棧頂彈出一個(gè)值,此時(shí)棧頂?shù)闹稻褪?/span> call 指 令下一條指令的地址,此時(shí)esp+4 ,然后直接跳轉(zhuǎn)到 call 指令下一條指令的地址處,繼續(xù)往下執(zhí)行。
c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)
?
但調(diào)用完 Add 函數(shù),回到 main 函數(shù)的時(shí)候,繼續(xù)往下執(zhí)行,可以看到:
?
00 BE185D ????????add ????????esp , 8 //esp 直接 +8 ,相當(dāng)于跳過(guò)了 main 函數(shù)中壓棧的 a'和 b'
00 BE1860???????? mov ????????dword ptr [ ebp - 20 h ], eax // eax 中值,存檔到 ebp-0x20 的地址處,其實(shí)就是存儲(chǔ)到main 函數(shù)中 ret 變量中,而此時(shí) eax 中就是 Add 函數(shù)中計(jì)算的 x y 的和,可以看出來(lái),本次函數(shù)的返回值是由eax 寄存器帶回來(lái)的。程序是在函數(shù)調(diào)用返回之后,在 eax 中去讀取返回值的。

?到這里函數(shù)棧幀的創(chuàng)建和銷毀就結(jié)束了。

三、總結(jié):

學(xué)完想必我們就好理解一下幾個(gè)問(wèn)題啦:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-466391.html

1、局部變量是如何創(chuàng)建的?在申請(qǐng)棧幀空間的時(shí)候,會(huì)存在一小部分空間來(lái)存放我們的局部變量
2、為什么局部變量不初始話的值是隨機(jī)的?因?yàn)槿魺o(wú)初始化系統(tǒng)在內(nèi)存中初始化都為0xCC,產(chǎn)生的隨機(jī)值我們是不知道的,所以一定要初始化你定的數(shù)。
3、函數(shù)是怎么傳參的?再?zèng)]有傳參之前我們就通過(guò)寄存器指令就已經(jīng)把函數(shù)的形參已經(jīng)傳入寄存器中,等調(diào)用Add函數(shù)時(shí)開辟新的棧幀空間時(shí)我們?cè)賹⑿螀⑿螀魅脒M(jìn)去。
4、形參和實(shí)參是什么關(guān)系?形參是我們?cè)趬赫サ臅r(shí)候形成的,和我們實(shí)參值是相同的,但空間是獨(dú)立的。所以形參只是我們實(shí)參的臨時(shí)拷貝,改變形參不會(huì)影響實(shí)參的結(jié)果。
5、最后孩子碼文不易,如果覺得內(nèi)容有用,希望大家點(diǎn)贊收藏,一同學(xué)習(xí)進(jìn)步?。。。?

到了這里,關(guān)于c語(yǔ)言(函數(shù)棧幀的創(chuàng)建和銷毀)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C語(yǔ)言之反匯編查看函數(shù)棧幀的創(chuàng)建與銷毀

    C語(yǔ)言之反匯編查看函數(shù)棧幀的創(chuàng)建與銷毀

    函數(shù)棧幀是用于在計(jì)算機(jī)程序中實(shí)現(xiàn)函數(shù)調(diào)用的一種數(shù)據(jù)結(jié)構(gòu)。在函數(shù)調(diào)用過(guò)程中,每個(gè)函數(shù)都需要在內(nèi)存中創(chuàng)建一個(gè)棧幀,用于存儲(chǔ)局部變量、返回地址和參數(shù)等。 具體來(lái)說(shuō),函數(shù)棧幀通常包含以下部分: 局部變量表:存儲(chǔ)函數(shù)的局部變量,包括基本數(shù)據(jù)類型(如整數(shù)、

    2024年01月23日
    瀏覽(16)
  • 【C語(yǔ)言__函數(shù)棧幀的創(chuàng)建和銷毀__復(fù)習(xí)篇9】

    【C語(yǔ)言__函數(shù)棧幀的創(chuàng)建和銷毀__復(fù)習(xí)篇9】

    目錄 前言 一、知識(shí)補(bǔ)充 二、分析創(chuàng)建和銷毀的過(guò)程 三、前言問(wèn)題回答 本篇主要討論以下問(wèn)題: 1. 編譯器什么時(shí)候?yàn)榫植孔兞糠峙涞目臻g 2. 為什么局部變量的值是隨機(jī)的 3. 函數(shù)是怎么傳參的,傳參的順序是怎樣的 4. 形參和實(shí)參是什么關(guān)系 5. 函數(shù)調(diào)用是怎么做的 6. 函數(shù)調(diào)

    2024年04月25日
    瀏覽(20)
  • 打通你學(xué)習(xí)C語(yǔ)言的任督二脈-函數(shù)棧幀的創(chuàng)建和銷毀(上)

    打通你學(xué)習(xí)C語(yǔ)言的任督二脈-函數(shù)棧幀的創(chuàng)建和銷毀(上)

    ? ??個(gè)人主頁(yè):? Aileen_0v0 ??系列專欄: C語(yǔ)言學(xué)習(xí) ??個(gè)人格言: \\\"沒有羅馬,那就自己創(chuàng)造羅馬~\\\" 待解決疑惑: 局部變量是怎么創(chuàng)建的? 為什么局部變量的值是隨機(jī)值? 函數(shù)是怎么傳參的?傳參的順序是怎樣的? 形參和實(shí)參是什么關(guān)系? 函數(shù)調(diào)用是怎么做的? 函數(shù)調(diào)用是結(jié)束后怎么返

    2024年02月05日
    瀏覽(22)
  • 函數(shù)棧幀的創(chuàng)建和銷毀

    函數(shù)棧幀的創(chuàng)建和銷毀

    前言 觀察函數(shù)棧幀的創(chuàng)建和銷毀,不要使用太高級(jí)別的的編譯器,越高級(jí)的編譯器越不容易學(xué)習(xí)和觀察。同時(shí)在不同編譯器下,函數(shù)調(diào)用的過(guò)程中棧幀的創(chuàng)建是略有差異的,具體細(xì)節(jié)取決于編譯器的實(shí)現(xiàn) 我們?cè)趯慍語(yǔ)言代碼的時(shí)候,經(jīng)常會(huì)把一個(gè)獨(dú)立的功能抽象為函數(shù),所以

    2023年04月17日
    瀏覽(21)
  • 函數(shù)棧幀的創(chuàng)建與銷毀

    函數(shù)棧幀的創(chuàng)建與銷毀

    魔王的介紹:??????一名雙非本科大一小白。 魔王的目標(biāo):??努力趕上周圍卷王的腳步。 魔王的主頁(yè):??????大魔王.?????? ?????大魔王與你分享:莫泊桑說(shuō)過(guò),生活可能不像你想象的那么好,但是也不會(huì)像你想象的那么糟。人的脆弱和堅(jiān)強(qiáng)都超乎了自己的想

    2024年02月15日
    瀏覽(20)
  • 從匯編代碼探究函數(shù)棧幀的創(chuàng)建和銷毀的底層原理

    從匯編代碼探究函數(shù)棧幀的創(chuàng)建和銷毀的底層原理

    人,只有在放棄戰(zhàn)斗的時(shí)候才算輸,只要堅(jiān)持戰(zhàn)斗,就還沒輸? 本文收錄于青花霧氣-計(jì)算機(jī)基礎(chǔ) 往期回顧 從0到1搞定在線OJ 數(shù)據(jù)在內(nèi)存中的存儲(chǔ) 計(jì)算機(jī)存儲(chǔ)的大小端模式 目錄 一、先導(dǎo)知識(shí) 二、函數(shù)調(diào)用堆棧 三、函數(shù)棧幀的創(chuàng)建 1.創(chuàng)建函數(shù)棧幀 2.創(chuàng)建變量 3.函數(shù)傳參 4.函數(shù)

    2024年02月08日
    瀏覽(13)
  • 【C語(yǔ)言】函數(shù)棧幀的創(chuàng)建和毀銷

    【C語(yǔ)言】函數(shù)棧幀的創(chuàng)建和毀銷

    大家好,我是深魚~ 目錄 一、寄存器 二、棧區(qū) ?三、函數(shù)棧幀的創(chuàng)建 1.為main函數(shù)開辟棧幀? 2.在main函數(shù)中創(chuàng)建變量 3.調(diào)用Add函數(shù)前的準(zhǔn)備 ?4.為Add函數(shù)開辟棧幀 ?5.在Add函數(shù)中創(chuàng)建變量并運(yùn)算 四、函數(shù)棧幀的銷毀 6.Add函數(shù)棧幀的銷毀 7.返回main函數(shù)棧幀 【前言】 前期學(xué)習(xí)的時(shí)

    2024年02月14日
    瀏覽(15)
  • 函數(shù)棧幀的創(chuàng)建和毀銷【C語(yǔ)言版】

    函數(shù)棧幀的創(chuàng)建和毀銷【C語(yǔ)言版】

    大家好,我是深魚~ 目錄 一、寄存器 二、棧區(qū) ?三、函數(shù)棧幀的創(chuàng)建 1.為main函數(shù)開辟棧幀? 2.在main函數(shù)中創(chuàng)建變量 3.調(diào)用Add函數(shù)前的準(zhǔn)備 ?4.為Add函數(shù)開辟棧幀 ?5.在Add函數(shù)中創(chuàng)建變量并運(yùn)算 四、函數(shù)棧幀的銷毀 6.Add函數(shù)棧幀的銷毀 7.返回main函數(shù)棧幀 【前言】 前期學(xué)習(xí)的時(shí)

    2024年02月15日
    瀏覽(21)
  • 探秘函數(shù)棧幀:『 揭開函數(shù)棧幀創(chuàng)建與銷毀的神秘面紗 』

    探秘函數(shù)棧幀:『 揭開函數(shù)棧幀創(chuàng)建與銷毀的神秘面紗 』

    .. 目錄 知識(shí)點(diǎn)回顧 一、什么是棧幀(堆棧幀)? 1.內(nèi)存布局 2.常用寄存器 3.匯編指令 ????對(duì)于棧的詳細(xì)介紹 : ????函數(shù)棧幀的介紹: 二、函數(shù)調(diào)用中的棧幀 1.探究main函數(shù)棧幀的創(chuàng)建 2.對(duì)main函數(shù)中的代碼進(jìn)行分析 3.探究Add函數(shù)棧幀的創(chuàng)建? 三、函數(shù)棧幀的銷毀過(guò)程 博客引

    2024年02月06日
    瀏覽(29)
  • 學(xué)C的第十一天【查看匯編代碼一步步了解 函數(shù)棧幀(棧區(qū)局部變量)的創(chuàng)建和銷毀】

    學(xué)C的第十一天【查看匯編代碼一步步了解 函數(shù)棧幀(棧區(qū)局部變量)的創(chuàng)建和銷毀】

    ========================================================================= 相關(guān)代碼gitee自?。?C語(yǔ)言學(xué)習(xí)日記: 加油努力 (gitee.com) ========================================================================= 接上期: 學(xué)C的第十天(繼續(xù)深入學(xué)習(xí)函數(shù)、函數(shù)遞歸、練習(xí))-CSDN博客 ============================================

    2024年02月04日
    瀏覽(49)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包