如何声明带有可变参数的函数为stdcall?

时间:2018-07-29 19:08:46

标签: c gcc calling-convention stdcall

现在,我正在设计一个函数f(index,...),它将调用函数数组中的 #index 条目,并传递其余参数。如果您将函数数组视为服务列表,则f的作用类似于服务分配器。

f是用汇编编写的。它将弹出第一个参数index,然后计算相应的目标函数地址并为其 jmp

如果我将n参数传递给f,则从目标函数返回时,堆栈仅保存n-1个参数,因为index在中间弹出。因此,我无法使用cdecl约定,否则调用者将错误地清除n参数的堆栈。

stdcall应该可以。但是问题在于,由于f具有可变参数,因此gcc似乎__attribute__((stdcall)) f(index,...)不合理,并将其还原为cdecl

所以请问任何人可以告诉我如何声明fstdcall吗?

1 个答案:

答案 0 :(得分:0)

我认为使用stdcall不会解决您的问题,因为无论如何您都必须还原堆栈才能让函数在堆栈上找到返回地址。

与其将Spam从堆栈中弹出,不如直接将其保留在那里。要么修改目标函数以忽略第一个参数,要么在调用目标函数之前将所有其他参数向左移动一个位置