Chinaunix首页 | 论坛 | 博客
  • 博客访问: 173338
  • 博文数量: 45
  • 博客积分: 1228
  • 博客等级: 中尉
  • 技术积分: 450
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-26 11:37
文章分类
文章存档

2013年(4)

2012年(3)

2011年(20)

2010年(18)

我的朋友

分类: C/C++

2010-09-16 11:10:30

函数调用时的内存分析

(为即将调用的函数准备参数)

mov %ebp+偏移 ,%eax 将参数传到eax

mov %eax ,%esp+偏移 将参数放到当前空间。

sub $18 ,%ebp #将栈底指针向下移动以存放参数和变量。

(call 保存函数执行现场)

call %eip

相当于指令:push %eip

                     mov addr ,%eip

(保存栈的相关指针)

push %ebp #保存栈顶。

mov %esp, %ebp #将栈底赋给栈顶。

 

(将返回值放入eax中,供调用函数读取)

mov 返回变量地址, %eax

(还原栈指针,释放被调用函数的内存空间。)

leave

相当于一下指令:mov %ebp, %dsp

                            pop %ebp

(恢复调用前的现场)

ret

相当于一下指令: ~call

                            pop %eip //恢复执行前的地址。

问题:

       每次为参数和变量预留空间时 sub的值是怎么确定的?

sub 的值是由被调用函数内部声明的变量和参数决定的。每多一个参数地址就加0x04,而函数中的变量为每四个,地址就增加0x10。例如:有两个整形参数,则加0x08,有一个整形参数的话加0x10,有四个整形参数也加0x10,有五个时就加0x20

调用函数的栈帧分布

 

阅读(3540) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-16 15:25:45

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com