当前位置: 首页 > article >正文

编程基础:函数栈帧的创建和销毁

函数栈帧的创建和销毁

  • 一、什么是函数栈帧
  • 二、常见的寄存器
  • 三、函数指令
  • 三、函数栈帧的创建和销毁
    • (一)普通值传递
      • 1、开始执行函数
      • 2、main函数的函数栈帧的开辟
        • (1)main 栈帧空间的开辟和默认初始化
        • (2)main 局部变量的初始化
        • (3)函数传参和 swap 函数的调用
      • 3、swap 函数的函数栈帧的开辟
        • (1)swap 栈帧空间的开辟和默认初始化
        • (2)swap 局部变量的初始化
        • (3)swap 函数栈帧的销毁
      • 4、main 函数栈帧的销毁
  • 四、函数栈帧创建图
      • 结束语

一、什么是函数栈帧

函数栈帧是指在程序执行过程中,每个被调用的函数会在内存中分配一块特定的存储区域,用于存储函数的局部变量、函数参数、返回地址以及其他与函数执行相关的信息。函数栈帧的结构如下:

返回地址:函数执行完成后,程序需要返回到调用该函数的地方继续执行,返回地址就是用来记录函数返回的地方。

参数:函数的参数被传递给函数,并保存在栈帧中的特定位置,供函数使用。

局部变量:函数内部定义的变量被保存在栈帧中的特定位置,它们的作用域仅限于函数内部,每次函数调用都会为局部变量分配新的内存空间,函数的参数的传递是从右向左传递

上一个函数的栈帧指针:每个栈帧都有一个指向上一个函数栈帧的指针,通过该指针,可以访问上一个函数的局部变量和参数。

函数栈帧的创建和销毁是由编译器和操作系统负责管理的,一般情况下,函数调用时会在栈上分配一个新的栈帧,函数执行完毕后栈帧会被销毁。通过栈帧的创建和销毁,程序能够灵活地管理函数的调用和返回。

二、常见的寄存器

eax:通用寄存器,存储数据和地址。

ecx:通用寄存器,存储临时值。

edi:通用寄存器,存储目的操作数地址。

ebx:通用寄存器,存储通用数据。

esi:通用寄存器,存储源操作数地址。

三、函数指令

call:当执行call指令时,会将当前的指令指针保存到堆栈中,进入子程序

ret:当执行ret指令时,会从堆栈中取出之前保存的指令指针,用于从一个子程序中返回到调用的地方。

push:将数据压入栈中。push指令的作用是将指定的数据(可以是寄存器中的值或者内存中的数据)压入堆栈(栈)中。

mov:将数据从一个位置复制到另一个位置。

sub:减法操作。sub指令的作用是将指定的值从目标位置减去。

lea:加载有效地址。lea指令的作用是将内存地址加载到寄存器中

pop:将数据从栈中弹出。

rep stos:重复填充操作。rep stos指令的作用是将指定的字节或字复制到连续的内存位置

三、函数栈帧的创建和销毁

(一)普通值传递

1、开始执行函数

下面的过程都是基于汇编代码,可以发现main 函数也是由其他的函数进行调用的,这个函数就是__tmainCRTStartup.
在这里插入图片描述
在这里插入图片描述

2、main函数的函数栈帧的开辟

(1)main 栈帧空间的开辟和默认初始化

在这里插入图片描述

(2)main 局部变量的初始化

在这里插入图片描述

(3)函数传参和 swap 函数的调用

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

3、swap 函数的函数栈帧的开辟

(1)swap 栈帧空间的开辟和默认初始化

在这里插入图片描述

(2)swap 局部变量的初始化

在这里插入图片描述

(3)swap 函数栈帧的销毁

在这里插入图片描述

4、main 函数栈帧的销毁

在这里插入图片描述

四、函数栈帧创建图

在这里插入图片描述

结束语

这篇文章就到此结束了,文章完成比较困难,当作笔记发布了吧!


http://www.kler.cn/a/312300.html

相关文章:

  • 在.NET中正确捕获C++程序的cout输出
  • macOS开发环境配置与应用开发(详细讲解)
  • yelp数据集上识别潜在的热门商家
  • YOLOv7-0.1部分代码阅读笔记-activations.py
  • 软件测试(系统测试)的定位和专业:完善产品;专业;非助手;自动化
  • [C++] GDB的调试和自动化检测
  • (十六)Ubuntu 20.04 下搭建PX4+MATLAB 仿真环境(HITL)
  • 无人机之AI跟踪篇
  • Facebook直播限流是什么原因?是ip地址导致的吗
  • Java商城的技术优势有哪些
  • Spring 出现 No qualifying bean of type ‘com.xxx‘ available 解决方法
  • 35.贪心算法2
  • [ffmpeg] 视频格式转换
  • 开发板与ubuntu建立网络通信(NFS和TFTP协议搭建)
  • elasticsearch实战应用
  • NAT网络地址转换
  • 【spring】spring框架中使用的设计模式有哪些,经典的设计模式应用,spring框架中哪些地方使用了哪些优秀的设计模式
  • 制作炫酷个人网页:用 HTML 和 CSS3 展现你的风格
  • macos清理垃圾桶时提示 “操作无法完成,因为该项目正在使用中” 解决方法 , 强制清理mac废纸篓 方法
  • 外国药品位置检测系统源码分享
  • 好用的XML解析库——fast-xml-parser
  • 应用案例|开源 PolarDB-X 在互联网安全场景的应用实践
  • YOLOv9改进系列,YOLOv9主干网络替换为RepViT (CVPR 2024,清华提出,独家首发),助力涨点
  • 基于Springboot的无接触外卖配送系统
  • 电风扇制造5G智能工厂物联数字孪生平台,推进制造业数字化转型
  • 35. MyBatis中的缓存失效机制是如何工作的?