赞
踩
栈:用于维护函数调用的上下文,通常在用户空间的最高地址处分配,增长方向向低地址增长。在i386下,栈顶由esp寄存器进行定位,压栈的操作使栈顶的地址减小,即esp减小;弹出的操作使栈顶地址增大,即esp增大。
栈保存了函数调用所需要的维护信息,这被称为堆栈帧(Stack Frame)或活动记录(Active Record),其包括如下内容:
在i386中,一个函数的活动记录用ebp和esp两个寄存器划定范围。esp寄存器始终指向栈的顶部,即指向当前函数的活动记录的顶部;而ebp寄存器这指向函数活动记录的一个固定位置,ebp寄存器有称为栈指针。一个典型的活动记录如下图:
这里的ebp所直接指向的数据是调用该函数前ebp的值,这样在函数返回时,ebp可以通过读取这个值恢复到调用之前的值。
在i386下,一个函数总是这样调用的:
在函数返回时,所进行的操作如下:
接下来进行测试,测试平台win7+VS2015 Debug x86模式。测试代码如下:
int func(int x, int y) { int z; int sum = 0; sum = x + y; return sum; } int main() { char p[4]; int d[2]; int a = 4, b = 3, c = 0; c = func(a, b); printf("%d,%d,%d,%d", a++,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。