網站首頁 編程語言 正文
在初學c語言中,很多時候要記的內容有點多,有時候并不能深入的了解它。關于函數的棧幀可以幫助我們深入了解函數傳參的過程,讓我們了解c語言。
以下是我們平時接觸過,但不了解的問題:
1.為什么局部變量在未賦值前是隨機的。
2.局部變量創建的過程。
3.函數傳參,傳參的順序問題、
4.形參與實參的關系什么。
5.調用函數是怎么調用的,調用的過程是什么。
6.調用函數結束后,是怎樣返回的。
這些問題我們在學校可能并不會接觸,也不會出現在考試的試卷上,但是作為計算機專業的學生,做一些認識和了解是很有必要的。這就相當于我們的內功,在以后深入學習時,就能夠更快的理解和認識。下面就是函數調用的整個過程,學習完之后,對以上的問題就有一個答案了。
函數棧幀就是系統分配給函數的空間,存放的是地址。
而esp ebp,作用是來維護函數棧幀。
esp ebp跟eax ebx ecx edx一樣,就是系統的寄存器,有一定的存儲功能。
下面就以這個函數為例
int 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; }
main函數和其他函數一樣,main函數也是被調用的函數。
其基本邏輯是mainCRTStartup調用_tmainCRTStartup調用main函數
?程序運行時,ebp與ebp維護_tmainCRTStartup,起初esp處在棧頂指針的位置,而ebp處于棧底的位置。
?首先push,繼續壓棧操作,把ebp的地址打印到esp的位置上?,再把esp的值代到ebp中,esp再加上oE4h的內存編號,就形成了下圖情況。
?此時ebp與esp就來維護main函數,在進行三次push壓棧,將ebx,esi,edi,壓到棧頂。其目的是讓系統正常的運行。
接下來接是lev mov mov的操作,就讓esp與ebp之間的空間的內容全部變為cccccc,這就是在變量未定義前,其值都是隨機值的原因。
?接下來就要定義變量abc了,那系統是怎樣在棧區,給abc留有空間來定義的了?就是以下三步來實現的~這就為abc分配了空間。
?
結果如圖
?
當abc定義后,接下來就是函數調用,函數傳參的過程。
?系統是先將ab的值分別放在eax ecx的寄存器中。
下面這個操作跟main函數開辟空間是類似的。
下面藍色部分,是函數的傳參過程,由圖易知。?函數傳參實際上只是將ab的值保存在寄存器中,在臨時拷貝給x和y。
?
此時ebp-8的位置就是z所在的空間,再儲存再寄存器中。
?然后再將edi esi ebx彈出,ebp的地址傳給esp,再將ebp彈出,ebp與esp回到原來的位置,重新來維護main函數。
?
把儲存在寄存器中z的值傳給c
整個過程就是??函數棧幀的創建和銷毀。說到這些,前面所提的問題就有了一定的答案,可能我認識的只是其中的一部分,但我相信在以后,會了解更多,了解更深人,在此進行講述出來,這也算是我的目標吧。
原文鏈接:https://blog.csdn.net/m0_64332179/article/details/121963466
相關推薦
- 2022-06-01 C語言的動態內存管理你了解嗎_C 語言
- 2022-03-17 .NET?6開發TodoList應用實現結構搭建_實用技巧
- 2022-12-09 C++印刷模板使用方法詳解_C 語言
- 2022-05-24 Flutter滾動組件之SingleChildScrollView使用詳解_Android
- 2023-03-27 python去除空格,tab制表符和\n換行符的小技巧分享_python
- 2021-12-10 C語言光標信息CONSOLE_CURSOR_INFO類型詳解_C 語言
- 2022-03-31 C語言16進制與ASCII字符相互轉換_C 語言
- 2023-06-17 C或C++報錯:ld?returned?1?exit?status報錯的原因及解決方法_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支