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;
    }
}