Есть у программы-ассемблера функции, которые общие для всех процессоров, это:
- вычисление адресов меток
- вычисление расстояний между метками
- размещение байтов (Б), двубайтов (Б2), тетрабайтов (Б4), октобайтов (Б8)
- работа с битами. Независимо от того, что там с мнемониками, байты и биты везде одинаковые
- биты надо группировать, и от этого возникают структуры (битовые поля)
- байты тоже можно группировать, поэтому структуры могут быть многобайтовые
- ещё бывают константы (именованные), это всё ещё независимо от процессора
- можно вычислять арифметические выражения (например "половина расстояния до ..."
- можно вычислять константы, в том числе с плавающей точкой (страшно подумать о константах-комплексных числах)
- и макросы, чтобы повторять и размножать последовательности, причём возможно макросы могут быть с параметрами
То есть, в [макро]ассемблере, независимо от процессора, есть различные типы данных (целые, плавающие, возможно комплексные, ничто не мешает быть аппаратным массивам, матрицам и тензорам), а так же могут быть макропеременные.
Теперь надо обработать то, что в разных процессорах разное.
У разных процессоров команды разные
Все команды, которые ассемблер ассемблирует, друг от друга никак не зависят (метки это другое).
Можно написать ассемблер с плагинами.
Т.е. чтобы на парсинг каждой команды/инструкции нужно было написать свой плагин.
А написание плагинов автоматизировать:
- сделать синтаксис для описания мнемоник и структуры команды
- сделать синтаксис для формирования последовательностей битов
- сделать формальный синтаксис для преобразования 1-го во второе (и обратно?)
Ассемблер берёт строку, которую не распознал самостоятельно,
и запихивает её на парсинг в плагин. Оттуда получает последовательность байтов.
Либо встраивает в себя фрагмент грамматики
(это более опасно, так как такой фрагмент может развернуться во что угодно,
и никак это заранее не проверить, во что он обернётся)
См. также:
Символ символа
Машкод
Интересно, были ли процессоры, работающие с комплексными числами аппаратно,
и если да, то зачем?
Отредактировано Лис (2023-03-31 09:43:28)