栈帧的三个基本职能
- 声明局部变量
- 传递函数参数
- 保存函数返回地址
利用ebp(栈帧指针)寄存器可实现: - 访问栈内局部变量
- 提取传递参数
- 访问函数返回地址
栈帧的生命周期
helloworld程序main()函数的汇编代码:
main函数栈帧生成:
push ebp;保存上层调用函数的栈帧指针
mov ebp, esp; main函数的栈帧指针赋值为esp的值
main函数栈帧清除:
leave;
leave指令等价于两条基本汇编指令:
mov esp,ebp; 清除main函数栈空间
pop ebp;还原上层函数栈帧指针
利用ebp访问ret地址、局部变量、函数参数
[ebp+4] ;ret地址
[ebp]; 保存的上层函数栈帧指针
[ebp+8]; 传递的第一个参数
[ebp+C];传递的第二个参数
…
[ebp-4];第一个局部变量
[ebp-8];第二个局部变量
…