Я пытаюсь написать дизассемблер для двоичных файлов Mindstorms EV3 VM, желательно на Python, так как я очень хорошо с ним знаком. У меня есть документы с подробным описанием набора инструкций, кодов операций, параметров, типов данных и т. д., а именно доступно здесь, но у меня возникли проблемы с созданием собственно дизассемблер оттуда.
Насколько я понимаю, написание дизассемблера мало чем отличается от написания компилятора в том смысле, что это просто прославленный детерминированный конечный автомат. Однако, помимо этого, я не могу найти никаких книг или руководств по его написанию. Я пытался использовать инструменты для написания компиляторов, такие как Lex и Yacc (или в python PLY), однако все эти инструменты каким-то образом меня не устраивают.
Комбинация Lex и Yacc, похоже, не то, что я могу использовать, потому что она делает обратное тому, что я хочу сделать. Он генерирует токены из текста, который вы затем превращаете в байт-код, тогда как у меня есть байт-код, и я хочу превратить его в токены, которые затем превращаю в текст. На мой взгляд, единственный вариант, который у меня есть, это написать собственный генератор синтаксического анализатора, которого я бы хотел избежать, так как он требует много работы.
Еще одна проблема, с которой я столкнулся, заключается в том, что я не знаю, как обращаться с такими вещами, как строки с завершающим нулем и кодировка параметров (некоторые аргументы имеют префикс байта с определенным набором битов, сообщающих виртуальной машине, какую длину и тип ожидать, что, как я полагаю, означает Я не могу разобрать весь байткод простым DFA на уровне байтов)
Как мне написать дизассемблер для такого формата?