免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8047 | 回复: 14
打印 上一主题 下一主题

[函数] 函数调用的机制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-19 20:17 |只看该作者 |倒序浏览
本帖最后由 duwei211 于 2011-07-20 00:14 编辑

想了解函数调用的机制。
在调用函数时要完成哪些动作,比方进栈出栈,然后跳转等,以及怎么返回原来的地址。
可以的话希望能给出一段代码,顺便能具体分析下它对的汇编代码,谢谢

找了四个小时的资料,基本上理解了,因为本人汇编比较差,所以理解底层有点苦难!

写下我自己理解吧!

1、在调用子函数时,先将子函数参数从右到左一次进栈。
2、将子函数的返回地址进栈
3、跳转到子函数执行:
   首先保存基址指针的值:push EBP;这个动作是为了下面使用EBP寄存器(啥是EBP寄存器呢,它可以指向栈中的任何元素,达到访问的效果,但是堆栈指针ESP就不行了,ESP总指向栈顶,也就是它的值是随时改变的),这就是为什么我们将现在的栈顶位置保存在EBP寄存器的原因。
                        mov EBP,ESP;
    后面就是一些局部变量的堆栈操作。
4、在操作完成后,子函数返回前执行一些操作。例如还原栈顶的位置,还原EBP寄存器。
5、从子函数返回。将返回地址出栈,参数出栈。跳转到返回地址处继续执行。。。

论坛徽章:
0
2 [报告]
发表于 2011-07-19 20:20 |只看该作者
这个和中断原理是不是一样的?

论坛徽章:
0
3 [报告]
发表于 2011-07-19 20:34 |只看该作者
还有说啥啥把参数压栈,但是个人觉得把参数压栈没有实际意义啊,和局部变量压栈是一个道理?

论坛徽章:
0
4 [报告]
发表于 2011-07-19 20:35 |只看该作者
有木有人啊!!!!

论坛徽章:
0
5 [报告]
发表于 2011-07-19 22:51 |只看该作者
真尴尬,等半天了木有人屌我啊!
我写下自己的理解!
错误之处希望有人指出来。
在调用子函数时,首先将参数从右到左进栈。子函数返回地址进栈。
代子函数执行结束时,将返回地址出栈并跳转到此处继续执行(并将参数出栈)。

个人想问下参数是不是必须等到子函数执行结束由系统来完成出栈动作?
上面部分有错误的话还请之处,谢谢!!

论坛徽章:
0
6 [报告]
发表于 2011-07-19 23:24 |只看该作者
函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。


在栈中取数据是什么意思,要出栈吗?

论坛徽章:
0
7 [报告]
发表于 2011-07-19 23:25 |只看该作者
原来一直是我在自言自语啊,好心人在哪里

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2011-07-20 09:01 |只看该作者
参数入栈次序以及由调用者还是函数自己清栈跟调用约定(calling convention)有关

论坛徽章:
0
9 [报告]
发表于 2011-07-20 09:55 |只看该作者
LZ可以看下这本书:程序员的自我修养—链接、装载与库

论坛徽章:
0
10 [报告]
发表于 2011-07-20 10:08 |只看该作者
反汇编 代码 一句一句 理解,windows下 ollydbg, linux 下不知道有什么好的反汇编工具
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP