как вызвать функцию с параметрами в eax и esi.gcc c ++ - PullRequest
1 голос
/ 21 марта 2012

Мне нужно вызвать указатель на функцию, используя gcc, что я не могу набрать определение в c ++.Я не очень хорош в asm, поэтому буду признателен за вашу помощь.

Функция передает arg1 в eax и arg2 в esi.Аргументы перемещаются справа налево, и вызывающая сторона очищает стек

signed int __usercall o_Fkt<eax>(int a1<eax>, int a2<esi>, int a3, int a4, int a5)

. edit: Спасибо, Виллем.Я успешно назвал это следующим образом:

    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: добавлен "memory" в список клоббера

1 Ответ

2 голосов
/ 21 марта 2012

как-то так - я не проверял это, но вывод компилятора выглядит нормально, я думаю.

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, остальное просто выдвигает другие аргументы.

...