函数栈帧的创建和销毁
文章目录
- main函数栈帧的创建
- 为什么局部变量的值是随机值
- 函数是怎么传参的?传参的顺序是什么?
- 函数调用结束是怎么返回的
main函数栈帧的创建
先在栈帧里面为main函数开辟出一块空间,且这块空间由两个寄存器esp和ebp来进行维护,当在调用另一个函数时这两个寄存器就去维护为这个函数栈帧,也就是当调用哪个函数时这两个寄存器就去维护哪个函数的栈帧。每个函数在调用时都会在栈区创建一个空间。我们成ebp为栈底指针,esp为栈顶指针。

压栈的时候是从栈顶压入数据的。
存到的地方是低地址
我们以一个程序来进行详细说明
#include <stdio.h>int Add(int x, int y)
{int z = 0;z = x + y;return z;
}int main()
{int a = 10;int b = 20;int c = 0;c = Add(a, b);printf("%d\n", c);return 0;
}
实际上main函数也是被别人调用的。那么main函数是怎么进行栈帧的创建的呢?

这就是main函数栈帧的创建,创建结果为

这是在调用主函数时空间开辟后进行的准备工作,其它普通函数也是这样。
esp会自动调整始终指向栈顶
接下来我们再对内部的变量以及内部加粗样式调用函数的创建和销毁进一步说明。
为什么局部变量的值是随机值
当你不对变量初始化赋值时,默认就是CCCCCCCC因为在你为函数开辟战真的时候就已经默认为这个值了,这也就是为什么会出现烫烫烫烫的原因
当你初始化时



此时将a赋值为10
函数是怎么传参的?传参的顺序是什么?

在call指令调用调用函数之前,先把参数分别赋给了eax和ecx并压入了栈中。
当执行call指令时调用函数的同时还进行了另一部操作:

这一步操作是把call指令的下一条指令的地址压入了栈中,因为当调用函数结束之后还是要返回执行下一条指令的,这里就是为了找到call指令的下一条指令,因此提前保存起来了
当进入被调函数之后,对参数进行操作时就是对我们在执行call指令值前压入的两个值进行操作,这两个值是参数的拷贝,所以他们的改变并不会影响实参。由上面我们也可以看出形参压栈的顺序是从右向左入栈。
函数调用结束是怎么返回的
因为在函数调用结束时,被调函数中的局部变量就会被销毁,所以编译器会先把返回值放到寄存器当中,然后返回到刚刚保存的下一条指令那里,然后再将形参进行销毁,最后回到刚才调用函数的地方。
这里对形参进行销毁的指令是

就是让栈顶指针向高地址移动8,即esp+8
相关文章:
函数栈帧的创建和销毁
文章目录 main函数栈帧的创建为什么局部变量的值是随机值函数是怎么传参的?传参的顺序是什么?函数调用结束是怎么返回的 main函数栈帧的创建 先在栈帧里面为main函数开辟出一块空间,且这块空间由两个寄存器esp和ebp来进行维护,当在调用另一个函数时这两个寄存器就去维护为这…...
测试Ocr工具IronOCR(续:编写图片圈选程序)
上一篇文章学习了IronOCR的基本用法之后,计划做一个加载本地图片后,从图片中圈选某一位置的文字,然后调用IronOCR识别圈选区域文本的程序。本文实现从本地加载图片并完成圈选的功能。 主要的功能包括以下几点: 1ÿ…...
React之Redux的使用
文章目录 Redux 介绍概述Redux 是什么?为什么要使用 Redux?我什么时候应该使用 Redux?Redux 库和工具React-ReduxRedux ToolkitRedux DevTools 扩展 Redux 术语和概念State 管理不可变性 Immutability术语ActionAction CreatorReducerReducer…...
数据库系统概论--第五章课后习题
1.什么是数据库的完整性? 答:数据库的完整性是指数据的正确性和相容性。 2. 数据库的完整性概念与数据库的安全性概念有什么区别和联系? 答: 数据的完整性和安全性是两个不同的概念,但是有一定的联系。前者是为了防止数据库中存…...
小程序开发费用估算:如何控制项目成本?
在当今数字化的时代,小程序已经成为了很多企业和个人开展业务的重要手段。小程序的开发需要耗费时间和资源,因此在项目初期,了解预计的开发费用是非常重要的。本文将详细介绍如何估算小程序开发费用以及如何控制项目成本。 小程序开发费用 …...
【22】linux进阶——文本处理工具:cut、awk、sed
大家好,这里是天亮之前ict,本人网络工程大三在读小学生,拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识,希望能提高自己的技术的同时,也可以帮助到大家 另外其它专栏请关注: 锐捷数通实验&…...
Web3D包装生产线 HTML5+Threejs(webgl)开发
生产线三维可视化解决方案就是通过物联网、虚实联动和三维建模等先进技术,以一个3D立体模型展现出来,可以让我们很直观的看到生产线的运作以及对数据的监控。3D运用数据孪生技术可以让工业3D物联网管理系统的界面变得非常的简单易看,并且能够…...
Docker数据管理
目录 一、数据管理方式 1、数据卷 在宿主机上写入数据,传到容器 2、数据卷容器 二、容器互联 一、数据管理方式 用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多…...
在PowerBuilder中更改窗口继承
在PowerBuilder中更改窗口继承 PowerBuilder是Sybase公司的独资子公司PowerSoft推出的应用于客户机/服务器体系结构下的应用程序开发工具,也是一种面向对象的图形化交互式开发工具。PowerBuilder 以其简洁高效的集成开发环境、 强大的数据窗口技术、几乎无所不能的数据库访问…...
CS:APP 第7章链接分步编译(cpp/cc1/as/ld)遇到的问题
环境 WSL Ubuntu 22.04.2 LTS gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 问题 问题一 cc1 命令找不到 cc1 命令在 /usr/lib/gcc/x86_64-linux-gnu/11/cc1 里,注意不同操作系统等可能 cc1 的位置不一样,可以使用 find 或者 locate 命令搜索。 通过下…...
Jsp+sql智能道路交通信息管理系统的设计与实现(论文+系统+开题报告+答辩PPT+外文翻译)
伴随着社会经济的发展,交通在人们经济和社会活动中扮演着越来越重要的角色。因而,交通管理的水平和质量就和我们的日产生活紧密相连,并且直接影响着投资的环境和城市的面貌。因此,每个城市都做了很多关于改善交通和发展智能交通系…...
自动化工具 WEB 自动化工具
背景 使用自动化测试框架编写用例的时候,维护元素信息以及脚本较为麻烦。对应新手来说,编写脚本的能力有限,使用工具会更容易入手。最重要的是可视化操作让我觉得体验舒服。 演示地址 地址:hippo 账号:test 密码&am…...
AutoGPT 安装指南,使用避坑要点
最近, AIGC 中最火的可能就当属于 AutoGPT 了吧,首先简单介绍一下AutoGPT 背景 AutoGPT 是基于 ChatGPT API 接口开发,项目首推 GPT-4 模型,但 OpenAI 账号 API 只有 gpt-3.5-turo 权限同样也可以使用。 项目在 github 上获取的…...
低调且强大——JNPF低代码平台
前言 先说说很多人为什么要用低代码平台。大部分的反馈是“懒”,其次就是后台管理这东西吧,来来回回就那些东西,查询/表单/表格/弹窗之类的,加上一些增删改查的逻辑。很多人表示,呆过的公司好几家了,后管的…...
《商用密码应用与安全性评估》第二章政策法规2.4商用密码应用安全性评估工作
商用密码应用安全性评估体系发展历程 第一阶段:制度奠基期(2007年11月至2016年8月) 第二阶段:再次集结期(2016年9月至2017年4月) 第三阶段:体系建设期(2017年5月至2017年9月&…...
MySQL 字段为 NULL 的5大坑,99%人踩过
数据库字段允许空值(null)的问题,你遇到过吗? 在验证问题之前,我们先建一张测试表及测试数据。 数据库字段允许空值(null)的问题,你遇到过吗? 在验证问题之前,我们先建一张测试表及测试数据。 构建的测试…...
深入理解计算机系统--理解编译器编译的过程
前言 大家在学习C语言的时候,相信对编译器这个词并不会感到陌生。我们也会知道编译器编译的过程是:预处理-》编译-》汇编-》链接。这篇文章主要介绍这四个过程中,编译器究竟做了那些工作,它是如何让一份高级程序转换成机器语言的…...
实现PXE批量网络装机及kickstrat无人值守安装(富士山终究留不住欲落的樱花)
一、PXE概述和部署PXE批量装机 1.PXE简介 PXE(预启动执行环境,在操作系统之前运行)是由Intel公司开发的网络引导技术,c/s架构,允许客户机通过网络从远程服务器下载引导镜像,并加载安装文件或者整个操作系统…...
4.23日报
MySQL 索引是怎么实现的? 索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。 具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都…...
【数据治理】数据治理方面的证书有哪些?
目前数据治理领域最专业的职业认证有: 中文版: ①DAMA国际CDGA数据治理工程师、DAMA国际CDGP数据治理专家 (先获得CDGA认证才能申请CDGP认证考试) ②DGSP数据治理与管理认证 英文版: ③CDMP数据管理专业人士 一、…...
用MATLAB和Python搞定二维热传导仿真:从ADI算法到FFT快速求解器的保姆级对比
MATLAB与Python热传导仿真实战:从算法选择到性能调优 在工程仿真领域,热传导问题一直是个经典课题。无论是电子设备散热分析、建筑热工设计还是材料加工模拟,二维热传导方程的求解都是基础中的基础。对于需要在不同编程环境中实现这类仿真的工…...
抖音批量下载终极指南:免费高效获取视频、图集、合集和音乐
抖音批量下载终极指南:免费高效获取视频、图集、合集和音乐 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...
北邮数电实验:用Verilog在FPGA上实现4位加法器,从全加器到数码管显示(附完整代码与管脚绑定)
北邮数电实验:从全加器到4位加法器的FPGA实现全流程解析 第一次接触FPGA上的数字电路实验时,看着开发板上密密麻麻的管脚和闪烁的LED,我完全不知道从何入手。直到亲手实现了一个4位加法器,才真正理解了数字系统设计的精髓——用硬…...
别急着升级Android Studio!手把手教你降级AGP 8.3.0-alpha01到8.1.3,解决版本不兼容报错
别急着升级Android Studio!手把手教你降级AGP 8.3.0-alpha01到8.1.3,解决版本不兼容报错 接手一个Kotlin项目时,最令人头疼的莫过于刚打开就遭遇版本不兼容的红色报错。尤其当错误提示显示"项目使用了不兼容的Android Gradle插件版本(A…...
【实测可用 v 2.7.5】Open Claw 本地环境快速部署搭建攻略
✨ 核心亮点 零代码门槛|全程可视化|无需手动配环境|内置所有依赖 🔗 下载地址 https://xiake.yun/api/download/package/16?promoCodeIV8E496E2F7A 📝 前言 2026 年开源圈热门的「数字员工」OpenClaw(…...
Anthropic《创始人手册:打造AI原生创业公司》Claude(中文精读版)完整38页pdf
Anthropic 在2026年5月发布的官方手册,聚焦 AI 原生创业的全生命周期,拆解从创意、MVP、上线到扩张的四大核心阶段,重构 AI 时代的创业逻辑。 手册核心围绕 “AI 重塑创业模式” 展开,指出 2026 年 AI 已打破技术门槛,…...
告别‘偏科’模型:用CAST双流架构搞定视频动作识别,兼顾时空理解
时空双流协同:CAST架构如何重塑视频动作识别的平衡之道 视频动作识别正面临一个关键瓶颈——现有模型往往在时空理解上"偏科"。就像人类大脑需要左右半球协同工作才能完整理解世界一样,理想的视频理解模型也需要同时具备敏锐的空间感知和精准的…...
别再自己造轮子了!手把手教你用LwRB环形缓冲区搞定嵌入式数据流(附DMA零拷贝实战)
嵌入式数据流处理的终极方案:LwRB环形缓冲区深度解析与DMA实战 在嵌入式开发中,数据流处理如同空气般无处不在却又容易被忽视。从UART接收到的传感器数据,到SPI传输的图像信息,再到I2C收集的设备状态,这些数据流的处理…...
保姆级教程:在Windows上用Python连接CoppeliaSim远程API(附避坑指南)
从零开始掌握CoppeliaSim与Python的远程控制:Windows环境实战指南 在机器人仿真领域,CoppeliaSim(原V-REP)因其强大的功能和友好的用户界面而广受欢迎。对于希望将Python的灵活性与CoppeliaSim的仿真能力结合的研究者和工程师来说…...
CANN Triton排序选择算子优化
Sort/Select 算子优化 【免费下载链接】cannbot-skills CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。 项目地址: https://gitcode.com/cann/cannbot-skills 适用于需要迭代选择元素的算子:NMS、…...
