如何用eax和esi中的参数调用函数。 gcc c + +
问题描述:
我需要使用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:增加了“记忆”来揍列表
答
是这样的 - 我没有测试,但是编译器输出看起来不错,我认为。
int oFkt(int a1);
int callfn(int a1, int a2, int a3, int a4, int a5)
{
int result;
__asm (
"push %[a5]\n\t"
"push %[a4]\n\t"
"push %[a3]\n\t"
"call oFkt\n\t"
"add esp, 12"
: "=a" (result)
: "a" (a1), "S" (a2), [a5] "r" (a5), [a4] "r" (a4), [a3] "r" (a3)
);
return result;
}
的=a
输出的制约导致的返回值被复制到result
, 的a
输入约束加载在eax
a1
和S
负荷a2
到esi
剩下的只是推动其他参数。
+0
感谢您的回答Willem! 它给了我一个很好的想法,它的样子可能会如何,您的解释也指向了一些有趣的阅读的正确方向,我有点不知所措通过 之前的语法看你的例子。 – user1283078 2012-03-21 18:06:28
为什么你需要一个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