Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;自定义呼叫约定_C++_Assembly_Calling Convention - Fatal编程技术网

C++ C++;自定义呼叫约定

C++ C++;自定义呼叫约定,c++,assembly,calling-convention,C++,Assembly,Calling Convention,当逆向工程时,我遇到了一个非常奇怪的程序,它使用一个调用约定,在eax中传递一个参数(非常奇怪的编译器??)。我现在想调用那个函数,但我不知道如何声明它,IDA将它定义为 bool __usercall foo<ax>(int param1<eax>, int param2); bool\uuu用户调用foo(int-param1,int-param2); 其中,param1在eax寄存器中传递。我试过类似的东西 bool MyFoo(int param1, int

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

bool __usercall foo<ax>(int param1<eax>, int param2);
bool\uuu用户调用foo(int-param1,int-param2);
其中,param1在eax寄存器中传递。我试过类似的东西

bool MyFoo(int param1, int param2) 
{
    __asm mov eax, param1;
    return  reinterpret_cast<bool(__stdcall *)(int)>(g_FooAddress)(param2);
}
boolmyfoo(int-param1,int-param2)
{
__asm mov eax,参数1;
返回reinterpret_cast(g_foodAddress)(参数2);
}
然而,不幸的是,我的编译器在堆栈上推送param2时使用了eax寄存器,有没有办法在不使用内联汇编程序编写整个调用的情况下使其干净?(如果有必要,我使用的是Visual Studio)

有一些“正常”的调用约定,它们通过寄存器传递参数。例如,如果您使用的是MSVC

您不能定义自己的调用约定,但我建议您创建一个包装函数,该函数通过内联程序集进行自己的调用/清理。这可能是实现这一效果最实际的方法,不过您也可以通过使用uu fastcall,进行一点寄存器交换,然后
jmp
到正确的函数来更快地实现这一效果


调用约定不仅仅是参数传递,因此选项#1可能是最好的,因为您可以完全控制调用方的行为。

我知道,但MSVC fastcall使用ECX+EDX而不是EAX,因此我不需要它:-(谢谢你,正如你所建议的,我求助于内联汇编程序,我首先认为你几乎总是可以避免内联汇编程序。这是我遇到的第一个你不能避免的情况。