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

标签 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

最佳答案

您已兑换ecxedx :你的 func 签名说 a1<edx>但是你把a1进入ecxa2edx .

此外:推送后a3 esp a4 的相对偏移量变得更远 4 个字节。推后a4 esp a5 的相对偏移量变成 8 个字节,依此类推...(所以正确的偏移量是:a4 : [esp+20] , a5 : [esp+28] , a6 : [esp+36] )

关于c++ - 如何在内联 ASM 中调用此函数? (MSVC++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32320481/

相关文章:

c++ - shark3.0 的 "BOOST_DIR NOT FOUND"在 win7 x64 操作系统下使用 boost1.54.0 和 cmake

c++ - 模板函数的实例化

c - 访问 main 之后定义的函数

assembly - 从Rust更改x86中的执行堆栈

c++ - 我是否需要 .CPP 文件?仅使用 header 并使所有内容内联?

c++ - 如何刻意内联所有指定的STL代码?

内联汇编 对于 "Illegal instruction (core dumped)"我该怎么办

c++ - 卸载 CEF 崩溃

c++ - CMake如何选择gcc和g++进行编译?

c - C库如何调用内核系统调用