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] }
}
Другие вопросы по тегам