Я пытаюсь перенести функцию-оболочку с 32-битной на x86-64 asm для Windows ABI. Функция зависит от индексации своих аргументов в виде массива.
Я знаю, что MSVC не может выполнять встроенную сборку в проектах X64, но мне интересно встроить эквивалентную функцию в файл X64 .asm.
Функция устанавливает фрейм стека для вызова API.
__declspec( naked ) PVOID WINAPIV CGX86( FARPROC lpPtr, UINT lpSize, ... )
{
__asm {
push ebp;
mov ebp, esp;
lea eax, [ ebp + 0x04 ];
mov [ ebp - 0x04 ], eax;
mov eax, [ ebp - 0x04 ];
mov ecx, [ ebp + 0x0C ];
add ecx, 2;
ParseArgs:
cmp ecx, 2;
jz short MoveFinal;
push dword ptr [ eax + ecx * 0x04 ];
sub ecx, 1;
jmp short ParseArgs;
MoveFinal:
call [ ebp + 0x08 ];
mov esp, ebp;
pop ebp;
retn;
}
}
пример использования:
CGX86( ( FARPROC )MessageBoxA, 4, GetForegroundWindow( ), "BODY", "TITLE", MB_OK );
ecx=3
, который даетeax+3*4
, а этоebp+16
. Однако я не понимаю целиpush ecx
. - person Jester   schedule 26.04.2016mov [ ebp - 0x04 ], eax;
mov eax, [ ebp - 0x04 ];
, но решил удалить все это. - person Michael Petch   schedule 26.04.2016switch
избавится от ассемблерного кода. - person Jester   schedule 26.04.2016.asm
, а не в строке. - person Peter Cordes   schedule 26.04.2016MessageBoxA(GetForegroundWindow(), "BODY", "TITLE", MB_OK)
) является лучшим выбором. Итак, вопрос в том, какую проблему на самом деле решает эта функция? - person Ross Ridge   schedule 26.04.2016