из википедии пролог и эпилог функции:
В программировании на ассемблере пролог функции представляет собой несколько строк кода в начале функции, которые подготавливают стеки регистры для использования в функции.Точно так же эпилог функции появляется в конце функции и восстанавливает стек и регистры в состояние, в котором они находились до вызова функции.
Чтобы компилятор не генерировал автоматическидополнительный код внутри вашей функции, всегда объявляйте функцию, используя соглашение __declspec(naked)
.
давайте посмотрим на эту функцию:
void myTrampoline()
{
__asm {
PUSHFD
PUSHAD
CALL jumpHookCallback
POPAD
POPFD
POP EAX
MOV AL, 1
POP EDI
POP ESI
JMP [restoreJumpHook]
}
}
теперь компилятор сгенерирует код, который манипулируеткадр стека функции, называемой прологом и эпилогом функции, и результат будет выглядеть следующим образом
;Prologue
push ebp
mov ebp, esp
sub esp, N
PUSHFD
PUSHAD
CALL jumpHookCallback
POPAD
POPFD
POP EAX
MOV AL, 1
POP EDI
POP ESI
JMP [restoreJumpHook]
;Epilogue
mov esp, ebp
pop ebp
ret
, но если мы используем __declspec(naked)
, не будет Prologue
нет Epilogue
void __declspec(naked) myTrampoline()
{
__asm {
PUSHFD
PUSHAD
CALL jumpHookCallback
POPAD
POPFD
POP EAX
MOV AL, 1
POP EDI
POP ESI
JMP [restoreJumpHook]
}
}
и результат будет выглядеть так:
PUSHFD
PUSHAD
CALL jumpHookCallback
POPAD
POPFD
POP EAX
MOV AL, 1
POP EDI
POP ESI
JMP [restoreJumpHook]