C++Builder - реализовать всю функцию в сборке
Я пытаюсь реализовать этот трюк встроенной сборки, чтобы получить значение EIP в C++Builder. Следующий код работает в режиме Release:
unsigned long get_eip()
{
asm { mov eax, [esp] }
}
однако это не работает в режиме отладки. В режиме отладки код должен быть изменен на это:
unsigned long get_eip()
{
asm { mov eax, [esp+4] }
}
Осматривая сгенерированную сборку; разница в том, что в режиме отладки код, сгенерированный для get_eip()
Функция (первая версия):
push ebp
mov ebp,esp
mov eax,[esp]
pop ebp
ret
однако в режиме Release код:
mov eax,[esp]
ret
Конечно, я мог бы использовать #ifdef NDEBUG
обойти проблему; однако есть ли синтаксис, который я могу использовать, чтобы указать, что вся функция находится в сборке, и компилятор не должен вставлять push ebp
материал? (или иначе решить эту проблему).
1 ответ
Решение
Вы пробовали __declspec(голый)?
__declspec(naked) unsigned long get_eip()
{
asm { mov eax, [esp] }
}