函数栈帧的创建和销毁

简介: 👩‍💻博客主页:[风起 风落](https://blog.csdn.net/qq_62939852?spm=1001.2101.3001.5343)的博客主页✨欢迎关注🖱点赞🎀收藏⭐留言✒👕参考网站:牛客网🎨你的收入跟你的不可替代成正比🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦💬给大家介绍一个求职刷题收割offer的地方👉[点击进入网站](https://www.nowcoder.com/link/pc_csdncpt_fqfl_c)

👩‍💻博客主页:风起 风落的博客主页

✨欢迎关注🖱点赞🎀收藏⭐留言✒

👕参考网站:牛客网

🎨你的收入跟你的不可替代成正比

🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦

💬给大家介绍一个求职刷题收割offer的地方👉点击进入网站

@TOC


一、对于esp与ebp寄存器的说明

ebp esp两个寄存器 存放的是地址

使用地址维护函数栈帧

在这里插入图片描述

二、对于创建和销毁的全过程

1.对于_mainCRTstarup的函数的创建

在这里插入图片描述

注意事项:

压栈 (push):给栈顶放一个元素

出栈(pop):在栈顶删除一个元素

栈空间的地址使用为先使用高地址,在使用低地址

  1. push 压栈操作 将ebp压入栈中  
    同时 esp指向, ebp往上地址变小,  所以 esp的地址变小了
  在这里插入图片描述  
  1. mov:  将esp的值给ebp
    两者指向同一个位置
    在这里插入图片描述
  2. sub (减 )
    将esp减去0E4h(八进制)
    (1)
    在这里插入图片描述
    (2)esp由于地址变小 向上去   而esp 与ebp两者围成的空间正好是main函数的栈帧
    在这里插入图片描述
  3. push 在main函数栈顶压入 ebx esi edi
    随着压入数据 esp也随之指向数据  即esp向上移
    在这里插入图片描述

2.对于main函数的创建

在这里插入图片描述lea 代表load effective address 加载有效地址 将ebp-0E4h放在 edi中dowrd充当4个字节 从edi位置开始的 ecx(存放39h次) 的dword数据全部改成0xCCCCCCCCh一直到ebp结束 在这里插入图片描述

(1).为什么有时候会打印出烫烫烫

在这里插入图片描述  

0Ah代表10

把0Ah放到ebp-8的数据中

因为都是地址 所以ebp-8为在ebp地址减去8个字节

如果a中没有被赋值 则放入为0xCCCCCCCCh

所以有时候打印结果为烫烫烫烫烫烫

14h以十六进制打印 代表20 即ebp-20

ebp-20h代表ebp-32

在这里插入图片描述   在这里插入图片描述  

1.

在这里插入图片描述ebp-20 为b的值 即20把ebp-14h(ebp-20)传入eax中push  eax  将eax压栈同时esp指向eax2. 在这里插入图片描述将ebp-8传入ecx中同时将ecx 压栈此时ebp-8存放的是a 值为10esp指向ecx3. 在这里插入图片描述调用一个函数将下一条指令的地址压栈同时esp指向call下一条指令的地址 在这里插入图片描述

3.对于Add的函数的创建

在这里插入图片描述

1.

在这里插入图片描述将ebp压栈  esp指向ebp   这里是主函数里的ebp.将esp赋值给ebp,ebp与esp都指向ebp 在这里插入图片描述2. 在这里插入图片描述sub:    将esp减去0CCh  因为地址小的在上 push   压栈 ebx  esi edi3. 在这里插入图片描述从edi位置开始  进行ecx(33h十六进制)次dword数据 全部转化成0CCCCCCCCh 在这里插入图片描述4. 在这里插入图片描述把0放在ebp-8的位置上 在这里插入图片描述  

(2).为什么说形参不在函数中

  在这里插入图片描述   在这里插入图片描述  

(3).函数中return值如何放回的

  在这里插入图片描述   在这里插入图片描述1. 在这里插入图片描述出栈 此时esp地址变大 向下移 在这里插入图片描述  

2.

在这里插入图片描述mov 把ebp赋值给esp 在这里插入图片描述  

(4).ebp-main出栈后ebp寄存器的指向情况

  在这里插入图片描述 在这里插入图片描述  

(5).形参a,b如何返回操作系统

  在这里插入图片描述返回ret是返回到 call下一条指令的地址 在这里插入图片描述这里随着add函数的销毁 esp也从下一条指令的地址位置弹出到下一个位置将原来esp所指的地址加8 即现在的位置就会 将形参 a b 还给操作系统

在这里插入图片描述

在这里插入图片描述把eax移动到 ebp-32(20h为16进制)中即将 函数z的值 传递到主函数的c中 在这里插入图片描述  

4.整体过程图解

  在这里插入图片描述
目录
相关文章
|
供应链 监控 搜索推荐
物联网技术在物流领域的应用会带来哪些影响?
物联网技术在物流领域的应用会带来哪些影响?
1517 58
|
机器学习/深度学习 算法 计算机视觉
基于多注意力融合的抗遮挡目标跟踪算法综述
基于多注意力融合的抗遮挡目标跟踪算法综述
951 0
基于多注意力融合的抗遮挡目标跟踪算法综述
|
存储 搜索推荐 算法
大数据的下一站是什么?服务/分析一体化(HSAP)
大数据的下一站是什么?服务/分析一体化(HSAP)
12922 0
|
程序员
程序员的数学【概率论】(二)
本文其实值属于:程序员的数学【AIoT阶段二】 的一部分内容,本篇把这部分内容单独截取出来,方便大家的观看,本文介绍 概率论
370 0
程序员的数学【概率论】(二)
|
芯片
触发器基础知识(下)
D触发器只有一个输入端,消除了输出的不定状态。D触发器具有置0、置1的逻辑功能,如图所示:
1001 0
触发器基础知识(下)
|
Linux
Linux:ls按照修改时间排序显示
Linux:ls按照修改时间排序显示
661 0
解决java.io.IOException: Failed on local exception: com.google.protobuf.InvalidProtocolBufferException
解决java.io.IOException: Failed on local exception: com.google.protobuf.InvalidProtocolBufferException
1277 0
|
Dart JavaScript 前端开发
|
域名解析 网络协议 安全
阿里云公共DNS全新升级啦,欢迎使用!
2020年7月20,阿里云公共DNS服务面向企业级用户正式升级!针对各种万物互联的终端,包括移动端、APP、IOT设备端,提供基于DOH(DNS over HTTPS)和DOT(DNS over TLS)的终端解析服务,帮助您解决各种终端访问慢、隐私外泄、域名劫持到问题。注:公测期间企业用户免费(9月30日之前),面向普通用户的基础解析功能永久免费。
阿里云公共DNS全新升级啦,欢迎使用!
|
存储 SQL 分布式计算
ClickHouse深度揭秘
ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域。目前国内社区火热,各个大厂纷纷跟进大规模使用
8659 1

热门文章

最新文章