深入理解栈
栈:保存了一个函数调用所需要维护的信息,常被称为堆栈帧或活动记录.
ebp:帧指针,固定不变,可以用来定位函数活动记录中的各个数据。ebp直接指向的是调用函数
前ebp(即下图的old ebp)的值;在函数返回时,ebp可以通过读取这个值恢复到调用前的值。
intel下函数调用:
- 参数压栈(从右向左)
- 当前指令的下一条指令地址压栈
- 跳转到函数体执行
其中第2,3步由指令call一起执行,编译器可能要求某些寄存器在调用前后保持不变,或者生成
的临时变量都需要压栈。
多级调用栈布局
PS:Debug模式下未初始化的局部变量出现"烫"或者"屯"原因->栈空间给变量分配空间的每个字节被初始化为0xCC或者0xCD;
编译器这样做有助于判断一个变量是否初始化!