栈帧指esp和ebp两个寄存器所表示的内存空间称为改函数的栈帧。每一个函数调用都会形成新的栈帧。
首先,让我们来了解下程序的地址空间
以此代码展开讨论:
本次主要了解栈:
1:定义a,b变量
2:形参实例化:形参入栈(入到main函数的栈顶)
3.call命令
4.ebp入栈并和esp在同一位置
5.形成myadd的栈帧,定义myadd函数里的z变量
6:esp与ebp在同一位置
7.出栈到ebp
8.ret
9.恢复到最开始的栈帧
注:以上是栈帧过程,那我们学了栈帧有什么用呢....就用以下两个测试用例体现栈帧的用处
1.一个形参修改另一个形参
2.在连个函数之间利用栈帧插入另一个函数
注:出现程序崩溃的原因是因为:如果强行在两个函数之间插入另一个函数,如上图:调myadd 函数用的是call命令,call命令将会入栈,用ret返回,ret命令将会出栈;
调bug函数修改了eip地址,用ret返回,ret命令将会出栈(栈帧过程有详细说明),那么一次入栈,两次出栈,造成esp值错误,程序崩溃。
所以,避免程序崩溃,使esp值正确,在代码中加入_ _asm{ },指在c语言中植入汇编