如何在 EAX 和 ESI 中使用参数调用函数.GCC C++



我需要使用 gcc 调用一个函数指针,而我无法在 c++ 中键入定义。我不擅长 asm,所以我会感谢您的帮助。

该函数在 eax 中传递 arg1,在 esi 中传递 arg2。 args 从右向左推送,调用方清理堆栈

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]nt"
                "push %[a4]nt"
                "push %[a3]nt"
                "call edxnt"
                "add esp, 12"
                : "=a" (result)
                :  "d" (fktAddr), "a" (a1), "S" (a2) , [a5] "r" (a5), [a4] "r" (a4), [a3] "r" (a3)
                : "memory"
        );
        return result;
    }

edit2:将"内存"添加到 clobber 列表中

像这样的东西 - 我没有测试它,但我认为编译器输出看起来不错。

int oFkt(int a1);
int callfn(int a1, int a2, int a3, int a4, int a5)
{
    int result;
    __asm (
            "push %[a5]nt"
            "push %[a4]nt"
            "push %[a3]nt"
            "call oFktnt"
            "add  esp, 12"
            : "=a" (result)
            : "a" (a1), "S" (a2), [a5] "r" (a5), [a4] "r" (a4), [a3] "r" (a3)
    );
    return result;
}

=a输出约束导致返回值复制到resulta输入约束加载a1 eaxS加载a2 esi其余的只是推动其他论点。

相关内容

最新更新