免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 2007-11-01 11:38 |显示全部楼层
这个问题应该是这样的:

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

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

可以找到那个贴.

论坛徽章:
0
2 [报告]
发表于 2007-11-01 12:07 |显示全部楼层
看这个贴. 我找到的. 注意,我的结论是错的,win-hate等的是对的.
也就是说,次序是变化的.

http://bbs.chinaunix.net/viewthr ... ;extra=&page=12

论坛徽章:
0
3 [报告]
发表于 2007-11-01 16:53 |显示全部楼层
错误.

从左到右, printf也不变.


原帖由 zx_wing 于 2007-11-1 12:35 发表

哈哈,这个确实是个问题。但你这样想是因为你把思维局限在了printf现在的原型上。
是因为有了从右向左的入栈顺序,才有printf现在的原型。
如果c语言的入栈顺序是从左向右,printf就会变成:

printf(arg ...

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

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

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

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

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

论坛徽章:
0
6 [报告]
发表于 2007-11-02 08:54 |显示全部楼层
函数声明方式不变是标准规定的。

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

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

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

论坛徽章:
0
7 [报告]
发表于 2007-11-02 13:44 |显示全部楼层
第一个参数问题,编译随便做点暗处的小动作就可以了。

要保证后面参数ARGN的地址比ARG1高,目的是使LIB库什么也不用改动就可以直接使用(STDARG。H等)。

论坛徽章:
0
8 [报告]
发表于 2007-11-02 17:32 |显示全部楼层
一个方法(真实的不一定如此)。
CALLER:
push arg1, 2, ...argN, push &arg1.
CALLEE:
pop(get) address arg1.

这种trick在X86的GCC中也有。比如函数返回了一个结构。

具体是怎么搞的,你找一个正方向STACK机器看一下就知道了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP