免费注册 查看新帖 |

Chinaunix

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

[C] C语言函数参数压栈顺序与求值顺序的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-05-16 22:29 |只看该作者
查了一下, CallingConvention只是讲了参数Push的顺序,还是和参数计算的顺序没有关系,请指教..?_
Calling convention is the name of the calling convention. __cdecl, __stdcall, __pascal and
__fastcall can be specified explicitly in C++ function declarations for compilers that support
these conventions
所以,即使限制了从右向左的CallingConvention,仍然不能保证参数计算的顺序,在Gcc的文档里面也没有相应的选项.
继续查..

论坛徽章:
0
12 [报告]
发表于 2009-05-16 23:10 |只看该作者

回复 #9 beepbug 的帖子

也许我得提供英文翻译。

“从某种意义上讲,C 语言不是高级语言,因为它具备许多高级语言无法完成的功能,就比如直接内存访问。”

The C programming language is not, in some sense, a high level language, in that it is capable of performing numerous tasks that many high level languages cannot, one example being directly accessing main memory.

论坛徽章:
0
13 [报告]
发表于 2009-05-16 23:13 |只看该作者

回复 #11 maxwu 的帖子

是的,不存在这样的选项。

论坛徽章:
0
14 [报告]
发表于 2009-05-16 23:22 |只看该作者
原帖由 beepbug 于 2009-5-16 20:57 发表

1)C不能直接访问内存?
某些C不能,与语言无关,是虚存的问题。因为几乎所有的单片机C都能直接访问内存,DOS的C也行。
2)其它高级语言都能直接访问内存?
好像还是不行的多。


你完全看反了意思。
人家说的是C有其他高级语言没有的功能,比如直接内存访问。因此说C不是高级语言。

论坛徽章:
0
15 [报告]
发表于 2009-05-16 23:33 |只看该作者

回复 #14 思一克 的帖子

不过这样也挺好,有些话他补充出来了,比如单片机和虚拟内存之类的事。:wink:

论坛徽章:
0
16 [报告]
发表于 2009-05-16 23:37 |只看该作者

回复 #15 langue 的帖子

那与 C 无关,与平台和系统相关。

不能描述为在 XXXX 下的 C 可以访问内存,这样就不对的。

是目标平台允不允许你直接访问内存的问题。

---------------------------------------

只要 OS 允许,你完全可以在 x86 平台下直接访问内存,问题是现在的 x86 上的 OS 不允许你这么做。所以他的表述是错误的。

论坛徽章:
0
17 [报告]
发表于 2009-05-16 23:43 |只看该作者
那也不对。
那段话“其它高级语言不能直接访问内存”的意思和虚存实存没有关系。
只是说可以或不可以直接访问内存(虚的或实的,看OS而定),不管虚实。
因为讨论语言是否可以直接访问内存不考虑OS内存保护层次上的事情。和该层次无关。

比如FORTRAN, PASCAL, BASIC等都不能直接访问内存(没有指针)。而C就可以(有指针)。至于是虚还是实,看语言运行的OS, 不是这里讨论的问题。BASIC能运行在DOS上,单片机OS上,也可以在WINDOW NT上, LINUX上。

越高级的语言内存访问能力越差。越低级的能力越强。

很微妙的。


原帖由 langue 于 2009-5-16 23:33 发表
不过这样也挺好,有些话他补充出来了,比如单片机和虚拟内存之类的事。:wink:

论坛徽章:
0
18 [报告]
发表于 2009-05-16 23:49 |只看该作者
发个表格:
语言                        C      SysCall    StdCall    BASIC    FORTRAN    PASCAL
最先入栈参数            右         右            右            左           左               左
清除堆栈者            调用者   子程序      子程序      子程序     子程序         子程序
允许使用VARARG      是         是            是            否           否               否

VARARG表示参数的个数是可以不确定的,比如sprintf函数,StdCall的堆栈清除平时是由子程序完成的,但是用VARARG时是由调用者清除的。

[ 本帖最后由 daybreakcx 于 2009-5-16 23:51 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2009-05-17 08:48 |只看该作者
对不起,是我没看清。但是,
The C programming language is not, in some sense, a high level language, in that it is capable of performing numerous tasks that many high level languages cannot, one example being directly accessing main memory.
不管"The C programming language is not, in some sense, a high level language"是否有理,"being directly accessing main memory"不是一个好例子。说严重点,是个很糟糕的例子。因为即使它算C的本性,事实上也受很大的限制。只有在裸机上或在实模式系统上,它才能这样做。mik说得对。
如果要说"The C programming language is not, in some sense, a high level language",比较合适的例子是说,“C没定义数据类型的长度”。
思一克犯了我一样错误:"main memory"。这个不是虚的。
“比如FORTRAN, PASCAL, BASIC等都不能直接访问内存(没有指针)”?至少BASIC不对。8位机的MBASIC(又叫BASIC-80)就可以直接访问内存。后来的各种BASIC也多数可以。俗话说得好,条条大道通罗马。指针大道能去罗马,peek-poke road也能去罗马。
“越高级的语言内存访问能力越差。越低级的能力越强”,这话对,但是不微妙,因为这是常理。微妙的是,有时有例外。譬如BASIC也能直接访问内存。

论坛徽章:
0
20 [报告]
发表于 2009-05-17 10:38 |只看该作者
原帖由 beepbug 于 2009-5-17 08:48 发表
对不起,是我没看清。但是,
The C programming language is not, in some sense, a high level language, in that it is capable of performing numerous tasks that many high level languages cannot, one  ...


main memory就是指内存。
讨论或区分一个语言是否有能力直接访问主内存,就是说一个语言有无指针(类似)的能力。和OS系统所谓内存虚实无关。

我们说汇编可以直接访问main memory
C也基本可以(通过指针)
BASIC FORTRAN不可以。
该结论是语言的特征,和OS和内存保护等无关。比如汇编可以直接访问主内存这句话,在任何平台(分虚实和不分的)都为真。
main memory不是指实存虚存之类的-----这不是语言涉及的范围。

不要被误解了。
分清楚作用范围和问题的层次,就不容易误解了。

[ 本帖最后由 思一克 于 2009-5-17 10:54 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP