标签:
栈被定义为一个特殊的容器,用户可以将数据压入栈中,也可以将栈中的数据弹出,而且要遵循先进后出(FILO)的原则。在计算机系统中,栈是具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。
在经典的操作系统里,栈从高地址向低地址增长,在i386下,栈顶由esp寄存器进行定位。压栈使栈顶地址减小,弹出使栈顶地址增大。
栈在程序运行过程中具有举足轻重的地位。栈保存了一个函数调用所需要维护的信息,这常常被称为堆栈帧或活动记录。一般包括以下几个方面:
一个常见的活动记录如下图所示:
一个函数的活动记录由ebp和esp两个寄存器划定范围。esp寄存器始终指向栈的顶部,同时也就指向了当前函数的活动记录的顶部。ebp寄存器指向了函数活动记录的一个固定位置,被称为帧指针。固定不变的ebp可以用来定位函数活动记录中的各个数据。例如函数返回地址的地址为ebp+4,再往前是压入栈中的参数,地址分别是ebp+8,ebp+12等,视参数数量和大小而定。ebp所直接指向的值是调用该函数前ebp的值,这样在函数返回的时候,ebp可以通过读取这个值恢复到调用前的值。
在i386下函数调用的过程:
标签:
原文地址:http://www.cnblogs.com/hust-ghtao/p/4380306.html