1、栈帧结构
函数执行是通过系统栈来实现的,系统栈分为若干个栈帧。
栈帧就是函数运行的环境,每个函数在被调用时都会在系统栈区形成一个叫栈帧的结构。一次函数调用相关的数据保存在栈帧中,比如函数参数、函数的局部变量、函数执行完后的返回地址等数据。栈帧里的数据是先进后出的。
栈帧由以下几部分组成:
(1)函数参数
(2)局部变量
(3)返回地址
(4)ebp: 栈基指针存储器、esp: 栈顶指针存储器
2、函数调用时的栈帧结构
假如函数的定义:
int func(int i, int j) {
int m;
m = i + j;
return m;
}
int main()
{
int ret;
ret = func(1, 2);
return 0;
}
在main()函数中调用func()函数时的栈帧结构如下:
每调用一个函数,就会往下添加新的栈帧,当函数调用结束时,把返回值保存到返回地址,同时弹出相应的栈帧。
具体调用过程可分成下面几步:
(1)在main函数中调用func函数,func函数进入栈帧。
(2)在func函数中,把i+j的值赋给变量m,然后把m值返回给main函数中的ret。
(3)把func函数的栈帧出栈