2012-03-21 82 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

相關問題