如何在内联ASM中调用此函数? (MSVC ++)

时间:2015-08-31 21:48:12

标签: c++ assembly inline calling-convention

void __usercall sub_101A7850@<eax>(int a1@<edx>, int a2@<ecx>, int a3, int a4, int a5, int a6)

我的第一次尝试(崩溃):

__declspec(naked) void __stdcall callit(const int& a1, const int& a2, unsigned int a3, const int *a4, int a5, int *a6)
    {
        // void __usercall sub_101A7850@<eax>(int a1@<edx>, int a2@<ecx>, int a3, int a4, int a5, int a6)
        __asm
        {
            mov ecx, [esp + 4] // a1
            mov edx, [esp + 8] // a2
            push [esp + 12] // a3
            push [esp + 16] // a4
            push [esp + 20] // a5
            push [esp + 24] // a6
            call funcaddr
            retn 24
        }
    }

我已验证funcaddr有效。很确定它是一个__fastcall

1 个答案:

答案 0 :(得分:2)

您已交换ecxedx:您的func签名为a1<edx>,但您将a1置于ecxa2至{{ 1}}。

此外:在推送edx之后,a3的{​​{1}}相对偏移变为更远的4个字节。推送esp后,a4的{​​{1}}相对偏移量变为8个字节更远,依此类推......(因此正确的偏移量为:a4espa5a4[esp+20]a5

相关问题