如何摆脱这个汇编代码?

时间:2014-06-20 06:32:45

标签: 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(*)())faddr)();
}

我需要通过C / C ++代码段替换它们来摆脱这个Visual Studio特定的汇编代码。使用任何特定于OS的调用无关紧要。但是,我不再需要汇编代码了。

应该在x86和x64上编译和处理代码。

你能帮我吗?我对这些装配的东西如此新颖,我不想应付。任何评论将不胜感激。

P.S

我不允许更改功能调用行。我需要在函数调用之前将参数放在堆栈上,函数调用应该是通用的。

1 个答案:

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

我不相信这是解决整个问题的正确解决办法,而不同的重写可能是解决这个问题的实际正确方法。但是,如果没有看到整个代码,很难确定什么是正确的解决方案。