C语言之函数栈帧的创建与销毁讲解(2)

上一篇博客我们讲到了函数栈帧的创建与销毁(1)今天我们来讲解Add函数的函数栈帧相关知识

在开始本章博客之前,大家可以把上一篇博客的主要内容仔细复习一下

看图 

第一个mov:把b的值放到eax里面去

第二个mov:把a的值放到ecx里面去

大家把上一篇博客和这一篇博客结合起来看

接下来有个指令call,这时我们不要按F10,我们按F11,我们来看细节

我们借用上一篇博客的图片,此时的低地址是call指令的下一条指令的地址

好的,这时候我们正式进入到了Add函数,这里的push是在栈上压了一个ebp(我们不需要关心edp是个什么东西),mov将esp赋值给ebp,sub是esp减去0CCh这个值,此时esp就跑到了低地址,,跟上一篇main函数的函数栈帧的知识和理解是异曲同工的,希望大家能够理解,在监视里面输入相关的值获得对应的值,上一篇博客已经给大家讲过了的

再看下面几个步骤,这里大家再最后几个步骤理解起来有点困难,我这里用通俗易懂的语句给大家解释一下,这里的eax存放的是0CCCCCCCCh这个值,从edi开始向下的ecx里面放的值全部放成CCCCCCCC这个值,这里再强调一遍word--2个字节,dword--4个字节,希望大家能够理解!!!

z=x+y的理解我已经给大家画出图片了,大家看,大家可以尝试着自己去画一下,写一下,这样才能消化变成自己的知识

我把图片放出来,大家可以自己画完过后做参考

注意,在00C21450上面有个高地址ebp(来自于main函数),我的失误没有画上去

讲完了函数栈帧的创建,最后一个部分就是函数栈帧的销毁

看下图

执行一次pop,esp就会往高地址处移动一次

此时我的Add函数内部的CCCCCCCC这一些随机值就没有用了

mov将ebp的值赋值给esp,esp就指向高地址处了,ebp前面的Add函数的函数栈帧就销毁了,希望大家能够理解

然后我们再pop(出栈)一下,ebp就走了,就回到了main函数的低地址,此时我们的esp就来代替edp的位置,希望大家能够理解

最后我们看ret,我们此时回到了低地址处00C21450,这里面的逻辑其实是非常严谨的,我既要走出去也要走回来,我们接着从call指令处开始执行

然后执行add+8就是往高地址处走两步,dword是8个字节,地址往后+2个,这样就把我们形参中a,b给销毁了,是不是很神奇???

最后一步mov,马上就要成功了,大家坚持住,eax的值(Add函数里面的值放到main函数的变量c里面)放到[ebp-20h]这个地址处,此时Add函数的函数栈帧就已经彻底的销毁了,接下来按照相同的步骤实现main函数的函数栈帧的销毁

下来大家可以尝试着去将main函数的函数栈帧实际操作一遍,结合博客(1)自己操作一下

全章终,我也是一个菜鸟,希望能把我所理解的讲给大家,希望大家能听懂一大部分,谢谢支持!!!

猜你喜欢

转载自blog.csdn.net/fjj2397194209/article/details/131146684
今日推荐