免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

[C] printf参数入栈顺序和编译器相关,还是都是从右至左? [复制链接]

论坛徽章:
0
61 [报告]
发表于 2007-11-01 21:10 |只看该作者
原帖由 mik 于 2007-11-1 18:45 发表


x86 的可以配置 stack 向上增长的:

设置 stack segment descriptor 的 E 位, E 为 1 时:expand-down 这是 stack 的常用的方式
                                          E 为 0 时:expand-up 设为 ...

呵呵,这个我知道哈。所以我问的是如何通过方便的方法将栈配置成向上增长

论坛徽章:
0
62 [报告]
发表于 2007-11-01 21:13 |只看该作者
原帖由 bluesky_jxc 于 2007-11-1 18:25 发表

仔细看了你给出的链接。学习了很多东西,但是,我觉得你的结论仍然是错误的。

测试下来,powerPC体系结构下,默认第一个参数是通过寄存器来传递的,因此,可变参数的第一个参数总是可以得到,因此,入栈的 ...

嗯,这个就是我前面关心的第二个问题了“2. 不是x86平台的话,传参方式变了,上面的讨论就没有意义了。因为上面的帖子都是基于x86的传参、取参方式讨论的。”
传参数方式变了,上面讨论的那些入栈顺序和函数声明方式的问题就没有任何意义了,我们前面都是基于x86传参取参方式来说的。
所以这个问题我们只要知道实质就是了,即对于不同的入栈方式,对于变参函数,如何取得参数。我认为讨论的目的已经达到了。

论坛徽章:
0
63 [报告]
发表于 2007-11-01 21:14 |只看该作者
原帖由 Godbach 于 2007-11-1 20:13 发表
还有参数的 求值顺序怎么判断啊

这个就确实是编译器决定的了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
64 [报告]
发表于 2007-11-01 22:47 |只看该作者
原帖由 zx_wing 于 2007-11-1 21:14 发表

这个就确实是编译器决定的了


我的意思是如果N个参数的话,编译器求值的顺序应该是要么从左至右,要么从右至左把

论坛徽章:
0
65 [报告]
发表于 2007-11-02 08:54 |只看该作者
函数声明方式不变是标准规定的。

参数传递次序不是标准规定的。根据具体系统而变。

原帖由 zx_wing 于 2007-11-1 21:13 发表

嗯,这个就是我前面关心的第二个问题了“2. 不是x86平台的话,传参方式变了,上面的讨论就没有意义了。因为上面的帖子都是基于x86的传参、取参方式讨论的。”
传参数方式变了,上面讨论的那些入栈顺序和函数 ...

论坛徽章:
0
66 [报告]
发表于 2007-11-02 12:59 |只看该作者
原帖由 zx_wing 于 2007-11-1 11:57 发表

请给出个例子,为什么变参无法实现。

还是应用一些经典教材吧,见《C陷阱与缺陷》159、160页


看到第一段段引用,我很惊讶。
我不相信这么权威的书竟然会有这样可笑的看法,也许是翻译有误,或者是断章取义。
这跟第一个参数没关系,与这个参数是不是char*也没关系? 那要是sprintf呢?那要是open(2)呢?


我以前确实没注意栈的生长方向问题,放了大话,很不好意思!

考虑了几天,感觉应该是这样的:

入栈顺序的设计,是要保证所有变参的位置位于他们前面一个参数的高地址处。

这样就能保证stdarg的库代码通用了,你们觉得呢?

[ 本帖最后由 JohnBull 于 2007-11-2 13:03 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
67 [报告]
发表于 2007-11-02 13:21 |只看该作者
原帖由 JohnBull 于 2007-11-2 12:59 发表


看到第一段段引用,我很惊讶。
我不相信这么权威的书竟然会有这样可笑的看法,也许是翻译有误,或者是断章取义。
这跟第一个参数没关系,与这个参数是不是char*也没关系? 那要是sprintf呢?那要是open(2 ...


呵呵,这个总结精辟。理解。

论坛徽章:
0
68 [报告]
发表于 2007-11-02 13:22 |只看该作者
原帖由 JohnBull 于 2007-11-2 12:59 发表


看到第一段段引用,我很惊讶。
我不相信这么权威的书竟然会有这样可笑的看法,也许是翻译有误,或者是断章取义。
这跟第一个参数没关系,与这个参数是不是char*也没关系? 那要是sprintf呢?那要是open(2 ...

那是因为对于sprintf、fprintf这类函数,fmt这个参数字符串都是在固定位置,例如在第二参数、第三个参数,函数总可以得到这个字符串判断出后面变参的个数。对于变参函数的解析,都要通过一个参数解析出后面参数的个数才能正常取参,无法凭压栈的顺序或和栈有关的方法判断出一共传入了的多少参数。

论坛徽章:
0
69 [报告]
发表于 2007-11-02 13:23 |只看该作者
原帖由 Godbach 于 2007-11-2 13:21 发表


呵呵,这个总结精辟。理解。

如何理解的? 如何得到参数个数?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
70 [报告]
发表于 2007-11-02 13:28 |只看该作者
入栈顺序的设计,是要保证所有变参的位置位于他们前面一个参数的高地址处。

不好意思,理解的是上面这句话。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP