Как вызвать функцию с параметрами в eax и esi. gcc C++
Мне нужно вызвать указатель на функцию, используя gcc, что я не могу typedef в C++. Я не очень хорош в АСМ, поэтому я был бы признателен за вашу помощь.
Функция передает arg1 в eax и arg2 в esi. аргументы помещаются справа налево, и вызывающая сторона очищает стек
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: добавлен "память" в список клоббер
1 ответ
Как -то так - я не проверял, но вывод компилятора выглядит нормально, я думаю.
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
нагрузка на входные ограничения a1
в eax
, а также S
грузы a2
в esi
остальное просто выдвигает другие аргументы.