函数栈帧的创建和销毁

举报
lovevivi 发表于 2022/08/16 13:41:24 2022/08/16
【摘要】 👩‍💻博客主页:风起 风落的博客主页✨欢迎关注🖱点赞🎀收藏⭐留言✒👕参考网站:牛客网🎨你的收入跟你的不可替代成正比🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦💬给大家介绍一个求职刷题收割offer的地方👉点击进入网站@TOC 一、对于esp与ebp寄存器的说明ebp esp两个寄存器 存放的是地址使用地址维护函数栈帧 二、对于创建和销毁的全过程 1.对于_mainC...

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

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

👕参考网站:牛客网

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

🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦
💬给大家介绍一个求职刷题收割offer的地方👉点击进入网站

@TOC


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

ebp esp两个寄存器 存放的是地址
使用地址维护函数栈帧
在这里插入图片描述

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

1.对于_mainCRTstarup的函数的创建

在这里插入图片描述

注意事项:
压栈 (push):给栈顶放一个元素
出栈(pop):在栈顶删除一个元素
栈空间的地址使用为先使用高地址,在使用低地址

  1. push 压栈操作 将ebp压入栈中
    同时 esp指向, ebp往上地址变小, 所以 esp的地址变小了

在这里插入图片描述

  1. mov: 将esp的值给ebp
    两者指向同一个位置
    在这里插入图片描述
  1. sub (减 )
    将esp减去0E4h(八进制)
    (1)
    在这里插入图片描述
    (2)esp由于地址变小 向上去 而esp 与ebp两者围成的空间正好是main函数的栈帧
    在这里插入图片描述
  1. 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
在这里插入图片描述

在这里插入图片描述

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

3.对于Add的函数的创建

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

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

  >

在这里插入图片描述

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

在这里插入图片描述
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.整体过程图解

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。