Я пытаюсь реализовать this inline assembly trick, чтобы получить значение EIP в C++ Builder. Следующий код работает в режиме деблокирования:C++ Builder - реализовать целую функцию в сборке
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
однако в режиме выпуска код:
mov eax,[esp]
ret
Конечно, я мог бы использовать #ifdef NDEBUG
работать вокруг проблемы; однако есть ли какой-либо синтаксис, который я могу использовать, чтобы указать, что вся функция находится в сборке, и компилятор не должен вставлять данные push ebp
? (или иначе решить эту проблему).
В режиме отладки фреймы стека включены по умолчанию. В режиме Release фреймы стека по умолчанию отключены. В настройках проекта есть настройка для управления этим. –