Какие этапы будут задействованы при компиляции языка ассемблера в машинный код - PullRequest
0 голосов
/ 18 января 2011

Я пытаюсь написать компилятор для файла ассемблера, который будет выводить необработанные инструкции машинного кода.

Я нашел много уроков о том, как написать компилятор, но мне интересно, относятся ли все этапы к мнемонике ассемблера. Например, нужен ли вообще лексический анализ с учетом упрощенного поэтапного формата ассемблера, или он все еще будет необходим, но в более простом формате?

Ответы [ 4 ]

2 голосов
/ 18 января 2011

Лексический анализатор все еще необходим: у вас должно быть что-то, что разбивает текст на отдельные токены (слова, цифры, знаки препинания и т. Д.). Вам все еще нужен парсер, хотя и значительно упрощенный. В конце концов, - это грамматика.

0 голосов
/ 18 января 2011

Я бы сказал, что вы можете применять почти все этапы компиляторов к ассемблерам, конечно, то, что относится к вам, зависит от того, что вы собираетесь делать.Если вы делаете отображение 1-в-1, вам нужен синтаксический анализ для проверки на наличие ошибок и лексер и / или анализатор для обработки текста для спецификаторов сборки, таких как секционирование, защита памяти в .data (или даже макросы!).Существует также «оптимизация» размера, которая может быть применена путем направления непосредственных констант в наименьший возможный размер.Конечно, вы можете сделать все возможное и выполнить глубокий анализ, чтобы переупорядочить и объединить инструкции.Вы также можете захотеть, чтобы на этапе статического анализа проверялись недопустимые (недопустимые) последовательности (LOCK CMPXCHG EDX,EDX будет примером синтаксически правильной, но недопустимой сборки iirc)

0 голосов
/ 18 января 2011

Сначала я бы проверил, нет ли недопустимых инструкций / операндов, затем, если все используемые переменные объявлены.Как только вы убедитесь, что файл является допустимой программой, удалите комментарии и замените переменные и процедуры адресами (вы должны назначать адреса меткам «на лету» во время перевода, потому что вы не можете знать адрес прямо сейчас.).Последние делают фактическое преобразование в двоичном коде.

Если вы предполагаете, что каждая инструкция имеет свою собственную строку, это будет намного проще: если текущая строка является меткой, тогда замените все дальнейшие ссылки на нее текущим адресом, в противном случае удалите все пробелы, оставив один из двух«слова» (инструкция и операнды).Теперь обрабатывать инструкцию - это шутка.;)

0 голосов
/ 18 января 2011

На мой взгляд, лексический анализ - это все, что нужно, когда необходимость синтаксического анализатора уменьшается из-за плоской структуры сборки.

...