函数栈帧的创建和销毁
- 一、什么是函数栈帧
- 二、常见的寄存器
- 三、函数指令
- 三、函数栈帧的创建和销毁
- (一)普通值传递
- 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 函数栈帧的销毁
四、函数栈帧创建图
结束语
这篇文章就到此结束了,文章完成比较困难,当作笔记发布了吧!