现在,我正在设计一个函数f(index,...)
,它将调用函数数组中的 #index 条目,并传递其余参数。如果您将函数数组视为服务列表,则f
的作用类似于服务分配器。
f
是用汇编编写的。它将弹出第一个参数index
,然后计算相应的目标函数地址并为其 jmp 。
如果我将n
参数传递给f
,则从目标函数返回时,堆栈仅保存n-1
个参数,因为index
在中间弹出。因此,我无法使用cdecl
约定,否则调用者将错误地清除n
参数的堆栈。
stdcall
应该可以。但是问题在于,由于f
具有可变参数,因此gcc似乎__attribute__((stdcall)) f(index,...)
不合理,并将其还原为cdecl
。
所以请问任何人可以告诉我如何声明f
为stdcall
吗?
答案 0 :(得分:0)
我认为使用stdcall不会解决您的问题,因为无论如何您都必须还原堆栈才能让函数在堆栈上找到返回地址。
与其将Spam
从堆栈中弹出,不如直接将其保留在那里。要么修改目标函数以忽略第一个参数,要么在调用目标函数之前将所有其他参数向左移动一个位置