Redian新闻
>
再请教个:C变长参数的传递问题 (转载)
avatar
再请教个:C变长参数的传递问题 (转载)# Programming - 葵花宝典
D*n
1
我妈在国内,耳朵不舒服,有胀痛感觉。医生说是,耳咽鼓管功能不良,耳咽导管异常
开放。
医生说没啥治疗方法。请问这个病在美国可以治吗? 我还想要我妈过来,听说有这个病
,坐飞机够呛,不知道会有多严重?
avatar
k*k
2
文学与政治
随便说说
政治,中性地说,无非是众人之事。但是,微妙在于,执掌众人之事的权力是把双刃剑
。用的好,增进社会福利;用的不好,不仅不能增进福利,甚至也会带来灾难。我们说
,政治是肮脏的,并非指众人之事的肮脏,而是为取得执掌权力而勾心斗角,不折手段
,无所不用其极,这种做法是肮脏的。所以,文学,如果是美的,那么,必定与这种肮
脏保持距离。正如孔子说:“不义而富且贵,于我如浮云”。中国传统中士大夫的“不
仕”,不愿同流合污的理想主义精神,一直值得称道。范仲淹,可谓非常入世,但他到
严子陵钓台的时候说“云山苍苍,江水泱泱,先生之风,山高水长”,而严子陵却是愿
意舍却高官的隐士。陶渊明是一个更为著名的例子,也许只有“不为五斗米而折腰”的
人,才能写出“采菊东篱下,悠然见南山”这样的美句。魏晋的政治黑暗,造就了一大
批好的文学,我们能记下来,都不是因为他们附和了时政,而恰恰相反,他们是对当时
肮脏政治的一种“反动”。
今天的政治,当然已经不是传统的那种家天下的独裁政治。但是,仍然有帮派,仍然有
为争权夺利的肮脏。而越是不透明的政治,这种不能见光的肮脏越多;越是权力集中,
争权夺利带来的扭曲也越厉害。所以,文学对政治的警惕似乎并没有本质的改变。能打
动人的文学,仍然不会是歌功颂德的伟光正文学,就像诗经中留下来精华不会是宫廷文
学。我们记住了“硕鼠硕鼠,勿食我黍”,是因为它打动了内心深处对弱者的同情心;
我们记住了“窈窕淑女,君子好求”,是因为这表达了追求男欢女爱的心声;我们也记
住了“携子之手,与子同老”,这是爱情不朽的誓言;“我有嘉宾,鼓瑟鼓琴”,唤起
我们对友谊的体会。。。。。如果有这些基本的审美能力,我们对于那些违背人性的政
治便具有天然的反感。具有讽刺意味的是,逼着人们只谈风月的高压制度,往往是诞生
好文学作品的摇篮。人们对《古拉格群岛》的偏爱,也许道理在于此。
avatar
t*s
3
家里的几台电脑中了W32.Conficker蠕虫。这种蠕虫很厉害,反病毒的网站如
TrendMicro都上不去,微软的网站也上不去。
所有的外置硬盘和拇指盘都感染了。估计就是通过Windows的autorun.inf传播的。
今天在这个网站上发现可以用Ubuntu的LiveCD启动电脑,查杀 Windows XP分区下的病
毒。
http://alexsantidote.com/windows/conflicker-worm-what-to-do/
“If you are familiar with Linux, you can burn yourself a Live CD (or make
an Ubuntu 8.10 Live USB w/Persistence)… Boot into Linux, install an anti-
virus program and run a scan on your Windows partition (you’ll likely need
to mount it first).”
我的问题是Linux操作系统下有杀毒软件吗?有的话,用Li
avatar
l*d
4
比如printf()这种变长参数个数的函数,调用是stack里是需要push哪些东西的,跟普通的定长
参数函数调用有何不同呢?谢谢
avatar
e*e
5
诗经里还是很有些歌功颂德的,颂这个词不就那儿来的么……
这篇谈得具体些,还挺切实际:
http://voachineseblog.com/heqinglian/2010/10/play/

【在 k******k 的大作中提到】
: 文学与政治
: 随便说说
: 政治,中性地说,无非是众人之事。但是,微妙在于,执掌众人之事的权力是把双刃剑
: 。用的好,增进社会福利;用的不好,不仅不能增进福利,甚至也会带来灾难。我们说
: ,政治是肮脏的,并非指众人之事的肮脏,而是为取得执掌权力而勾心斗角,不折手段
: ,无所不用其极,这种做法是肮脏的。所以,文学,如果是美的,那么,必定与这种肮
: 脏保持距离。正如孔子说:“不义而富且贵,于我如浮云”。中国传统中士大夫的“不
: 仕”,不愿同流合污的理想主义精神,一直值得称道。范仲淹,可谓非常入世,但他到
: 严子陵钓台的时候说“云山苍苍,江水泱泱,先生之风,山高水长”,而严子陵却是愿
: 意舍却高官的隐士。陶渊明是一个更为著名的例子,也许只有“不为五斗米而折腰”的

avatar
b*n
6
有杀毒软件啊,不过估计没有windows下的强大
你在别的机器上下载windows杀毒软件的病毒库升级包
回到自己机器上本地升级杀毒试试

need

【在 t**********s 的大作中提到】
: 家里的几台电脑中了W32.Conficker蠕虫。这种蠕虫很厉害,反病毒的网站如
: TrendMicro都上不去,微软的网站也上不去。
: 所有的外置硬盘和拇指盘都感染了。估计就是通过Windows的autorun.inf传播的。
: 今天在这个网站上发现可以用Ubuntu的LiveCD启动电脑,查杀 Windows XP分区下的病
: 毒。
: http://alexsantidote.com/windows/conflicker-worm-what-to-do/
: “If you are familiar with Linux, you can burn yourself a Live CD (or make
: an Ubuntu 8.10 Live USB w/Persistence)… Boot into Linux, install an anti-
: virus program and run a scan on your Windows partition (you’ll likely need
: to mount it first).”

avatar
t*t
7
you need to know the address of 1st parameter, so the only sensible order is
from back to front.

【在 l******d 的大作中提到】
: 比如printf()这种变长参数个数的函数,调用是stack里是需要push哪些东西的,跟普通的定长
: 参数函数调用有何不同呢?谢谢

avatar
u*b
8
诗经被孔子删过,孔子是什么样的主打思想?

【在 e***e 的大作中提到】
: 诗经里还是很有些歌功颂德的,颂这个词不就那儿来的么……
: 这篇谈得具体些,还挺切实际:
: http://voachineseblog.com/heqinglian/2010/10/play/

avatar
t*s
9
关键是用LiveCD启动的话,杀毒软件装在哪啊?
可不可以装在USB ThumbDrive上?

【在 b******n 的大作中提到】
: 有杀毒软件啊,不过估计没有windows下的强大
: 你在别的机器上下载windows杀毒软件的病毒库升级包
: 回到自己机器上本地升级杀毒试试
:
: need

avatar
l*d
10
多谢了,再问下,这种变长参数的函数调用,往stack里push的东西,和普通的定长参
数函数调用有区别吗?对定长参数函数调用,stack里push的就是寄存器和参数,对变
长参数函数调用而言,会有什么特殊处理吗?

is

【在 t****t 的大作中提到】
: you need to know the address of 1st parameter, so the only sensible order is
: from back to front.

avatar
e*e
11
诗经被删前是什么样子?kink不是说孔子的“不义而富且贵,于我如浮云”么,你觉得
他主体思想是神马呢?

【在 u**b 的大作中提到】
: 诗经被孔子删过,孔子是什么样的主打思想?
avatar
a*e
12
装载它自己的缓冲区,反正能装上,你管他装哪呢
装usb上也是可以的

【在 t**********s 的大作中提到】
: 关键是用LiveCD启动的话,杀毒软件装在哪啊?
: 可不可以装在USB ThumbDrive上?

avatar
d*n
13
不是变长,function parameters 就留个开始地址,剩下的都在caller里面呢。

【在 l******d 的大作中提到】
: 多谢了,再问下,这种变长参数的函数调用,往stack里push的东西,和普通的定长参
: 数函数调用有区别吗?对定长参数函数调用,stack里push的就是寄存器和参数,对变
: 长参数函数调用而言,会有什么特殊处理吗?
:
: is

avatar
a*i
14
I never used it myself, but you can try try clam.
apt-get install clam
apt-get install clamgui
avatar
X*r
15
你觉得会需要什么样的特殊处理呢?

【在 l******d 的大作中提到】
: 多谢了,再问下,这种变长参数的函数调用,往stack里push的东西,和普通的定长参
: 数函数调用有区别吗?对定长参数函数调用,stack里push的就是寄存器和参数,对变
: 长参数函数调用而言,会有什么特殊处理吗?
:
: is

avatar
t*t
16
你知道你在说什么吗? 我不知道...

【在 d****n 的大作中提到】
: 不是变长,function parameters 就留个开始地址,剩下的都在caller里面呢。
avatar
l*d
17
我觉得variable length arguments和fixed length arguments的call stack没啥两样
,两种情况要push的无非就是寄存器和arguments吧。但最近准备面试题时碰到这题,
不知道我是不是漏了什么没考虑。

【在 X****r 的大作中提到】
: 你觉得会需要什么样的特殊处理呢?
avatar
d*n
18
who care you?

【在 t****t 的大作中提到】
: 你知道你在说什么吗? 我不知道...
avatar
l*d
19
莫生气莫生气,讨论问题而已。可能中文变长有歧义,我是指variable length
arguments.

【在 d****n 的大作中提到】
: who care you?
avatar
X*r
20
基本上就是这样了。要注意这个其实是ABI 的一部分,所以完全取决于具体的体系结
构/ 平台。比如可以让被调用者负责保持某 些寄存器,以及用寄存器而不是栈来传递
前 若干 个参数。

【在 l******d 的大作中提到】
: 我觉得variable length arguments和fixed length arguments的call stack没啥两样
: ,两种情况要push的无非就是寄存器和arguments吧。但最近准备面试题时碰到这题,
: 不知道我是不是漏了什么没考虑。

avatar
a9
21
搭车问个问题。
这个变长数组。我在一个mips上,kernel 2.4.17_mvl21-malta-mips_fp_le
uClibc-0.9.19上,取最后一个固定参数的指针,取出来的是main函数的指针位置。
结果参数都取不到值。不知道有没有解决方案?

两样
题,

【在 X****r 的大作中提到】
: 基本上就是这样了。要注意这个其实是ABI 的一部分,所以完全取决于具体的体系结
: 构/ 平台。比如可以让被调用者负责保持某 些寄存器,以及用寄存器而不是栈来传递
: 前 若干 个参数。

avatar
S*I
22
对参数个数可变的函数,调用结束后要由caller function来clean up stack。至于往
stack上push的东东,和参数个数固定的函数调用应该没什么不同,至少在Windows平台
上是如此。

普通的定长

【在 l******d 的大作中提到】
: 比如printf()这种变长参数个数的函数,调用是stack里是需要push哪些东西的,跟普通的定长
: 参数函数调用有何不同呢?谢谢

avatar
t*t
23
as xentar said, this tightly depends on specific ABI used. even on windows
32bit, cdecl, stdcall, fastcall, etc. are all different (of course, some of
them do not support variadic).
for example, on x86-64/linux, %al will be set to number of registers used in
variadic function call. although in all conventions, variadic calls must
let callee to find "..." parameters from the last fixed parameter.

【在 S**I 的大作中提到】
: 对参数个数可变的函数,调用结束后要由caller function来clean up stack。至于往
: stack上push的东东,和参数个数固定的函数调用应该没什么不同,至少在Windows平台
: 上是如此。
:
: 普通的定长

avatar
S*I
24
多谢指正。win32上argument的pass,stdcall和cdecl是往stack上push,fastcall和
thiscall是先用寄存器,然后再往stack上push。但是只有cdecl是调用函数clean up
stack,所以参数个数可变的函数调用应该只能是cdecl。

of
in

【在 t****t 的大作中提到】
: as xentar said, this tightly depends on specific ABI used. even on windows
: 32bit, cdecl, stdcall, fastcall, etc. are all different (of course, some of
: them do not support variadic).
: for example, on x86-64/linux, %al will be set to number of registers used in
: variadic function call. although in all conventions, variadic calls must
: let callee to find "..." parameters from the last fixed parameter.

avatar
c*e
25
条件:
1. 主调函数清栈 (强)
2. 右到左压栈 (弱)
这样下来的话只有__cdecl符合条件。
如果从左向右压栈的话就要把参数描述表放在最后,不符合一般习惯。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。