计算机如何知道将遵循多少参数?

时间:2011-03-30 01:25:07

标签: assembly prototype x86 stack variadic-functions

计算机如何知道将遵循多少参数?

我们以相反的顺序放置参数

因为有一些printf函数

采用未定义数量的参数。

如果是pritnf,计算机可以知道将遵循多少个参数。

如果格式字符串包含“%s,hello,welcome to%s”,那么只需再阅读2个参数。

但计算机怎么知道什么时候

这样的原型看起来像

int func(int a,int b,...)?

有人可以在集会层面解释我吗?

感谢

2 个答案:

答案 0 :(得分:1)

答案是没有。大多数编译器所基于的ANSI C89标准没有定义任何方法来检测指定的参数类型。 printf()起作用,因为它有一个格式字符串,它确切地指定了指定了哪些参数及其类型。您必须以某种方式知道传递的内容并相应地使用stdarg.h中的va_ *宏。 ANSI C89标准草案的第4.8节简单地说,如果您从实际传递的内容中请求不正确的类型或不正确的参数数量,则行为是未定义的。

阅读本文以获取ANSI C89草案中的血腥细节: http://flash-gordon.me.uk/ansi.c.txt

答案 1 :(得分:1)

没有。您可以printf("%d"),它只会打印它在堆栈中找到的任何内容。 (程序员)应该知道函数在调用和写入时需要多少个参数。如果您不确定,可以编写具有其他参数数量作为第一个参数的函数 在装配级别,没有任何变化。参数始终位于ebp之前(它们之前被推过,但它们的地址高于ebp,因此它们在某种意义上来自ebp + 8(第一个参数)。如果您知道自己的int func(int a, int b, ...)需要43个参数,则可以从ebp + 8ebp + 0x160找到它们(假设它们都是int s)(0x160 = 352dec = 8) + 43 * 4)。
当然,错误的参数数量可能会导致程序崩溃或行为异常(如printf("%s")