自学内容网 自学内容网

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

一、什么是函数栈帧

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

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

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

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

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

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

二、常见的寄存器

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 函数栈帧的销毁

在这里插入图片描述

四、函数栈帧创建图

在这里插入图片描述

结束语

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


原文地址:https://blog.csdn.net/2301_81454749/article/details/142314123

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!