修炼内功之函数栈帧的创建与销毁

修炼内功之函数栈帧的创建与销毁

  • 一 前置知识
    • (1)栈
    • (2)相关寄存器和汇编指令
  • 二 函数栈帧
  • 三 代码演示函数栈帧的创建
    • (1)代码演示
    • (2)函数栈帧逐帧分析
  • 四 对开篇问题的解答

  相信来CSDN的伙伴们,或多或少对编程都有一定的了解,那本菜鸟来考考你,关于编程的绝命六连问,看看你能答对几个?

1.局部变量是如何创建的?·
2.为什么局部变量不初始化内容是随机的?
3.有些时候屏幕上输出的"烫烫烫"是怎么来的?
4.函数调用时参数时如何传递的?传参的顺序是怎样的?。
5.函数的形参和实参分别是怎样实例化的?
6.函数的返回值是如何返回的?

  或许这些问题一出,有些小伙伴们可能就懵了,我们都知道函数,函数调用,我们也知道局部变量,形参,实参等等,这些我们每次写代码都在用的东西,看似简单,深入思考之后,发现别有洞天,这些告诉我们,学习编程,不可以浮于表面。
  要解决这些问题,我们就得深入理解函数栈帧的创建与销毁。

一 前置知识

(1)栈

  一般我们在学习 C/C ++语言的时候.我们会关注内存中的三个区域:栈区、堆区、静态区。

1.局部变量,函数参数是放在内存的栈区
2.全局变量,静态变量是放在内存的静态区
3.堆区是用来动态内存管理的

在这里插入图片描述

由此,我们知道函数是在栈中开辟空间的,那什么是栈呢?

  栈:在经典的计算机科学中,栈被定义为一种特殊的容器,用户可以将数据压入栈中(入栈, push) ,也可以将已经压入栈中的数据弹出(出栈, pop ),但是栈这个容器必须遵守一条规则:先入栈的数据后出栈 (First ln Last 0ut, FIFO) 。就像叠成一叠的书,先上去的书在最下面,因此要最后才能取出。
  在经典的操作系统中,栈总是向下增长(由高地址向低地址)的。栈顶由成为 esp 的寄存器进行定位的。

(2)相关寄存器和汇编指令

1.相关寄存器

eax :通用寄存器,保留临时数据,常用于返回值ebx :通用寄存器,保留临时数据
ebp :栈底寄存器
esp :栈顶寄存器
eip :指令寄存器,保存当前指令的下一条指令的地址

2.相关汇编指令

mov :数据转移指令
push :数据入栈,同时 esp 栈顶寄存器也要发生改变
pop :数据弹出至指定位置,同时 esp 栈顶寄存器也要发生改变
sub :减法命令
add :加法命令
cal l :函数调用, I. 压入返回地址 2.转入目标函数jump :通过修改 eip,转入目标函数,进行调用
ret :恢复返回地址,压入 eip ,类似 pop eip 命令

二 函数栈帧

  概念:每一次函数的调用,操作系统都会在内存的栈区上开辟一块空间,称为栈帧。函数调用建立栈帧,栈帧中存储局部变量,参数等。
  学习函数的栈帧,就必须要了解ebp,esp(ebp 存放的是栈底的地址,esp 存放的是栈顶的地址,),专门用于维护函数栈帧的。
在这里插入图片描述

三 代码演示函数栈帧的创建

(1)代码演示

#include <stdio.h>
int sum(int x, int y)
{int sum = 0;sum = A + B;return sum;
}
int main()
{int a = 3;int b = 5;int s = 0;s = Add(a, b);printf("%d\n", ret);return 0;
}

  首先,我先简单的声明一下,main函数也是被其他函数调用起来的,在vs2019中, main 函数调用之前,是由invoke-main 函数来调用 main 函数。在 invoke-main 函数之前的函数调用我们就暂时不考虑了。那我们可以确定, invoke-main 函数应该会有自已的栈帧, main 函数和 Add 函数也会维护自已的栈帧,每个函数栈帧都有自已的 ebp 和 esp 来维护栈帧空间。
  那接下来我们从 main 函数的栈帧创建开始讲解:

(2)函数栈帧逐帧分析

1.转到反汇编
在这里插入图片描述
2.逐帧分析如图
在这里插入图片描述

四 对开篇问题的解答

1.局部变量是如何创建的?
在这里插入图片描述
  局部变量的创建是在局部变量所在的函数的栈帧创建完成并初始化后,然后在该栈帧内为局部变量分配空间的。
2.为什么局部变量不初始化其内容是随机的?
  因为编译器在创建函数栈帧后会在栈帧空间里面放入一个值,而这个值是随机的。
3.有些时候屏幕上输出的"烫烫烫"是怎么来的?

#include<stdio.h>
int main()
{
char arr[20];
printf("%s\n",arr);
return 0;
}

  调试输出“烫烫烫……”的原因,是因为main函数调用时,在栈区开辟的空间的其中每一个字节都被初始化为0xCC,而arr数组是一个未初始化的数组,恰好在这块空间上创建的,0xCCCC(两个连续排列的0xCC)的汉字编码就是“烫”,所以0xCCCC被当作文本就是“烫”。
4 ,函数调用时参数时如何传递的?传参的顺序是怎样的?
在这里插入图片描述

  我们在调用函数之前,就会在栈顶上从右向左依次压入需要传递的参数,在创建好被调函数的函数栈帧后通过指针的偏移量来使用传递过去的参数,而不是在被调函数的函数栈帧内创建形参。
5 .函数的形参和实参的关系是什么?
  形参是实参的一份临时拷贝,二者的存储亻立置不同,形参的改变不会影响实参。
6 .函数的返回值是如何带回的?
在这里插入图片描述

  函数的返回值通过 eax寄存器带回。
(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/495027.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习threejs,THREE.PlaneGeometry 二维平面几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️HREE.PlaneGeometry 二维平…

SpringCloud 入门(4)—— 网关

上一篇&#xff1a;SpringCloud 入门&#xff08;3&#xff09;—— Nacos配置中心-CSDN博客 Spring Cloud Gateway 作为 Spring Cloud 生态系统的一部分&#xff0c;主要在微服务架构中充当 API 网关的角色。它提供了统一的入口点来处理所有的 HTTP 请求&#xff0c;并将这些请…

石岩基督教福音堂

周末娃&#xff0c;娃的阿婆和我一起去石岩基督教福音堂做礼拜。 这是我第一次进入石岩的教堂。教堂很高。应该有3,4层楼高。 这周末做礼拜的人很多一楼人满了&#xff0c;阿婆去二楼做礼拜&#xff0c;娃和我去三楼的儿童室。很多家长楼下做礼拜&#xff0c;小朋友被安排三楼…

论文《Vertical Federated Learning: Concepts, Advances, and Challenges》阅读

论文《Vertical Federated Learning: Concepts, Advances, and Challenges》阅读 论文概况纵向联邦VFL框架介绍问题定义VFL 训练协议 对通信效率的优化对性能的优化自监督方案&#xff08;Self-Supervised Approaches&#xff09;半监督方案&#xff08;Semi-Supervised Approa…

如何用gpt来分析链接里面的内容(比如分析论文链接)和分析包含多个文件中的一块代码

如何用gpt来分析链接里面的内容&#xff0c;方法如下 这里使用gpt4里面有一个网路的功能 点击搜索框下面这个地球的形状即可启动搜索网页模式 然后即可提出问题在搜索框里&#xff1a;发现正确识别和分析了链接里面的内容 链接如下&#xff1a;https://arxiv.org/pdf/2009.1…

本地部署webrtc应用怎么把http协议改成https协议?

环境&#xff1a; WSL2 Ubuntu22.04 webrtc视频聊天应用 问题描述&#xff1a; 本地部署webrtc应用怎么把http协议改成https协议&#xff1f; http协议在安卓手机浏览器上用不了麦克风本&#xff0c;来地应用webrtc 本来是http协议&#xff0c;在安卓手机上浏览器不支持使…

面向未来的教育技术:智能成绩管理系统的开发

3.1 可行性研究 成绩管理系统开发实现分析需要从不同的角度来进行分析可行性&#xff0c;比如从时间角度&#xff0c;经济角度&#xff0c;甚至操作角度。从不同的角度分析可行性会让成绩管理系统开发具体化&#xff0c;进而达到辩证开发的正确性。 3.1.1 经济可行性 从经济方面…

zabbix监控山石系列Hillstone监控模版(适用于zabbix7及以上)

监控项&#xff1a; 触发器&#xff1a; 监控数据如下&#xff1a;

UE5 渲染管线 学习笔记

兰伯特 SSS为散射的意思 带Bias的可以根据距离自动切换mip的卷积值 而带Level的值mipmaps的定值 #define A8_SAMPLE_MASK .a 这样应该就很好理解了 这个只采样a通道 带Level的参考上面的 朝左上和右下进行模糊 带Bias参考上面 随机数 4D 3D 2D 1D

ArcGIS Pro 3.4新功能3:空间统计新特性,基于森林和增强分类与回归,过滤空间自相关

目录 应用 1&#xff1a;它是相关性还是托布勒第一定律&#xff1f; 应用 2&#xff1a;将空间带入非空间模型 结论 在 ArcGIS Pro 3.4 中&#xff0c;我们在新的空间组件实用程序&#xff08;Moran 特征向量&#xff09;工具集中发布了一个新工具 - 从字段过滤空间自相关。…

【微信小程序】2|轮播图 | 我的咖啡店-综合实训

轮播图 引言 在微信小程序中&#xff0c;轮播图是一种常见的用户界面元素&#xff0c;用于展示广告、产品图片等。本文将通过“我的咖啡店”小程序的轮播图实现&#xff0c;详细介绍如何在微信小程序中创建和管理轮播图。 轮播图数据准备 首先&#xff0c;在home.js文件中&a…

vue3封装而成的APP ,在版本更新后,页面显示空白

一、问题展示 更新之后页面空白&#xff0c;打不开 &#xff0c;主要是由于缓存造成的 二、解决办法 1、随机数代码实现 使用随机数来动态的生成静态资源目录名可以避免浏览器缓存&#xff0c;但同时每次也会导致浏览器每次都下载最新的资源。如果静态资源过大&#xff0c;可…

JAVA HTTP压缩数据

/*** 压缩数据包** param code* param data* param resp* throws IOException*/protected void writeZipResult(int code, Object data, HttpServletResponse resp) throws IOException {resp.setHeader("Content-Encoding", "gzip");// write到客户端resp…

京东零售数据可视化平台产品实践与思考

导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分&#xff1a; 1. 平台产品能力介绍 2. 业务赋能案例分享 3. 平台建设挑战与展望 作者&#xff1a;梁臣 京东 数据产品架构师 01平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用…

springBoot Maven 剔除无用的jar引用

目录 Used undeclared dependencies found Unused declared dependencies found 当项目经过一段时间的开发和维护后&#xff0c;经常会遇到项目打包速度变慢的问题。这通常与项目中包含大量的jar依赖有关&#xff0c;这些依赖之间的关系错综复杂。这种情况在项目维护过程中是…

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使&#xff0c;可以说是一坨… 关键词&#xff1a;Apache RocketMQ 5.0 JDK 17 废话少说&#xff0c;开整。 1.版本 官网地址&#xff0c;版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…

uniapp Native.js原生arr插件服务发送广播到uniapp页面中

前言 最近搞了个设备&#xff0c;需求是读取m1卡&#xff0c;厂家给了个安卓原生demo&#xff0c;接入arr插件如下&#xff0c;接入后发现还是少了一部分代码&#xff0c;设备服务调起后触发刷卡无法发送到uniapp里。 中间是一些踩坑记录&#xff0c;最后面是解决办法&#xf…

实践KDTS-WEB从mysql迁移到kingbasev9

数据库国产化替代数据迁移是一个复杂且关键的过程。这涉及到将原有数据库中的数据准确、完整地迁移到新的国产数据库中&#xff0c;同时确保数据的完整性和一致性。人大金仓提供了强大的数据库迁移工具&#xff08;KDTS&#xff09;对同构、异构数据库数据迁移&#xff1b; 数…

nmap扫描优化

扫描优化用来提高扫描效率。当描一个大范围网络中的主机时&#xff0c;如果使用通用的方法可能需要很长的时间&#xff0c;此时可以使用一些特定选项进行扫描优化&#xff0c;以提高扫描效率。Nmap提供了几种优化方式&#xff0c;如分组扫描、设置发包方式和超时时间等。 分组…

mysql 查询优化之字段建立全文索引

最近在接手一些老项目时发现表设计存在问题导致查询较慢 例如一张旧表的设计&#xff1a; 模糊匹配某个关键字时,需要十几秒左右,而且表的数据量不多 都知道mysql8.0版本InnoDB引擎都支持全文索引了,因此可以在content建立全文索引&#xff0c;但全文索引对中文支持并不完善…