如何在内联 ASM 中调用此函数? (MSVC++)
How do I call this function in inline ASM? (MSVC++)
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
你交换了 ecx
和 edx
:你的 func 签名写着 a1<edx>
但你把 a1
放到 ecx
和 a2
到edx
.
此外:在推送 a3
之后,a4
的 esp
相对偏移量增加了 4 个字节。在推送 a4
之后,a5
的 esp
相对偏移量变得更远 8 个字节,依此类推...(所以正确的偏移量是:a4
:[esp+20]
, a5
: [esp+28]
, a6
: [esp+36]
)
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
你交换了 ecx
和 edx
:你的 func 签名写着 a1<edx>
但你把 a1
放到 ecx
和 a2
到edx
.
此外:在推送 a3
之后,a4
的 esp
相对偏移量增加了 4 个字节。在推送 a4
之后,a5
的 esp
相对偏移量变得更远 8 个字节,依此类推...(所以正确的偏移量是:a4
:[esp+20]
, a5
: [esp+28]
, a6
: [esp+36]
)