Комментарии 5
Круто!
Сначала хотел предложить сравнить это с оптимизиющим сишным компилятором, но потом почитал про 8051, узнал что ни gcc ни llvm эту архитектуру не поддерживают. Что впрочем и не удивительно: три адресных пространства с разной шириной адреса - это вам не это...
Для 8051 есть прямо таки чемпионский в плане оптимизации компилятор от IAR, умеющий делать и то, что описал автор, и многое другое (находить одинаковые последовательности кода и выносить в функции, выделять одинаковые концовки функций, сжимать секцию данных, анализировать длины путей исполнения итд), вот с ним бы интересно сравнить.
Если дизассемблировать код после компилятора C, то да - можно выгадать немало адресного пространства CSEG - я делал себе среду дизассемблирования для 8051 наподобие IDA ещё в 90х годах - там при генерации ассемблерного листинга можно было сразу применять эти эвристики. Call/ret -> jmp, jmp/ret -> ret, был даже jmp/jmp/ret -> ret. Но у меня, как и в IDA, каждый байт сегмента имел метатег типа - который определялся автоматически для кода по дереву исполнения, и мог к тому же доопределяться или переопределяться вручную. Поэтому дизассемблер знал для всего размеченного сегмента, где код, а где, например, константные указатели на данные или подпрограммы - это делало оптимизацию (и следующее за ней перемещение) безопасными. Парсинг hex-файла же потенциально опасен - вы не сможете отличить код от похожих на него константных данных, и либо их “оптимизируете”, либо подвинете код без корректировки константных указателей - и результат окажется неработоспособен.
У меня есть схожий проект по оптимизации некоторого ассемблерного кода. Использую метод перебора\ГА.
Закладываем тестами весь требуемый функционал
Пишем(или даже не пишем) код решающий данный функционал
Запускаем ГА который наугад модифицирует код, переставляет команды и прочее
После каждой модификации прогоняются тесты и если они проходят, а код "оптимальнее" - код лидера подменяется найденным решением.
Работает медленно, приходится писать свой интерпретатор и эмулятор устройства, есть некоторые особенности по работе с адресами.
Но хорошо параллелится, процесс поиска легко разносится на вычислительный кластер, а код получается действительно отменный.
Делал как часть исследовательской работы для задач работы, но так и не применил, сменил работу, жду когда пригодится на новой.
Для этого решил сделать дизасемблирование из HEX-файла. Так это показалось гораздо удобнее, чем обрабатывать исходник
Странно, парсер ассемблера, в общем, несложен.
Проект напоминает самый самый конец backend'а компилятора, уже после того, как выбраны инструкции.
Простой анализатор кода для программы, написанной на Ассемблере 8051