免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Godbach

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

论坛徽章:
0
发表于 2007-11-01 16:56 |显示全部楼层
原帖由 思一克 于 2007-11-1 16:53 发表
错误.

从左到右, printf也不变.



那就是bluesky_jxc 那个问题,如果取参方式不变,你如何确定第一参数在哪儿?

论坛徽章:
0
发表于 2007-11-01 17:07 |显示全部楼层
前面已经说了.

正方向STACK, ARG1先入. ARGN后入. 库FUCN不变. 这个有事实的. 在有些机器上检验过了.

原帖由 zx_wing 于 2007-11-1 16:56 发表

那就是bluesky_jxc 那个问题,如果取参方式不变,你如何确定第一参数在哪儿?

论坛徽章:
0
发表于 2007-11-01 17:12 |显示全部楼层
原帖由 思一克 于 2007-11-1 17:07 发表
前面已经说了.

正方向STACK, ARG1先入. ARGN后入. 库FUCN不变. 这个有事实的. 在有些机器上检验过了.


如果arg1先入,argN后入,没有关系。问题在于在argN入栈之后,你如何确定arg1在哪里???
现在你能用的就只有这个栈顶指针,在printf这种变参情形下,你根本不知道实际会传多少个参数进去,如何得到arg1的地址?

论坛徽章:
0
发表于 2007-11-01 17:16 |显示全部楼层
原帖由 思一克 于 2007-11-1 17:07 发表
前面已经说了.

正方向STACK, ARG1先入. ARGN后入. 库FUCN不变. 这个有事实的. 在有些机器上检验过了.


那也就是说前提是:栈增长方向变了,入栈顺序变成从左至右了。 那个帖子没细看,回去细看一下,我对这个实验有几点疑问:
1. 在什么平台上测试的,如果是x86,通过什么方法方便的配置成栈向上增长。
2. 不是x86平台的话,传参方式变了,上面的讨论就没有意义了。因为上面的帖子都是基于x86的传参、取参方式讨论的。

希望回去看了后能得到解答:wink: :wink:

论坛徽章:
0
发表于 2007-11-01 17:17 |显示全部楼层
原帖由 bluesky_jxc 于 2007-11-1 17:12 发表

如果arg1先入,argN后入,没有关系。问题在于在argN入栈之后,你如何确定arg1在哪里???
现在你能用的就只有这个栈顶指针,在printf这种变参情形下,你根本不知道实际会传多少个参数进去,如何得到arg1的地址?

去细看一下版主说的那个帖子,去看一下那个实验再说,我对实验环境很感兴趣。

论坛徽章:
0
发表于 2007-11-01 17:18 |显示全部楼层
你找我给出的原来04年的贴, 那上面有朋友实验过的. 没有疑问.

论坛徽章:
0
发表于 2007-11-01 18:25 |显示全部楼层
原帖由 思一克 于 2007-11-1 17:18 发表
你找我给出的原来04年的贴, 那上面有朋友实验过的. 没有疑问.

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

测试下来,powerPC体系结构下,默认第一个参数是通过寄存器来传递的,因此,可变参数的第一个参数总是可以得到,因此,入栈的顺序已经不重要了。而原因在于:
这种体系结构下,总是可以拿到第一个参数,和栈的增长方向无关
在X86这种体系结构下,由于寄存器不多,因此默认情况总是通过栈来传递参数的。(当然,我们不讨论fastcall、stdcall修饰情况下)为了支持可变参数,只能从右到左入栈。原因是这种体系结构下,不能判断第一个参数在哪里,仍然和栈的增长方向无关

论坛徽章:
0
发表于 2007-11-01 18:45 |显示全部楼层
原帖由 zx_wing 于 2007-11-1 17:16 发表

那也就是说前提是:栈增长方向变了,入栈顺序变成从左至右了。 那个帖子没细看,回去细看一下,我对这个实验有几点疑问:
1. 在什么平台上测试的,如果是x86,通过什么方法方便的配置成栈向上增长。
2. 不是x86平台的话,传参方式变了,上面的讨论就没有意义了。因为上面的帖子都是基于x86的传参、取参方式讨论的
...


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

设置 stack segment descriptor 的 E 位, E 为 1 时:expand-down 这是 stack 的常用的方式
                                          E 为 0 时:expand-up 设为 0 时,使用 stack segment 与普通的 segment 一样

论坛徽章:
0
发表于 2007-11-01 18:48 |显示全部楼层
记忆中: __pascal__ 这种方式不就是使得函数从左到右入栈吗, 谁来证实一下?

论坛徽章:
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
发表于 2007-11-01 20:13 |显示全部楼层
还有参数的 求值顺序怎么判断啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP