免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
31 [报告]
发表于 2007-11-01 11:27 |只看该作者
原帖由 JohnBull 于 2007-11-1 11:18 发表


是的,否则变参函数无法实现。


多谢,是这样的,前面有位朋友也是这样解释的。

那入栈顺序确定了,是不是代表求值顺序也确定了啊?

论坛徽章:
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
32 [报告]
发表于 2007-11-01 11:29 |只看该作者
如果都是C下面,入栈顺序都是从右至左,但是不同的编译器计算的结果还有可能不同,是不是说明是不同编译器对参数的求值顺序是不同的?

论坛徽章:
0
33 [报告]
发表于 2007-11-01 11:31 |只看该作者
原帖由 zx_wing 于 2007-11-1 09:40 发表

汗,大哥,没有关系的。取参数不是用的pop,是用的mov,入栈顺序不影响取参

大哥,mov和pop没有本质区别,反正就是取最后一个参数。
printf和入栈顺序肯定有关系,不然printf的参数个数是没有办法确定的

论坛徽章:
0
34 [报告]
发表于 2007-11-01 11:32 |只看该作者
原帖由 Godbach 于 2007-11-1 11:27 发表


那入栈顺序确定了,是不是代表求值顺序也确定了啊?


那不一定,这就是编译器自己决定的事情了。

比如上面那个同学举的例子。

论坛徽章:
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
35 [报告]
发表于 2007-11-01 11:35 |只看该作者
原帖由 JohnBull 于 2007-11-1 11:32 发表


那不一定,这就是编译器自己决定的事情了。

比如上面那个同学举的例子。


那么编译器对实参的求值顺序应该只可能是从左至右,或者从右至左吧,不可能有第三种顺序了吧

论坛徽章:
0
36 [报告]
发表于 2007-11-01 11:38 |只看该作者
这个问题应该是这样的:

在有些机器上,STACK是从低地址向高地址生长的, 为了保证ARG1到ARGN符合低-高的次序(变参,和一些库程序依赖该次序), 就要先入栈ARG1.

原来有一个贴, 争论这个问题,我一直以为永远是ARGN先, 后来WIN_HATE, 等指出我的认为是错的. 还给出了例子. 事实上我的认为不对.

可以找到那个贴.

论坛徽章:
0
37 [报告]
发表于 2007-11-01 11:41 |只看该作者
你定义的函数你可以自己指定的啦,例如: winapi之类的

论坛徽章:
0
38 [报告]
发表于 2007-11-01 11:46 |只看该作者
原帖由 思一克 于 2007-11-1 11:38 发表
这个问题应该是这样的:

在有些机器上,STACK是从低地址向高地址生长的, 为了保证ARG1到ARGN符合低-高的次序(变参,和一些库程序依赖该次序), 就要先入栈ARG1.

原来有一个贴, 争论这个问题,我一直以为永远是 ...


哦,对了,忘了栈生长方向问题了

论坛徽章:
0
39 [报告]
发表于 2007-11-01 11:48 |只看该作者
原帖由 思一克 于 2007-11-1 11:38 发表
这个问题应该是这样的:

在有些机器上,STACK是从低地址向高地址生长的, 为了保证ARG1到ARGN符合低-高的次序(变参,和一些库程序依赖该次序), 就要先入栈ARG1.

原来有一个贴, 争论这个问题,我一直以为永远是 ...

按照版主的意思,就是入栈顺序和栈的生长方向有关了?就是为了符合Arg1-ArgN的高低次序?
如果栈向下生长,没有问题
如果栈向上生长,那么第一个拿到的参数肯定也是栈顶元素,right?
因此为了实现变参,arg1肯定只能最后一个入栈。否则无法实现变参

我怎么觉得这个参数的入栈顺序和栈的生长方向没有关系呢?

论坛徽章:
0
40 [报告]
发表于 2007-11-01 11:51 |只看该作者
原帖由 bluesky_jxc 于 2007-11-1 11:31 发表

大哥,mov和pop没有本质区别,反正就是取最后一个参数。
printf和入栈顺序肯定有关系,不然printf的参数个数是没有办法确定的

大大哥,printf的参数个数是靠第一个参数那个字符串确定的。
printf无法检测出你错误的传入参数个数的,例如

  1. printf("%d,%d,%d\n",1,2,3,4,5,6);
复制代码

一样是正确的。

pop和mov当然有本质区别,如果用pop取参,按自右向左的顺序入栈,取的就是第一个参数。
但是mov没有限制,例如 mov 偏移(ebp), eax,取哪个参数偏移就决定了,不受你入栈顺序限制。

这些问题你应该是清楚的嘛,没见你几天就傻啦,唉,追人失败影响智商啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP