[C][栈帧]详细讲解

目录

  • 1.栈帧
    • 1.进程地址空间
    • 2.栈帧说明
  • 2.认识相关寄存器
  • 3.认识相关汇编命令
  • 4.过程理解
  • 5.栈帧总结
  • 6.补充


1.栈帧

1.进程地址空间

请添加图片描述
.进程地址空间

2.栈帧说明

  • 调用函数,形成栈帧
  • 函数返回,释放栈帧
  • 局部变量是存放在栈区上的
  • 栈区内存的使用习惯是
    • 先使用高地址空间,再使用低地址空间
    • 如:数组随着下标的增长,地址是由低到高变化的

2.认识相关寄存器

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

3.认识相关汇编命令

  • mov:数据转移指令
  • push:数据入栈,同时esp栈顶寄存器也要发生改变
  • pop:数据弹出至指定位置,同时esp栈顶寄存器也要发生改变
  • sub:减法命令
  • add:加法命令
  • call:函数调用,1. 压入返回地址 2. 转入目标函数
    • 将当前指令的下一条指令入栈(push到栈中,影响ESP)
    • 跳转到目标函数起始地址处运行(修改EIP,到达目标函数)
  • jump:通过修改eip,转入目标函数,进行调用
  • ret:恢复返回地址,压入eip,类似pop eip命令

4.过程理解

  • 起步,main()也是要被调用的
    请添加图片描述

  • main()也要形成栈帧结构
    请添加图片描述

  • 起步
    请添加图片描述

  • 开始调用

    • 调用call
      请添加图片描述

    • 调用call
      请添加图片描述

    • 整体图解
      请添加图片描述

  • 形成栈帧
    请添加图片描述

  • 释放栈帧
    请添加图片描述

  • 释放临时拷贝,彻底释放空间
    请添加图片描述


5.栈帧总结

  • 调用函数,需要先形成临时拷贝,形成过程是从右向左
  • 临时空间的开辟,是在对应函数栈帧内部开辟的
  • 函数调用完毕,栈帧结构被释放掉
  • 临时变量具有临时性的本质:栈帧具有临时性
  • 调用函数是有成本的,成本体现在时间和空间上,本质是形成和释放栈帧有成本
  • 函数调用,因拷贝所形成的临时变量,变量和变量之间的位置关系是有规律的(地址连续)

6.补充

  • 堆上都是动态分配,做不到静态分配
  • 栈既可以静态分配,也可以动态分配
    • 静态分配 – 在函数体中创建了一个变量
    • 动态分配
      • 头文件<malloc.h>下,有一个void* __cdecl alloca(size_t)
      • 作用与malloc等类似,但是它申请的是“栈(stack)”空间的内存
      • 用完会在退出栈时自动释放,无需手动释放

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

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

相关文章

BPTT算法详解:深入探究循环神经网络(RNN)中的梯度计算【原理理解】

引言 在深度学习领域中&#xff0c;我们经常处理的是独立同分布&#xff08;i.i.d&#xff09;的数据&#xff0c;比如图像分类、文本生成等任务&#xff0c;其中每个样本之间相互独立。然而&#xff0c;在现实生活中&#xff0c;许多数据具有时序结构&#xff0c;例如语言模型…

什么是PLAB?

接上文PLAB---》 可以看到和TLAB很像&#xff0c;PLAB即 Promotion Local Allocation Buffers。用在年轻代对象晋升到老年代时。 在多线程并行执行YGC时&#xff0c;可能有很多对象需要晋升到老年代&#xff0c;此时老年代的指针就"热"起来了&#xff0c;于是搞了个…

函数的创建和调用

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 提到函数&#xff0c;大家会想到数学函数吧&#xff0c;函数是数学最重要的一个模块&#xff0c;贯穿整个数学学习过程。在Python中&#xff0c;函数…

深入解析 YOLOv8 中的 `conv.py`(代码图文全解析-下)

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《yolov8》系列专栏&…

【linux软件基础知识】与调度相关的进程描述符

进程描述符 每个进程描述符都包括几个与调度相关的字段,如下代码所示: //include/asm-arm/thread_info.h /** low level task data that entry.S needs immediate access to.* __switch_to() assumes cpu_context follows immediately after cpu_domain.*/ struct thread_in…

6.1Java方法

1、方法定义&#xff1a; 方法是一种语法结构&#xff0c;它可以把一段代码封装成一个功能&#xff0c;以便重复调用 方法的完整格式&#xff1a; 修饰符 返回类型 方法名(形参列表){ 方法体代码(需要执行的功能代码) return 返回值; } package com.define;public class …

面向对象编程 (OOP):深入理解继承、多态和抽象

1. 简介 面向对象编程 (OOP) 是一种强大的编程范式&#xff0c;它通过将程序组织成对象的集合来简化软件设计和开发。与传统的程序设计方法相比&#xff0c;OOP 提供了一种更自然、更易于理解和维护的方式来构建复杂的软件系统。OOP 的核心概念包括&#xff1a;对象、类、继承、…

Java进阶学习笔记31——日期时间

Date&#xff1a; 代表的是日期和时间。 分配Date对象并初始化它以表示自标准基准时间&#xff08;称为纪元&#xff09;以来的指定毫秒数&#xff0c;即1970年1月1日00:00:00。 有参构造器。 package cn.ensource.d3_time;import java.util.Date;public class Test1Date {pu…

Java—异常处理

异常的结构图 异常知识点 异常分类&#xff1a; 按照在程序编译阶段是否被检查&#xff0c;异常分为编译时异常&#xff08;Checked Exception&#xff09;和运行时异常&#xff08;Unchecked Exception&#xff09;。编译时异常是指必须进行显式处理的异常&#xff0c;例如IOE…

【Linux】写一个日志类

文章目录 1. 源代码2. 函数功能概览3. 代码详细解释3.1 头文件和宏定义3.2 Log类定义3.3 打印日志的方法3.4 操作符重载和析构函数3.5 可变参数函数的原理 4. 测试用例 1. 源代码 下面代码定义了一个 Log 类&#xff0c;用于记录日志信息。这个类支持将日志信息输出到屏幕、单…

Java扩展机制:SPI与Spring.factories详解

一、SPI SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。 整体机制图如下: Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。 系统设计的各个抽象,往往有很多不…

戴尔科技:一盆冷水浇醒了AIPC

这年头&#xff0c;只要沾上英伟达的公司&#xff0c;不论美股还是大A,都跟着鸡犬升天几轮过&#xff0c;但昨晚英伟达蒸发1064亿美元&#xff0c; 跟着遭罪的也不少&#xff0c;有没有一夜惊魂梦醒的感觉&#xff1f; 今天我们来说说——戴尔科技。 昨晚戴尔科技大跌5.18%&a…

5G无线标准演进综述及新技术引入

摘 要 随着经济和社会的发展&#xff0c;5G业务越来越丰富多彩&#xff0c;1080P高清视频、裸眼3D、网联汽车、云手机等新业务、新终端对网络的要求也越来越高&#xff1b;另一方面&#xff0c;5G标准持续演进&#xff0c;在MIMO、载波聚合、移动性管理、uRLLC、切片、定位等方…

模仿库实现priority_queue

1 priority_queue 1.1 概念 优先级队列&#xff0c;一种大/小堆(默认为大堆) 1.2 大堆和小堆 一种完全二叉树&#xff0c;大堆根节点一定比子字节大 小堆根节点一定比子字节小 向下调整 从根节点开始比较与子节点的大小不断向下 向上调整 找到最后一个非叶子节点&#xf…

mac多媒体影音库:Emby for Mac 中文版

Emby软件是一款功能强大的媒体服务器软件&#xff0c;旨在为用户提供丰富的多媒体体验。以下是关于Emby软件的详细介绍&#xff1a; 下载地址&#xff1a;https://www.macz.com/mac/7964.html?idOTI2NjQ5Jl8mMjcuMTg2LjE1LjE4Mg%3D%3D 主要功能 媒体管理&#xff1a;Emby允许用…

代码随想录-Day25

216.组合总和III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输…

Python OCR 图片转文字进阶:读光OCR之行检测模型+行识别模型

Python OCR 图片转文字进阶&#xff1a;读光OCR之行检测模型行识别模型 介绍阿里云文字识别OCR&#xff08;读光OCR&#xff09;前置条件模型1&#xff1a;行检测模型模型1&#xff1a;行识别模型 代码&#xff1a;main.py 介绍 什么是OCR&#xff1f; OCR是“Optical Charac…

德人合科技——@天锐绿盾 | -文档透明加密系统

天锐绿盾文档透明加密系统是一种先进的数据安全解决方案&#xff0c;旨在保护企业和组织的敏感信息&#xff0c;防止未经授权的访问和泄漏。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是该系统的一些关键特点和功…

[C++11/14新特性] tuple元组介绍

C11 标准新引入了一种类模板&#xff0c;命名为 tuple&#xff08;中文可直译为元组&#xff09;。tuple 最大的特点是&#xff1a;实例化的对象可以存储任意数量、任意类型的数据。tuple 的应用场景很广泛&#xff0c;例如当需要存储多个不同类型的元素时&#xff0c;可以使用…

3D目标检测入门:探索OpenPCDet框架

前言 在自动驾驶和机器人视觉这两个飞速发展的领域中&#xff0c;3D目标检测技术扮演着核心角色。随着深度学习技术的突破性进展&#xff0c;3D目标检测算法的研究和应用正日益深入。OpenPCDet&#xff0c;这个由香港中文大学OpenMMLab实验室精心打造的开源工具箱&#xff0c;…