首页
社区
课程
招聘
[原创]02 C语言-嵌套函数的栈空间布局
发表于: 2021-3-23 15:56 9207

[原创]02 C语言-嵌套函数的栈空间布局

2021-3-23 15:56
9207

前言

    该文章主要描述说明C语言Debug环境下,函数调用函数它的内存布局是如何的一样状态。

    首先,我们先简单说明一下上述代码,程序会在main() 位置开始执行,执行到“c = b(1,2,3)”会调用b()函数,在b()函数内部又调用了a()函数。最终,执行的值放入变量c当中。


    接下来,我们先将内存布局图画出来,然后在逐步分析为什么会产生这样的内存布局。如果不了解如何画出内存布局,可以参考我之前的文章。连接如下:https://bbs.pediy.com/thread-266576.htm


    接下来,我们来具体分析一下这张图,我们,我们先将程序使用OD打开,并且定位到地址“00881858”位置。详细如下图:

    该位置执行了三个push 指令以及一个call 指令,完成了参数的传递以及函数的调用。执行完成栈空间的状态如下图。此时我们发现b()函数的参数已经进入栈中,并且b()函数的返回地址已经压入栈区。

    执行完call 指令,代码定位到如下图位置。此时,会执行保存上个栈底,初始化新的b()函数的栈帧,划分cc大小的缓冲区,初始化缓冲区为cc指令以及保存环境的操作。

    上述红框当中代码执行完成之后,栈空间状态如下图:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-3-23 16:24 被天象独行编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (5)
雪    币: 137
活跃值: (1548)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

栈是向下增长的,往里面push数据,esp的值越来越小。
那个不是cc大小的缓冲区, 只是把临时变量值初始化为cc, 只有debug才会这样做, release不会做这个初始化

最后于 2021-4-16 12:34 被wumnkx编辑 ,原因:
2021-4-16 10:21
0
雪    币: 1657
活跃值: (6833)
能力值: ( LV12,RANK:215 )
在线值:
发帖
回帖
粉丝
3
wumnkx 栈是向下增长的,往里面push数据,esp指针的值越来越小。 那个不是cc大小的缓冲区, 只是把临时变量值初始化为cc, 只有开了O1、O2优化才会这样做, release不会做这个初始化
谢谢指点,这里是我描述有问题,我是根据指令“sub esp,0xcc” 说明它的缓冲区大小为CC。
2021-4-16 11:33
0
雪    币: 137
活跃值: (1548)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
天象独行 谢谢指点,这里是我描述有问题,我是根据指令“sub esp,0xcc” 说明它的缓冲区大小为CC。

上面我说错了, 是开了运行时检查就会填充cc。/RTCs, /RTCu, /RTC1

最后于 2021-4-16 12:03 被wumnkx编辑 ,原因:
2021-4-16 12:01
0
雪    币: 1657
活跃值: (6833)
能力值: ( LV12,RANK:215 )
在线值:
发帖
回帖
粉丝
5
wumnkx 天象独行 谢谢指点,这里是我描述有问题,我是根据指令“sub esp,0xcc” 说明它的缓冲区大小为CC。 上面我说错了,  ...
好的,谢谢指教
2021-4-16 13:29
0
雪    币: 922
活跃值: (1803)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
谢谢
2023-1-25 19:43
0
游客
登录 | 注册 方可回帖
返回
//