Двухпроходный Ассемблер - 1-й проход
Алгоритм работы 1-го прохода двухпроходного Ассемблера показан на рисунке.
|
- Начало 1-го прохода ассемблирования.
- Начальные установки:
- установка в 0 счетчика адреса PC;
- создание пустой таблицы символов;
- создание пустой таблицы литералов;
- открытие файла исходного модуля;
- установка в FASLE признака окончания.
- Признак окончания TRUE?
- Считывание следующей строки исходного модуля. Добавка к счетчику адреса устанавливается равной 0.
- При считывании был обнаружен конец файла?
- Если конец файла обнаружен до того, как обработана директива END, - ошибка (преждевременный конец файла), при этом также устанавливается признак окончания обработки..
- Лексический разбор оператора программы. При этом:
- выделяется метка/имя, если она есть;
- выделяется мнемоника операции;
- выделяется поле операндов;
- удаляются комментарии в операторе;
- распознается строка, содержащая только комментарий.
- Строка содержит только комментарий? В этом случае обработка оператора не производится.
- Мнемоника операции ищется в таблице директив.
- Завершился ли поиск в таблице директив успешно?
- Если мнемоника была найдена в таблице директив, происходит ветвление, в зависимости от того, какая директива была опознана.
- Обработка директив типа DD (определения данных) включает в себя:
- выделение элементов списка операндов (одной директивой DD может определяться несколько объектов данных);
- определение типа и, следовательно, размера объекта данных, заданного операндом;
- обработка для каждого операнда возможного коэффициента повторения.
- Добавка к счетчику адреса устанавливается равной суммарному размеру объектов данных, определяемых директивой.
- Обработка директив типа BSS подобна обработке директив типа DD.
- Добавка к счетчику адреса устанавливается равной суммарному объему памяти, резервируемому директивой.
- Обработка директивы END состоит в установке в TRUE признака окончания обработки.
- Обработка директивы включает в себя вычисление значения имени и занесение его в таблицу символов.
- Обработка прочих директив ведется по индивидуальным для каждой директивы алгоритмам. Существенно, что никакие директивы, кроме DD и BSS, не изменяют нулевого значения добавки к счетчику адреса.
- Если мнемоника операции не найдена в таблице директив, она ищется в таблице команд.
- Завершился ли поиск в таблице команд успешно?
- Если мнемоника не была найдена в таблице команд, - ошибка (неправильная мнемоника).
- Если мнемоника найдена в таблице команд - определение длины команды, она же будет добавкой к счетчику адреса.
- Есть ли в операторе литерал?
- Занесение литерала в таблицу литералов (если его еще нет в таблице).
- Была ли в операторе метка?
- Поиск имени в таблице символов.
- Имя в таблице символов найдено?
- Если имя найдено в таблице символов - ошибка (повторяющееся имя).Если имя не найдено в таблице символов - занесение имени в таблицу символов.
- Формирование и печать строки листинга.
- Модификация счетчика адреса вычисленной добавкой к счетчику
- Печать строки листинга и переход к чтению следующего оператора.
- При окончании обработки - закрытие файла исходного модуля.
- Были ли ошибки на 1-ом проходе ассемблирования?
- Формирование литерального пула
- Выполнение 2-го прохода ассемблирования.
- Конец работы Ассемблера.
| |
<
Примечания
- Определение длины команды (п.21). Эта задача может решаться существенно разным образом для разных языков. В языках некоторых Ассемблеров мнемоника команды однозначно определяет ее формат и длину (S/390, все RISC-процессоры). В этом случае длина команды просто выбирается из таблицы команд. В других языках длина и формат зависит от того, с какими операндами употреблена команда (Intel). В этом случае длина вычисляется по некоторому специфическому алгоритму, в который входит выделение отдельных операндов и определение их типов. В последнем случае должна производиться также необходимая проверка правильности кодирования операндов (количество операндов, допустимость типов).
- Обнаружение литералов (п.22). Требует, как минимум, выделения операндов команды. (Подробнее об обработке литералов см. ниже).
- Листинг. Строка листинга печатается в конце каждой итерации обработки команды. Строка листинга 1-го прохода содержит: номер оператора, значение счетчика адреса (только для команд и директив, приводящих к выделению памяти), текст оператора. Листинг 1-го прохода не является окончательным, фактически он используется только для поиска ошибок, поэтому печатать его необязательно. Режим печати листинга 1-го прохода может определяться параметром Ассемблера или специальной директивой. После листинга программы может (опционно) печататься таблица символов.
- /i>Ошибки. На первом проходе выявляются не все ошибки, а только те, которые связаны с выполнением задачи 1-го прохода. Сообщение об ошибке включает в себя: код ошибки, диагностический текст, номер и текст оператора программы, в котором обнаружена ошибка.
Содержание раздела