Ассемблирование без секретов

классический пример


Как нам откомпилировать? И главное во что? На самостоятельную программу оно как-то не тянет… А давайте попробуем заточить ассемблерную вставку? В большинстве Си компиляторов она оформляется как: "__asm{…ассемблерный код…}", однако, непосредственно осуществить этот замысел не получится! Ведь наш "подопечный" ассемблерный листинг, как и большинство других демонстрационных прогарам, содранных с наглядно-агитационных пособий, представляет собой нечто промежуточное между псевдокодом и рабочей программой.

Во-первых, метка debugger_is_present не определена и вставлена чисто для наглядности, во-вторых, установить обработчик структурных исключений мы установили, флаг трассировки — взвели, а вот о том, что после завершения проверки на отладчик все необходимо вернуть обратно — забыли! Поэтому, перед употреблением, листинг необходимо слегка доработать, например, так:

main()

{

       int a;                     // через эту переменную мы возвратим значение eax

__asm{                            // ассемблерная вставка — начало

       push offset my_seh

       push dword ptr fs:[0]

       mov fs:[0],esp

      

       pushf

       or dword ptr[esp],100h ;set trap flag

       popf

      

       xor eax,eax

my_seh:

       pop dword ptr fs:[0]       ; восстанавливаем старый обработчик

       add esp,4                  ; восстанавливаем стек

      

       mov a,eax                  ; возвращаем результат в переменной а

       }                           ; ассемблерная вставка - конец

       // проверка переменной a на равенство нулю

       printf("%s\n",a?"no debugger":"under debugger");

}



Содержание раздела