Что не так с этой оболочкой __usercall? - PullRequest
0 голосов
/ 05 ноября 2010
/*
 * Wrapper from
 * int func(int a, int b, int c, unsigned int d, signed int e);
 * to
 * int __usercall func<eax>(int a<eax>, int b<ecx>, int c, unsigned int d, signed int e);
 */
int func(int a, int b, int c, unsigned int d, signed int e)
{
    __asm
    {       
        push e
        push d
        push c
        mov ecx, b
        mov eax, a
        call __usercall_func // access violation somewhere inside here
        add esp, 12
    }
}

1 Ответ

1 голос
/ 05 ноября 2010

Вы не можете выполнить ret самостоятельно из встроенного блока asm, потому что вы не знаете, что внешняя функция сделала с указателем стека. Вместо этого вам нужно сделать так, чтобы ассемблерный код оставлял возвращаемое значение в локальной переменной, которую функция-обертка может вернуть с помощью обычного оператора C return.

Вам также, вероятно, нужно исправить указатель стека после возврата из __usercall_func, если только он не использует извращенное соглашение о вызовах, когда он выталкивает свои собственные параметры из стека.

...