我需要使用gcc调用函数指针,我不能在C++中输入。我不擅长asm,所以我会很感激你的帮助。如何用eax和esi中的参数调用函数。 gcc c + +
该函数将esg中的arg1和arg2传递给esi。 ARG游戏推从右到左,主叫方清理堆栈
signed int __usercall o_Fkt<eax>(int a1<eax>, int a2<esi>, int a3, int a4, int a5)
编辑: 感谢威廉。我不得不调用成功,它是这样的:
int callfn(void* a1, void* a2, int a3, int a4, void* a5)
{
int result;
unsigned long fktAddr = 0x0092FE40;
__asm volatile(
"push %[a5]\n\t"
"push %[a4]\n\t"
"push %[a3]\n\t"
"call edx\n\t"
"add esp, 12"
: "=a" (result)
: "d" (fktAddr), "a" (a1), "S" (a2) , [a5] "r" (a5), [a4] "r" (a4), [a3] "r" (a3)
: "memory"
);
return result;
}
EDIT2:增加了“记忆”来揍列表
为什么你需要一个typedef?为什么不简单地声明一个函数指针为'int(* fun_ptr)(int,int,int,int)'= some_func;并称它为fun_ptr(x,y,z,a);'? – 2012-03-21 11:27:01
我通常typedef函数我打电话像:typedef int(__ thiscall * tFunc(void * pThis,...); tFunc pFunc = addr;然后我打电话给它但设置eax和esi我必须使用asm和只是在电话未成功之前设置这两个电话 – user1283078 2012-03-21 18:14:46