C語言堆棧幀的介紹與創(chuàng)建
什么是堆棧幀?
堆棧幀(stack frame)是一塊堆棧保留區(qū)域,用于存放被傳遞的實際參數(shù),子程序的返回值、局部變量以及被保存的寄存器。
堆棧幀的創(chuàng)建方法🐱👤【32bit Windows】
(1)被傳遞的實際參數(shù)。如果有,則壓入堆棧;
(2)當(dāng)子程序被調(diào)用時,使該子程序的返回值壓入堆棧。如果使用寄存器保存返回值,則跳過此步;
(3)子過程返回地址入棧;
(4)子程序開始執(zhí)行時,EBP被壓入堆棧;
(5)設(shè)置EBP等于ESP。從現(xiàn)在開始,EBP就變成了該子程序所有參數(shù)的引用基址;
(6)如果有局部變量,修改ESP以便在堆棧中為這些變量預(yù)留空間;
(7)如果需要保存寄存器,則將它們?nèi)霔#?/p>
我們來看一段code👇
#include<stdio.h>
int print_string(const char * str)
{
/* EBP被壓入堆棧,對應(yīng)上述步驟(4) */
//00FE18A0 push ebp
/* 設(shè)置EBP等于ESP,對應(yīng)上述步驟(5) */
//00FE18A1 mov ebp,esp
/* 雖然我們沒有局部變量,但是編譯器還是預(yù)留了空間,對應(yīng)上述步驟(6) */
//00FE18A3 sub esp,0C0h
/* 保存寄存器,對應(yīng)上述步驟(7) */
//00FE18A9 push ebx
//00FE18AA push esi
//00FE18AB push edi
printf("%s\n", str);
/* 將printf函數(shù)的入?yún)喝攵褩?*/
//00FE18C1 mov eax,dword ptr [str]
//00FE18C4 push eax
//00FE18C5 push offset string "%s\n" (0FE7B30h)
//00FE18CA call _printf (0FE10CDh)
//00FE18CF add esp,8
return 1;
/* 使用寄存器存儲返回值 */
//00FE18D2 mov eax,1
}
int main()
{
char* str = "Hello World";
/* 將"Hello World"的地址存在str變量中 */
//00FE1865 mov dword ptr [str],offset string "Hello World" (0FE7B34h)
print_string(str);
/* 將str 中的值存在eax寄存器中 */
//00FE186C mov eax,dword ptr [str]
/* eax壓棧,對應(yīng)上述步驟(1) */
//00FE186F push eax
/* 這里我們使用寄存器存儲返回值,所以沒有步驟(2) */
/* call指令會自動將返回地址壓棧,對應(yīng)上述步驟(3) */
//00FE1870 call _print_string (0FE13B1h)
/* 清空 print_string函數(shù)的入?yún)⒖臻g */
//00FE1875 add esp,4
return 0;
//00FE1878 xor eax,eax
}
我們再通過一張圖來解釋一下:
//我們的匯編code如下 print_string PROC push ebp // 保存基址寄存器 mov ebp,esp // 堆棧幀基址 push ecx push edx // 保存寄存器 mov eac,[ebx+8] // 取堆棧參數(shù) . . pop edx // 恢復(fù)被保存的寄存器 pop ecx pop ebp // 恢復(fù)基址指針 ret // 清除堆棧 print_string ENDP
函數(shù)print_string() 對應(yīng)的堆棧幀如下圖👇

總結(jié)
到此這篇關(guān)于C語言堆棧幀的文章就介紹到這了,更多相關(guān)C語言堆棧幀內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
標(biāo)準(zhǔn)C++類string的Copy-On-Write技術(shù)
這里,我想從C++類或是設(shè)計模式的角度為各位揭開Copy-On-Write技術(shù)在string中實現(xiàn)的面紗,以供各位在用C++進(jìn)行類庫設(shè)計時做一點參考2013-11-11
C語言實現(xiàn)學(xué)生個人消費(fèi)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生個人消費(fèi)管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08
C語言關(guān)于include順序不同導(dǎo)致編譯結(jié)果不同的問題
這篇文章主要介紹了在日常調(diào)試C語言中include的順序不同從而影響最后編譯結(jié)果不同的問題,究其原因是寫代碼的習(xí)慣所導(dǎo)致,下面跟小編一起來看看吧2022-04-04
VSCode遠(yuǎn)程代碼開發(fā)及DNS隧道端口轉(zhuǎn)發(fā)實現(xiàn)遠(yuǎn)程辦公代碼
這篇文章主要介紹了VSCode遠(yuǎn)程代碼開發(fā)及DNS隧道端口轉(zhuǎn)發(fā)實現(xiàn)遠(yuǎn)程辦公,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04

