Структуры данных первого прохода

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

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

Некоторые директивы обрабатываются только на первом проходе, некоторые – только на втором, а для некоторых обработка распределяется между двумя проходами.

Таблица символов является основным результатом первого прохода ассемблера. Каждое имя, определенное в программе должно быть записано в таблице символов. Для каждого имени в таблице хранится его значение, размер объекта, связанного с этим именем и признак перемещаемости/не перемещаемости. Значением имени является число, интерпретируемое как адрес, поэтому разрядность значения равна разрядности адреса. Значение перемещаемого имени изменяется только при загрузке программы в память. Имена, относящиеся к командам или к памяти, выделяемой директивами DD и BSS являются перемещаемыми. Имена, значения которых определяются директивой EQU, являются неперемещаемыми, т.е. абсолютными.

Таблица литералов содержит по одной записи для каждого употребленного в модуле литерала. Для каждого литерала в таблице содержится: его символьное обозначение, длина, ссылка на значение. Литерал представляет собой константу, записанную в памяти. Обращение к литералам производится так же, как и к именам. По мере обнаружения в программе литералов ассемблер заносит их данные в литеральный пул. Значения, записываемые в таблицу литералов, являются смещением литерала в литеральном пуле. После окончания первого прохода ассемблер размещает литеральный пул в конце программы (т.е. назначает ему адрес, соответствующий последнему значению счетчика адреса) и корректирует значения таблицы литералов, заменяя их смещениями, относительно начала программы.


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



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