栈帧的创建和销毁
来源:互联网 发布:mysql数据库默认密码 编辑:程序博客网 时间:2024/06/18 10:27
源代码
#include <stdio.h>void fun(int x, int y){ int z = x+y; return z;}int main(){ int a = 0xAAAAAAAA; int b = 0xBBBBBBBB; int c = fun(a,b); printf("you should run here!\n"); printf("c= %d\n", c); system("pause"); return 0;}
地址空间自下而上,由高到低。栈结构是向下生长的。ebp指向栈底,esp指向栈顶。eip中放main函数的代码。
打开反汇编,将a,b压入栈中,把b放入eax。
push eax ,指针下移,同理,将a放入ecx ,push ecx ,指针下移。
形参实例化的参数a,b放在main函数栈帧的顶部,形参实例化的顺序是从右往左。
执行call指令将下一条指令的地址压入栈顶,eip执行fun函数,将main的ebp压入栈顶。
call指令:将当前正在执行的指令的下一条地址,压入栈中,随即call命令跳转至指定函数。
指针下移形成一段新的空间,这段空间即为fun函数的栈帧。所有的临时变量即在两个栈帧之间。
将ebp+8与ebp+12的和z赋给eax,并将eax放入epb-4中
把ebp赋给esp,pop ebp 弹出栈顶到ebp
执行ret指令:弹出栈顶返回值地址,把值写入eip,esp+8指针上移
最后,把eax赋给ebp-12。而后释放临时变量。
阅读全文
0 0
- 栈帧的创建和销毁
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用过程,栈帧的创建和销毁。
- 函数的调用,栈帧的创建和销毁
- 浅谈函数的调用,栈帧的创建和销毁
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用及栈帧的创建和销毁
- 函数的调用(栈帧的创建和销毁)
- 函数的调用过程,栈帧的创建和销毁。
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用及栈帧的创建和销毁
- 函数调用过程,栈帧的创建和销毁
- 函数调用过程,栈帧的创建和销毁
- 索引的创建和销毁
- 视图的创建和销毁
- GDALDataset的创建和销毁
- session的创建和销毁
- session概念与购物车例子
- 研究100位同行,我总结了从0到5年的新媒体晋级宝典
- 从5个维度,对傅盛演讲「生物学思维模型」解读
- docker-compose ERROR: network jumpserver_default has active endpoints
- QT实现键盘复用:单击、双击、长按
- 栈帧的创建和销毁
- poj 2823 Sliding Window(单调队列)
- python2.7实现杨辉三角
- 从零开始学 Java
- nbtscan扫描指定网段的主机
- android 用多线程提升性能
- JAVA中如何将以Date型的数据保存到数据库以Datetime型的字段中
- 不想写程序,其实程序和功夫一样,就是一进一出而已,搞懂了也就不用再学程序了
- 车牌识别、证件识别等支持Windows、Linux部署