| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1136 人关注过本帖
标题:在汇编层面:实参的值是如何传递给形参的?
只看楼主 加入收藏
px1983421
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-9-16
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
在汇编层面:实参的值是如何传递给形参的?
重提老话题了,不讨论都知道的形参和实参的关系,只讨论,在实际程序运行过程中,当调用一个带参数的函数时,形参的地址被划分后,实参的值是如何被赋给形参的呢?
我在网上查询到的说法是:在PC指针跳转到被调用函数之前,编译器会自动添加代码将所有实参值依次压入栈,而进入被调用函数后,该函数会将参数值依次出栈(逆序),赋值给形参空间。

但是在我工作中用的PIC16系列单片机中,堆栈空间是一定的,不可更改,并且很小,个人感觉如果这样的话,我编写的一些多层调用 ,带很U32参数的系统,将会导致堆栈溢出,但实际上并没有,这是怎么回事呢?

到底实参的值是怎么传递给形参的呢?是不是在嵌入式系统里,不同的处理器对应的编译器处理方式不一样呢?
搜索更多相关主题的帖子: 如何 空间 编译器 网上 
2011-10-12 20:49
px1983421
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-9-16
收藏
得分:0 
重提老话题了,不讨论都知道的形参和实参的关系,只讨论,在实际程序运行过程中,当调用一个带参数的函数时,形参的地址被划分后,实参的值是如何被赋给形参的呢?
我在网上查询到的说法是:在PC指针跳转到被调用函数之前,编译器会自动添加代码将所有实参值依次压入栈,而进入被调用函数后,该函数会将参数值依次出栈(逆序),赋值给形参空间。

但是在我工作中用的PIC16系列单片机中,堆栈空间是一定的,不可更改,并且很小,个人感觉如果这样的话,我编写的一些多层调用 ,带很U32参数的系统,将会导致堆栈溢出,但实际上并没有,这是怎么回事呢?

2011-10-12 20:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
你的多层调用有多少层呀?在PC上,能够导致栈溢出的往往是递归,我看你说的多层多不到这个程度。要栈溢出,必须是压入很多函数而总不释放的情形,而正常的程序,是调用完一个之后再调用另一个的,在整个程序的最深处,极少达到溢出的极限(犹如公共汽车,一趟行程所接纳过的人数远远大于它同时能承载的人数)。要知道,编译器默认的栈尺寸,是在大量程序设计实践的基础上制定的,它能满足绝大多数需要——如果你的程序确实很特殊,比如有很深的递归调用,那么可以通过修改编译器的栈尺寸参数来加大它。总之,栈是有溢出的风险,但并不那么容易溢出,而所有教材上都有告诉我们什么情形下要警惕栈溢出,那就是递归设计,这是最典型的溢出算法。

[ 本帖最后由 TonyDeng 于 2011-10-13 00:15 编辑 ]

授人以渔,不授人以鱼。
2011-10-13 00:06
naruto01
Rank: 4
等 级:业余侠客
帖 子:103
专家分:280
注 册:2011-5-23
收藏
得分:7 
未经优化一般都是ebp+4, ebp+8类似这样读取函数传递的参数,也就是“所有实参值依次压入栈”后的结果。
我学的51单片机,很简单,基本没有什么复杂的函数调用,不知道你的多层调用是个怎样的概念,可以贴上一些代码参考下吗?
2011-10-13 00:17
px1983421
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-9-16
收藏
得分:0 
明白了,我把程序栈和处理器用来保存PC指针的硬件堆栈给弄混了,谢谢大家
2011-10-13 08:50
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:7 
以下是引用TonyDeng在2011-10-13 00:06:32的发言:

你的多层调用有多少层呀?在PC上,能够导致栈溢出的往往是递归,我看你说的多层多不到这个程度。要栈溢出,必须是压入很多函数而总不释放的情形,而正常的程序,是调用完一个之后再调用另一个的,在整个程序的最深处,极少达到溢出的极限(犹如公共汽车,一趟行程所接纳过的人数远远大于它同时能承载的人数)。要知道,编译器默认的栈尺寸,是在大量程序设计实践的基础上制定的,它能满足绝大多数需要——如果你的程序确实很特殊,比如有很深的递归调用,那么可以通过修改编译器的栈尺寸参数来加大它。总之,栈是有溢出的风险,但并不那么容易溢出,而所有教材上都有告诉我们什么情形下要警惕栈溢出,那就是递归设计,这是最典型的溢出算法。


你真的知道函数参数的传递方式吗,我说的是会变层的。
2011-10-13 19:23
快速回复:在汇编层面:实参的值是如何传递给形参的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015845 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved