如何在变量参数函数中在堆栈上传递参数?

时间:2012-12-29 21:17:59

标签: c assembly stack

我认为该函数在完成后会从堆栈中删除参数,但像printf这样的函数会在调用时从堆栈中删除可变数量的参数。

如何知道要从堆栈中删除多少参数?是否有一个秘密参数来指定传递多少个参数?

由于

3 个答案:

答案 0 :(得分:4)

C调用约定指定调用者而不是被调用者负责从堆栈中弹出参数。这就是具有可变参数列表的函数必须为cdecl的原因。所以,

  

我认为该函数在完成后会从堆栈中删除参数。

仅适用于某些调用约定,但对于 C调用约定则不然。

  

如何知道要从堆栈中删除多少参数?是否有一个秘密参数来指定传递多少个参数?

它没有,也没有秘密争论。

答案 1 :(得分:1)

调用函数将清理堆栈(使用正确的调用约定)。编译器将为其生成代码。编译器是确切知道你在参数列表中传递了多少个参数的编译器,因为它编译了它..

答案 2 :(得分:0)

调用代码清理堆栈,并且由被调用函数决定是否已经为其想要做的事情传递了“足够”的参数。这不一定是一个论据,它可能是这样的:

int sum(int first, ...)
{
    int s = first;
    int v;
    va_list va;
    va_start(va, first);

    while (v = va_arg(va, int) != -1)
    {
         sum += v;
    }

    va_end(va);
    return sum;
 }



 x = sum(1, 2, 3, -1);
 y = sum(1, 2, 3, 4, 5, 6, 7, 8, 9, -1);        

链接到how many arguments in varargs function