函数栈帧的创建与销毁
为什么要了解函数的栈帧?我列举了以下问题,如果掌握了函数栈帧,就能明白这些问题的原因。
1、局部变量是怎么创建的?
2、为什么局部变量不初始化是随机值?
3、函数是怎么传参的?传参的顺序是怎样的?
4、形参和实参是什么关系?
5、函数调用是怎么做的?
6、函数调用是结束后怎么返回的?
首先了解一些寄存器:
eax:累加寄存器
ebx:存放地址
ecx: 计数
edx: 存放余数
…
接下来重点了解esp与ebp寄存器
esp:栈顶指针
ebp:栈底指针
esp与ebp指针是用来维护函数栈帧的
在每一次函数调用时,都会在栈区开辟相应的空间
在VS2019下,打开反汇编选项出现以上内容。
(在不同环境下,里面内容略有不同)
main函数也是被_tmainCRTS函数,mainCRTS函数调用
main函数创建的过程:
push:压栈
lea:加载有效地址
call:调用
sub:减去一个数
dword:word代表两个字节,d代表double合在一起表示四个字节大小
开辟完_taminCRTS与mainCRTS的函数栈帧后,创建了main函数的函数栈帧。此时esp栈顶指针与ebp栈底指针维护此空间。(栈底是高地址)]
之后在main函数中创建变量abc,此时调用Add函数。
Add函数创建
为add函数开辟完栈帧之后,创建变量并进行运算
传参是从右向左进行传参的。
Add函数执行完成便销毁
最后返回main函数的函数栈帧。