2014-11-12 3 views
1

Я пытаюсь реализовать 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? (или иначе решить эту проблему).

+1

В режиме отладки фреймы стека включены по умолчанию. В режиме Release фреймы стека по умолчанию отключены. В настройках проекта есть настройка для управления этим. –

ответ

3

Вы попробовали __declspec(naked)?

__declspec(naked) unsigned long get_eip() 
{ 
    asm { mov eax, [esp] } 
} 
+0

Это сработало после того, как я изменил его на 'asm {mov eax, [esp]; ret} '- в противном случае он провалился до того, что был следующий код! –

Смежные вопросы