我需要使用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