2012-03-21 84 views
1

我需要使用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:增加了“记忆”来揍列表

+0

为什么你需要一个typedef?为什么不简单地声明一个函数指针为'int(* fun_ptr)(int,int,int,int)'= some_func;并称它为fun_ptr(x,y,z,a);'? – 2012-03-21 11:27:01

+0

我通常typedef函数我打电话像:typedef int(__ thiscall * tFunc(void * pThis,...); tFunc pFunc = addr;然后我打电话给它但设置eax和esi我必须使用asm和只是在电话未成功之前设置这两个电话 – user1283078 2012-03-21 18:14:46

回答

2

是这样的 - 我没有测试,但是编译器输出看起来不错,我认为。

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输入约束加载在eaxa1S负荷a2esi 剩下的只是推动其他参数。

+0

感谢您的回答Willem! 它给了我一个很好的想法,它的样子可能会如何,您的解释也指向了一些有趣的阅读的正确方向,我有点不知所措通过 之前的语法看你的例子。 – user1283078 2012-03-21 18:06:28

相关问题