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

news/2024/7/2 23:31:35

上一篇博客我们讲到了函数栈帧的创建与销毁(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)自己操作一下

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

 

 

 

 


http://lihuaxi.xjx100.cn/news/1231658.html

相关文章

【华为OD统一考试B卷 | 100分】数据分类(C++ Java JavaScript Python)

题目描述 对一个数据a进行分类,分类方法为: 此数据a(四个字节大小)的四个字节相加对一个给定的值b[取模]如果得到的结果小于一个给定的值c,则数据a为有效类型,其类型为取模的值;如果得到的结果大于或者等于c,则数据a为无效类型。 比如一个数据a=0x01010101,b=3,按…

HTML 如何将一段文字放在另一段文字之后?要紧随不换行,并且两段文字样式是不一样的。

要在一段文字之后紧随而不换行地添加另一段文字&#xff0c;并且两段文字具有不同的样式&#xff0c;可以使用 <span> 元素和 CSS 来实现。以下是一种常见的方法&#xff1a; <style>.no-line-break {white-space: nowrap; /* 防止换行 */}.text-style1 {/* 样式1…

chatgpt赋能python:如何取出带有4的整数

如何取出带有4的整数 Python是一门功能强大的编程语言&#xff0c;可以轻松解决复杂的编程问题。在本文中&#xff0c;我们将介绍如何使用Python编程语言从一个整数列表中取出所有带有4的整数。我们将从介绍如何创建一个整数列表开始&#xff0c;然后编写Python代码以实现我们…

Springboot-aop(一)

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

2023夏PAT甲级题解

目录 总结&#xff1a; A-1 题意&#xff1a; 思路&#xff1a; AC代码&#xff1a; A-2 题意&#xff1a; AC代码&#xff1a; A-3 题意&#xff1a; 思路&#xff1a; A-4 Big Number 题意&#xff1a; 思路&#xff1a; AC代码 总结&#xff1a; 第一次打PAT…

AMC12和高考数学哪个更难?知识点有哪些不同?

AMC12和高考数学哪个更难&#xff1f;知识点有哪些不同&#xff1f;今天小编给大家来详细介绍一下&#xff01; 难度对比 从难度上看&#xff0c;高考数学的计算量更大&#xff0c;并且知识点比AMC10/12超前&#xff0c;需要用到极限和微积分的知识。 反观AMC10/12不需要用到…

【MySQL】数据库的查询语言DQL

目录 前言&#xff1a; 一.基本查询 1.1查询多个字段 1.2设置别名 1.3去除字段中重复的值 二.条件查询 2.1条件的种类 2.1.1比较运算符 2.1.2逻辑运算符 三.结尾 前言&#xff1a; 在前面讲完了如何增删改数据表中的记录后&#xff0c;那么如何使用这些数据就成了另一…

有可以在游泳戴的耳机吗?适合游泳佩戴的耳机推荐

1.南卡Runner Pro4S骨传导游泳耳机 作为国内骨传导天花板品牌的南卡其发布的新产品Runner Pro 4S与之前的Pro 3和Pro 4在佩感方面没有太大改变&#xff0c;依旧舒适牢固&#xff0c;不会发生掉落的情况&#xff0c;实测重量31.7g&#xff0c;几乎是无感佩戴&#xff0c;毫无负担…