C ++自定义调用约定

时间:2011-10-07 20:27:52

标签: c++ assembly calling-convention

虽然逆向工程我遇到了一个非常奇怪的程序,它使用一个在eax中传递一个参数的调用约定(非常奇怪的编译器??)。我想现在调用该函数,我不知道如何声明它,IDA将其定义为

bool __usercall foo<ax>(int param1<eax>, int param2);

其中param1在eax寄存器中传递。我试过像

这样的东西
bool MyFoo(int param1, int param2) 
{
    __asm mov eax, param1;
    return  reinterpret_cast<bool(__stdcall *)(int)>(g_FooAddress)(param2);
}

然而,不幸的是,我的编译器在堆栈上推送param2时使用了eax寄存器,有没有什么方法可以在不使用内联汇编程序编写整个调用的情况下使其干净? (如果重要的话,我正在使用Visual Studio)

1 个答案:

答案 0 :(得分:2)

有“普通”调用约定通过寄存器传递参数。如果您使用MSVC,例如__fastcall

http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall

您无法定义自己的调用约定,但我建议您创建一个包装函数,它通过内联汇编执行自己的调用/清理。这可能是实现这种效果最实用的,尽管你也可以通过使用__fastcall,进行一些寄存器交换,然后jmp到正确的函数来更快地完成它。

调用约定比通过参数更多,所以选项#1可能是最好的,因为你可以完全控制调用者的行为。