Автор: Trianon (21.01.2007 в 20:39)
Обычно дизассемблер пишут по тому же двупроходному принципу, что и ассемблер.
На первом проходе для каждой команды выполняется анализ кодового потока, выделение кода операции, режимов адресации, и определение явно заданных адресов и смещений. Адреса и смещения добавляются в таблицу символов. На втором проходе помимо этих этапов выполняется собственно генерация кода, т.е. построение мнемонического вида команды с использованием данных, накопленных в таблице символов.
Если данные и код в исходном потоке идут внавал (что для современного кода не специфично), а не по секциям, то добавляется еще и анализ перекрестных ссылок и устранение данных из потока кода.
Декомпиляторы пишут обычно не с машинного кода а с промежуточных байт-кодовых языков.
В принципе, суть та же. Разве что вложенные структуры кода оформляются составными операторами, а не командами условнго.безусловного переходов....
В любом случае практически для любого реального процессора дизассемблер всяко простейшим не будет. А уж декомпилятор и подавно.