C语言—函数栈帧

        函数,一般都有返回值,函数名,参数,再下来还有什么mian函数,函数写出来就是要被调用的,上面图片上的代码,main函数和myadd函数,都要在自己的栈结构什么形成自己的栈,可以帮我们理解局部变量,为什么是临时,栈上开辟空间,栈的地址是向下增长,堆也学了,堆向上增长,每调一个函数,就是形成栈帧的一个过程,返回函数是栈帧被释放的一个过程,释放不是真正的释放,而是让这块空间无效,下一次创建栈帧的时候可以覆盖掉。

        局部变量为什么具有临时性,是因为在对应的函数内栈帧上面创建的,函数被返回时,栈帧结构都被释放了,赖以生存的环境都没有了,所以变量也被释放了。

        今天就来看看栈帧的形成与释放。

        把一个函数的生命周期理解,其他都好理解了,因为从main函数开始都是函数调用,一个函数的生命周期搞定了,整个生命周期都搞定了。

        我直接从myadd开始,就预设main函数有自己的栈帧了,只要myadd理解透了,其他的都搞定了。

        先来了解一下东西寄存器和一些简单的汇编一下命令

 寄存器最重要的就是后三个,ebp、esp,有了这两个寄存器,就可以有效指向一块内存,eip保存着当前指令的下一条指令的地址,本质就是衡量我们指向到了某个位置

 先把代码和图画出来,画出内存分布图,我们栈帧结构主要研究栈区,所以把栈区放大,栈区地址是往小的增的。

       代码启动调试之后一路f10,进来 ,看图片的右上角,出现了几个隐藏的函数,所以main函数也是一个函数。main函数是被谁调用的。

 是被_tmianCRTStartup()调用的,但是它也是函数也谁调用它

它也是被 mainCRTStartup调用,只是做了一下cookie

 mainCRTStartup它也是函数呀,它被谁调用?记住一件事,要被执行,第一步加载到内存,第二步就要开始执行,开始之前永远都是,操作系统来做,调mainCRTStartup,这里就是调用边界了。

所以我先研究add的栈帧,就是那个绿色的方格,只要一个清楚了其他的都清楚了,好,准备工作完成。

我重新画一张图,除了栈,还有cpu和三个寄存器,前面说了

 esp和ebp指向main的起始位置和结束的位置,也就是地址,

 

eip先代表着执行者main的代码 

好前期工作完成 ,启动反汇编,

直接来到这里 ,意思是esp-8个字节定位的位置吧0Ah,放到我们的栈帧当中,一条汇编做了两件事,开辟空间,完成初始化

 看eip寄存器指向的位置,还没有开始执行,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值