C++ 如何摆脱这个汇编代码?
我有一个这样的代码段C++ 如何摆脱这个汇编代码?,c++,c,C++,C,我有一个这样的代码段 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(*)())
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)();
}
void foo(inti,intj)
{
我猜你已经简化了一个函数,其中有许多不同的函数,每个函数都有自己的签名
在不更改实际调用行的情况下,绝对无法修复此问题(嗯,不使用其他编译器,即使这样也不太可能工作)。请注意,x86_64没有在堆栈上传递参数,因此需要将值加载到正确的寄存器中
您可以通过一种通用的方式解决问题,方法是不强制转换为单个函数类型,而是实际转换为您真正想要的函数类型
例如
我不相信这是解决整个问题的正确方法,而另一种重写可能是解决这个问题的真正正确方法。但是如果没有看到整个代码,就很难确定什么是正确的解决方案。um,foo(318100)?我可能因为没有涉足汇编而把事情搞糟了,但是……C++没有任何与它的堆栈一起拧紧的工具。为什么你不能修复调用线?提供一个明智的解释,它可能给我们一些可以帮助你的见解。“我不允许更改函数调用线……”-为什么不允许您更改该行?@SargiEran它只适用于某些调用约定,x86有很多您所说的“转换”是什么意思?如果您指的是调用约定,那么cup提到了其中的两个:\uuuuu cdecl,\uu stdcall。您可以阅读其余的内容
void foo(int i, int j)
{
std::cout << i << " , " << j << std::endl;
}
void foo2(float i, char *j)
{
std::cout << i << " , " << j << std::endl;
}
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;
}
}