Существует 3 алгоритма построения однопроходного ассемблера:
1) Запретить ссылки вперед. Имя должно появляться в поле операнда только после того, как оно было определено как метка при команде или данных или через директиву EQU.
2) Отложенное формирование кода операций. Если объектный модуль сохраняется в объектной памяти, то ассемблер может отложить формирование кода для операнда (неопределенное имя) и вернуться к нему, когда имя будет определено. При появлении в поле операнда команды неопределенного имени поле операнда не формируется, а заполняется нулями. Таблица символов расширяется полями: признаком определенного и неопределенного имени и указателем на список адресов в объектном модуле, по которым требуется модификация поля операнда.
При появлении имени в поле операнда ищет в таблице символов.
Если имя найдено и помечено как определенное, ассемблер транслирует в адресное выражение, как и в двухпроходном режиме.
Если имя не найдено, ассемблер заносит имя в таблицу символов, помечает его неопределенным и создает первый элемент связанного с именем списка, в который заносит адрес в объектном модуле операнда данной команды. Если имя найдено, но помечено как неопределенное, то ассемблер добавляет в список, связанный с данным именем адрес в объектном модуле операнда данной команды.
|
|
При появлении имени в поле метки, команды или директивы ассемблер определяет значение имени и ищет его в таблице символов.
Если имя не найдено, ассемблер добавляет имя в таблицу символов и помечает как определенное.
Если имя найдено и помечено как определенное ассемблер выдает сообщение об ошибке «Не уникальное имя».
Если имя найдено, но помечено как неопределенное ассемблер обрабатывает связанный с данным именем список: для каждого элемента списка по хранящемуся в нем адресу в объектном модуле записывается значение имени. После обработки список уничтожается, значение имени сохраняется в таблице символов и имя помечается как определенное. После окончания прохода ассемблер проверяет таблицу символов: если в ней остались неопределенные имена, то выдается сообщение об ошибке.
Если объектный модуль выводится сразу в файл по мере его формирования алгоритм работы ассемблера похож на предыдущий случай, однако ассемблер не может при определении имени исправить уже сформированные и выведенные в файл операнды. Вместо этого он формирует новую запись объектного модуля, исправляющую старую. При загрузке будет вначале загружена в память с пустым полем операнда, затем на её место – запись с правильным полем операнда.