; esp,ebp ;esp复原
00402055 pop ebp ;ebp出栈,它的值也复原了
00402056 ret ;返回到此时栈顶存储的代码地址:00401FC1
;故而如果不幸被修改了返回地址,
程序就会出现意外
以上汇编代码由VC++6.0编译得到。
堆栈在EBP入栈后的情况:
低位 高位
↓ ↓
内存地址 堆栈
┆ ┆
0012F600├──────┤← edi = 0012F600
│ │
0012F604├─┄┄┄┄─┤
│ │
│ │
┆ 44h的空间 ┆
┆ ┆
│ │
│ │
0012F640├─┄┄┄┄─┤
│ │
0012F644├──────┤← ebp被赋值后指向该单元,此时ebp=0012F644
│AC F6 12 00 │ebp赋值为esp之前的值
0012F648├──────┤
│C1 1F 40 00 │返回地址
0012F64C├──────┤← ebp + 8
│A0 F6 12 00 │函数实参p的值
0012F650├──────┤
│ │
├──────┤
┆ ┆
注:存储器存储空间堆栈按从高到低的排列,左边标注的地址是其右下方存储单元的最低位地址。如0012F644指向0012F6AC的AC字节,AC在栈顶。图中存储