我试图简单地将控件从一个函数传递给另一个函数。例如,每次调用函数first
时,我都希望使用相同的参数调用函数second
。
问题是:我不知道传递了多少个参数,它们的类型或返回类型。为什么?我正在尝试在Windows上使用MingW编写DLL包装器。因此,在这种情况下,first
是库中的符号,second
是我的函数。我知道DLL符号,但不知道它们的原型。
我认为在C中编写second
并且汇编中的以下代码就足够了:
_first:
jmp _second
或者也许:
_first:
call _second
ret
但是在调用first
时它只会给我一个分段错误。
答案 0 :(得分:2)
感谢@Deduplicator评论,这是最终有效的代码:
int first()
{
__builtin_return(
__builtin_apply(
(void(*)())second, __builtin_apply_args(), 512));
}
为什么是512?我不确定。手册说
计算适当的大小值并不总是很简单。 __builtin_apply使用该值来计算应该在堆栈上推送并从传入参数区域复制的数据量。
如果有人知道如何更好地估算尺寸,请告诉我并编辑答案。
答案 1 :(得分:0)
你理想的是裸函数,即编译器不添加模板代码(操纵堆栈帧)的函数。不幸的是,似乎没有直接支持GCC中的裸功能(在MSVC中)。好消息是,下面列出了一种虽然稍微复杂的解决方法。
http://gynvael.coldwind.pl/?id=15
您可以做的其他事情是明确保留所有寄存器值。但是,访问参数会变得稍微复杂一些,因为您必须首先查看反汇编,然后相应地更新_second
以访问任何参数。
_first:
pushad
call _second
popad
ret