免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
发表于 2007-10-31 22:16 |显示全部楼层
原帖由 Godbach 于 2007-10-31 22:12 发表


对阿,好像C下的都是从右至左入栈。之前看到类似的贴子,大家都说和编译器有关,所以很想知道是那个编译器。或者本身就是从右至左,而和编译起无关。

和编译器无关除非是架构的ABI规定必须这样做。但我想不出有什么理由ABI需要做这样的规定。
不过也很难说,记得x86_64就规定对于老式c的函数声明(就是void func();这种,只有函数名字但括号里不写参数),参数入栈前要在rax中存入参数的个数,对这也是很莫名。

论坛徽章:
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-10-31 22:17 |显示全部楼层
也是,但是是否有从左至右的呢

论坛徽章:
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-10-31 22:19 |显示全部楼层
难道是一些有特殊用途的编译器有从左至右的,有没常用中有这样的

论坛徽章:
0
发表于 2007-10-31 22:20 |显示全部楼层
原帖由 anthony1983 于 2007-10-31 22:15 发表

  公司可能用X86么

当然会啦,intel的xeon(至强)不是很多公司在用嘛,还有amd的新四核--巴塞罗那,都是x86的。现在中小服务器基本上都用x86。
Itanium,power,sparc也只能争一争高端那可怜的份额了。。。

哦,这里x86只是x86架构家族的cpu哈,不是说它们是32位的x86

[ 本帖最后由 zx_wing 于 2007-10-31 22:21 编辑 ]
一路征程一路笑 该用户已被删除
发表于 2007-10-31 22:25 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2007-10-31 22:28 |显示全部楼层
原帖由 sanbiangongzi 于 2007-10-31 22:14 发表
我在想,如果不从右到左,那么在printf内部怎么判断这次调用有好多个参数呢?

不是通过压栈顺序判断的,是通过解析第一个参数,即那个字符串里面的符号来得出参数数目。
实际上通过压栈顺序是无法得出传入了多少个参数的。
我记得《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
发表于 2007-10-31 22:41 |显示全部楼层
呵呵,明天翻翻

论坛徽章:
0
发表于 2007-11-01 00:39 |显示全部楼层
跟编译器和平台都有关吧

arm-linu-gcc里面,对Arm平台,参数的传递用的是寄存器r0,r1,r2,...r7,
对应从左到右的各个参数

论坛徽章:
0
发表于 2007-11-01 01:11 |显示全部楼层
原帖由 sanbiangongzi 于 2007-10-31 22:14 发表
我在想,如果不从右到左,那么在printf内部怎么判断这次调用有好多个参数呢?

正是从右到左才能判断啊。。。。
你想,栈啊,先进后出啊,所以最左边一个参数最后一个进栈,第一个出栈,然后printf在自己的代码里面只要分析第一个pop出来的字符串不就知道了么。。
另外,不定参数也是这样实现的,只是第一个参数指定了参数的个数

论坛徽章:
0
发表于 2007-11-01 01:21 |显示全部楼层
__cdecl __stdcall __pascal __fastcall
WINAPI
各位不会从来不在windows下编程吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP