Добавлен: 30.10.2018
Просмотров: 253
Скачиваний: 5
17. Реализация однопроходной схемы работы ассемблера
Суть однопроходной схемы состоит в запоминании некоторым образом
тех команд, где используются неопределенные на момент обработки этих
команд символические операнды с возвратом к этим командам после того,
как имя станет определенным. Для этого структура базовой таблицы
символических имен должна быть усложнена. С каждым неопределенным
именем может дополнительно связываться вспомогательный список адресов
тех операндов, где используется данное имя. Тем самым, ТСИ из массива
записей превращается в массив линейных списков. Ясно, что
вспомогательные списки нужны только для обработки ссылок вперед, и
поэтому для имен областей памяти с данными они не нужны. Например, если
в кодовом сегменте встречаются ссылки вперед на метки L1 и L4, то
усложненная ТСИ будет содержать следующую информацию:
симв.
имя
адрес
доп.
инф.
начало
списка
N1
00 00 00 00
0
N2
00 00 00 02
0
L1
нет
L2
00 00 2A
CD
0
L3
00 00 40 80
0
L4
нет
Алгоритм обработки строк с командами должен включать следующие шаги.
анализ поля метки и выделение имени-метки (если оно есть)
поиск метки в ТСИ со следующими возможными ситуациями:
o
если метка отсутствует в ТСИ, то она туда добавляется вместе с
соответствующим адресом (текущее значение переменной СА) и
далее считается определенной
адрес операнда
с именем L1
адрес операнда
с именем L1
адрес операнда
с именем L4
o
если метка есть в ТСИ и ей уже назначен адрес, то генерируется
ошибка типа “Дважды определенная метка”
o
если метка есть в ТСИ, но ей еще адрес НЕ назначен, то
происходит назначение адреса, метка считается определенной и
поэтому организуется просмотр вспомогательного списка, из
которого выбираются адреса операндов с данной меткой и по
этим адресам заносится адрес, назначенный данной метке; после
этого вспомогательный список уничтожается за ненадобностью
выделение и обработка поля кода команды обычным образом
обработка операндов команды, причем при появлении среди операндов
символического имени, оно обрабатывается следующим образом:
o
организуется поиск имени в ТСИ со следующими возможными
результатами:
имя в ТСИ отсутствует (ситуация первой ссылки вперед),
оно туда заносится БЕЗ назначения адреса и создается
первый элемент вспомогательного списка с адресом
операнда
имя в ТСИ есть, является неопределенным (адрес не
назначен), что является признаком появления еще одной
ссылки вперед на ту же самую метку, и поэтому
вспомогательный
список
дополняется
еще
одним
элементом с адресом текущего операнда
имя в ТСИ есть и является определенным, тогда просто
происходит занесение его адреса в машинную команду
при достижении конца модуля выполняется просмотр ТСИ с целью
проверки, не остались ли в ней неопределенные имена – эта ситуация
должна рассматриваться как ошибочная
В целом, несмотря на более сложную логику, однопроходная схема
является более предпочтительной и поэтому именно она используется в
реальных ассемблерах.