Что вам нужно, так это инструмент, для которого вы можете определить синтаксис языка ассемблера, а затем создавать собственные анализаторы. Ваши анализаторы могут быть простыми («Сколько места занимает инструкция?») или сложными («Сколько циклов потребуется для выполнения этой инструкции?» [что зависит от предшествующей последовательности инструкций и, возможно, от сложной модели процессора, на котором вы работаете). заботиться о]).
Специально для этого разработан набор инструментов New Jersey Machine Toolkit. Он действительно предназначен для создания генераторов кода и отладчиков. Я подозреваю, что это было бы хорошо для «количества байтов инструкций». Не ясно, хорош ли он для более сложных анализов. И я считаю, что он настаивает на том, чтобы вы следовали его стилю синтаксиса, а не своему.
Наше программное обеспечение DMS не предназначено специально для этого, но хорошо подходит для синтаксического анализа/анализа языков. Инструментарий реинжиниринга.
DMS может быть предоставлено описание грамматики практически для любого контекстно-свободного языка (который охватывает большую часть синтаксиса языка ассемблера), а затем может разобрать конкретный экземпляр этой грамматики (код на ассемблере) в AST для дальнейшей обработки. Мы без проблем покончили с несколькими языками ассемблера, включая IBM 370, линейку 8-битных процессоров Motorola и довольно своеобразный DSP.
Вы можете легко указать грамматику атрибутов (вычисление по AST) для DMS. Это отличный способ кодировать анализы, которым нужна только локальная информация, например «Насколько велика эта инструкция?». Для более сложного анализа вам понадобится модель процессора, управляемая серией инструкций; передача такой машинной модели AST для отдельных инструкций была бы простым способом применить машинную модель для вычисления более сложных вещей, таких как «Сколько времени занимает эта инструкция?».
Другие анализы, такие как поток управления и поток данных, предоставляются DMS в общей форме. Вы можете использовать оценщик атрибутов для сбора локальных фактов ("control-next для этой инструкции...", "данные из этой инструкции поступают в...") и передавать их анализаторам потоков для вычисления глобальных фактов потоков ( «если я выполню эту инструкцию, какие другие инструкции могут быть выполнены ниже по течению?»..)
Вам нужно настроить DMS для вашего конкретного языка (ассемблера). Он предназначен для выполнения подобных задач.
Да, вы, вероятно, можете написать все это на Python; в конце концов, это машина Тьюринга. Но, вероятно, не так легко.
Дополнительное преимущество: DMS готова применить к вашему коду преобразования на основе вашего анализа. Таким образом, вы также можете реализовать свой оптимизатор. В конце концов, вам нужно связать анализ, указывающий на то, что оптимизация безопасна, с фактическими шагами оптимизации.
person
Ira Baxter
schedule
08.11.2010