Мне вот такую темку дали: Нужно рассказать о том, как по дизассемблерному листингу можно идентифицировать указанные конструкции. Как это делает Olly и IDA. Привести примеры идентификации. Желательно рассмотреть 2 компилятора Си: MS VC++ и gcc для win32. Если хватит желания, то еще и борландовский от Builder c++. вот чето я не могу понять как это сделать именно как идентифицировать их? статьи http://www.wasm.ru/article.php?article=1009002 как я понял не это совсем то...
ну скомпильте попроще примеры с дебуг инфой, да и посмотрите. только, компильте без оптимизации. с хорошей оптимизацией вы и функции отдельные можете не идентифицировать
BattleWIZ На сайте wasm.ru полно статей, в том числе статьи Криса Касперски Идентификация IF - THEN - ELSE Идентификация SWITCH - CASE - BREAK Идентификация циклов Но это неполные версии, в полных журнальных статьях как раз сравнивается, как аналогичные конструкции представляют разные компиляторы. А на самом деле последуйте совету qqwe компилируйте программу MS VC++ и gcc и посмотрите через Olly во что этот код превращается
BattleWIZ Если не секрет, кто вам такие темы даёт и где? =) По идентификации конструкций всё довольно просто - слежение за сравнениями, флагами и передачей управления, у Криса действительно неплохо разобрано. >>вот чето я не могу понять как это сделать именно как идентифицировать их? что непонятного то? Берете дизасм, и проходите по коду, ища нужные вам инструкции. Mikl___ Гым, я наверное довольно невнимательный, но помоему в русскоязычных источниках кроме Криса эту задачу никто не рассматривал. Или я ошибаюсь?
izlesa Я о статьях Криса на http://www.insidepro.com/rus/doc.shtml "Мощь и беспомощность автоматической оптимизации", "С-шные трюки от мыщъх'а", "Война миров: Ассемблер против Cи" и другие
А про таблицу переходов кто что может сказать? а то не которые компиляторы их генерирует и как то они связаны с идентификацией ...
Когда значения switch/case идут подряд, компилятор может использовать таблицу переходов. Например, для такого кода: Код (Text): switch(var) { case 0: do_something0; case 1: do_something1; case 2: do_something2; case 3: do_something3; case 4: do_something4; } компилятор может сделать что-то в духе: Код (Text): mov eax, [var] cmp eax, 0x4 ja .done_everything jmp [table + eax * 4] do_something0: ... jmp .done_everything do_something1: ... jmp .done_everything do_something2: ... jmp .done_everything do_something3: ... jmp .done_everything do_something4: ... .done_everything: ... table: dd do_something0 dd do_something1 dd do_something2 dd do_something3 dd do_something4 В IDA, кстати, эти переходы всегда легко узнаваемы.
Так, ну там, конечно, в коде должно быть 'do_something0, do_something1'. Редактирование бы вернуть...
Пирогов "Ассемблер и дизассемблирование": рассмотрены условные конструкции, циклы и т.д., написанные на ЯВУ, и как их "переваривает" ассемблер. IMHO тема, поднятая ТС, как раз и перекликается с этой книгой