Без __ declspec (naked) ваш компилятор отвечает за правильную обработку соглашения о вызовах (размещение входных аргументов в стеке, «резервирование» пространства для локальных переменных и т. Д.).В некоторых случаях вы можете сделать это самостоятельно.
Например - без __ declspec (голый) первые 3 (пролог) и последние 3 (эпилог) инструкции ниже будут предоставлены вашим компилятором (при условии cdecl используется соглашение о вызовах).
__declspec(naked) void func(inta, intb, int c, intd)
{
_asm{
push ebp
mov ebp, esp
sub esp, 8 // for 2 local int(32bit) variables - if you need it of course
mov dword ptr[ebp-4], 3 // set one local var to 3
mov dword ptr[ebp-8], 4 // set one local var to 4
mov eax, dword ptr [ebp+8] // a
mov ebx, dword ptr [ebp+12] // b
mov ecx, dword ptr [ebp+16] // c
mov edx, dword ptr [ebp+20] // d
add esp, 8 // remove space for local vars
mov esp, ebp
pop ebp
ret
}
}
теперь вы можете вызывать эту подпрограмму из кода C / C ++ следующим образом:
func(0xAA, 0xBB, 0xCC, 0xDD);
, который станет:
push 0DDh
push 0CCh
push 0BBh
push 0AAh
call func
КСТАТИ - аргументы помещаются в обратном порядке (по сравнению с порядком, найденным при вызове функции), чтобы позволить функциям переменной длины работать