我有像这样的代码段
void foo(int i, int j)
{
std::cout << i << " , " << std::endl;
}
void bar()
{
void (*ffptr)(int, int);
ffptr = &foo;
__asm push 100
__asm push 318
void* faddr = (void*)ffptr;
((void(*)())faddr)();
}
我需要通过C / C ++代码段替换它们来摆脱这个Visual Studio特定的汇编代码。使用任何特定于OS的调用无关紧要。但是,我不再需要汇编代码了。
应该在x86和x64上编译和处理代码。
你能帮我吗?我对这些装配的东西如此新颖,我不想应付。任何评论将不胜感激。P.S
我不允许更改功能调用行。我需要在函数调用之前将参数放在堆栈上,函数调用应该是通用的。
答案 0 :(得分:1)
我谨说你已经简化了一个功能,其中有许多不同的功能,每个功能都有它自己的签名。
绝对没有办法在不改变实际调用行的情况下解决这个问题(好吧,没有得到不同的编译器,即使这样它也不太可能工作)。请注意,x86_64没有在堆栈上传递参数,因此您需要将值加载到正确的寄存器中。
您可以通过一般方式解决问题,而不是强制转换为单个函数类型,实际上转换为您真正想要的函数类型。
E.g。
void foo(int i, int j)
{
std::cout << i << " , " << j << std::endl;
}
void foo2(float i, char *j)
{
std::cout << i << " , " << j << std::endl;
}
[顺便说一句,在上面的j
输出中添加,以使其更清晰]
void bar()
{
void* faddr;
int type;
if (something)
{
void (*ffptr)(int, int);
ffptr = &foo1;
faddr = (void*)ffptr;
type = 1;
}
else
{
void (*ffptr)(float, char*);
ffptr = &foo2;
faddr = (void*)ffptr;
type = 2;
}
....
switch(type)
{
case 1:
(void (*)(int, int)faddr)(100,318);
break;
case 2:
(void (*)(float, char*)faddr)(7.2,"hello");
break;
}
}
我不相信这是解决整个问题的正确解决办法,而不同的重写可能是解决这个问题的实际正确方法。但是,如果没有看到整个代码,很难确定什么是正确的解决方案。