【浅谈】函数栈帧
C语言中,每个栈帧对应着一个未运行完的函数。栈帧也被叫做活动记录,它记录着函数的实现过程和函数调用。栈帧中保存了该函数的返回地址和局部变量。
内存空间如图:
在栈空间中发生的调用过程:
函数调用发生的时候,先把函数参数(从右往左顺序压)压入stack,再压入函数调用的下条指令的address. 接着进入调用函数体中先执行"pushl %ebp"和"movl %esp, %ebp"(一般已经由编译器加入到函数头中了),接着就是把函数体中的局部变量压入栈中。再遇到函数的调用的嵌套则依此类推。
栈的空间标记一个是ebp,一个是esp,这两个是系统给的寄存器,寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地),栈空间是操作系统给函数运行时分配的空间。
ps:栈指针和帧指针一次只能存储一个地址,所以,任何时候,这一对指针指向的是同一个函数的栈帧结构。并且ebp一般由系统改变它的值,而esp会随着数据的入栈和出栈而移动,也就是说esp始终指向栈顶。
当程序运行时,栈指针可以移动(大多数的信息的访问都是通过帧指针的,换句话说,就是如果该栈存在,%ebp帧指针是不移动的,访问栈里面的元素可以用-4(%ebp)或者8(%ebp)访问%ebp指针下面或者上面的元素)。
回收栈空间:
将esp退到ebp的位置,弹出ebp。