Алгоритмы построения однопроходного ассемблера

Существует 3 алгоритма построения однопроходного ассемблера:

1) Запретить ссылки вперед. Имя должно появляться в поле операнда только после того, как оно было определено как метка при команде или данных или через директиву EQU.

2) Отложенное формирование кода операций. Если объектный модуль сохраняется в объектной памяти, то ассемблер может отложить формирование кода для операнда (неопределенное имя) и вернуться к нему, когда имя будет определено. При появлении в поле операнда команды неопределенного имени поле операнда не формируется, а заполняется нулями. Таблица символов расширяется полями: признаком определенного и неопределенного имени и указателем на список адресов в объектном модуле, по которым требуется модификация поля операнда.

При появлении имени в поле операнда ищет в таблице символов.

Если имя найдено и помечено как определенное, ассемблер транслирует в адресное выражение, как и в двухпроходном режиме.

Если имя не найдено, ассемблер заносит имя в таблицу символов, помечает его неопределенным и создает первый элемент связанного с именем списка, в который заносит адрес в объектном модуле операнда данной команды. Если имя найдено, но помечено как неопределенное, то ассемблер добавляет в список, связанный с данным именем адрес в объектном модуле операнда данной команды.

При появлении имени в поле метки, команды или директивы ассемблер определяет значение имени и ищет его в таблице символов.

Если имя не найдено, ассемблер добавляет имя в таблицу символов и помечает как определенное.

Если имя найдено и помечено как определенное ассемблер выдает сообщение об ошибке «Не уникальное имя».

Если имя найдено, но помечено как неопределенное ассемблер обрабатывает связанный с данным именем список: для каждого элемента списка по хранящемуся в нем адресу в объектном модуле записывается значение имени. После обработки список уничтожается, значение имени сохраняется в таблице символов и имя помечается как определенное. После окончания прохода ассемблер проверяет таблицу символов: если в ней остались неопределенные имена, то выдается сообщение об ошибке.

Если объектный модуль выводится сразу в файл по мере его формирования алгоритм работы ассемблера похож на предыдущий случай, однако ассемблер не может при определении имени исправить уже сформированные и выведенные в файл операнды. Вместо этого он формирует новую запись объектного модуля, исправляющую старую. При загрузке будет вначале загружена в память с пустым полем операнда, затем на её место – запись с правильным полем операнда.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: