- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
// https://github.com/dotnet/coreclr/blob/a9f3fc16483eecfc47fb79c362811d870be02249/src/vm/i386/cgenx86.cpp#L1613
PCODE DynamicHelpers::CreateHelperWithTwoArgs(LoaderAllocator * pAllocator, TADDR arg, TADDR arg2, PCODE target)
{
#ifdef UNIX_X86_ABI
BEGIN_DYNAMIC_HELPER_EMIT(23);
#else
BEGIN_DYNAMIC_HELPER_EMIT(17);
#endif
#ifdef UNIX_X86_ABI
// sub esp, 4
*p++ = 0x83;
*p++ = 0xec;
*p++ = 0x4;
#else
// pop eax
*p++ = 0x58;
#endif
// push arg
*p++ = 0x68;
*(INT32 *)p = arg;
p += 4;
// push arg2
*p++ = 0x68;
*(INT32 *)p = arg2;
p += 4;
#ifdef UNIX_X86_ABI
// mov eax, target
*p++ = 0xB8;
*(INT32 *)p = target;
p += 4;
#else
// push eax
*p++ = 0x50;
#endif
*p++ = X86_INSTR_JMP_REL32; // jmp rel32
#ifdef UNIX_X86_ABI
*(INT32 *)p = rel32UsingJumpStub((INT32 *)p, (PCODE)DynamicHelperArgsStub);
#else
*(INT32 *)p = rel32UsingJumpStub((INT32 *)p, target);
#endif
p += 4;
END_DYNAMIC_HELPER_EMIT();
}
Follow us!