Ассемблер просматривает исходный программный модуль один или несколько раз. Наиболее распространенными являются двухпроходные Ассемблеры, выполняющие два просмотра исходного модуля. На первом проходе Ассемблер формирует таблицу символов модуля, а на втором — генерирует код программы
Алгоритм работы 1-го прохода двухпроходного Ассемблера показан на рисунке.
F Блок1: Начало 1-го прохода ассемблирования.
F Блок2:Начальные установки:
u установка в 0 счетчика адреса PC;
u создание пустой таблицы символов;
u создание пустой таблицы литералов;
u открытие файла исходного модуля;
u установка в FASLE признака окончания.
F Блок3: Признак окончания TRUE?
F Блок4: Считывание следующей строки исходного модуля. Добавка к счетчику адреса устанавливается равной 0.
F Блок5: При считывании был обнаружен конец файла?
F Блок6: Если конец файла обнаружен до того, как обработана директива END, — ошибка (преждевременный конец файла), при этом также устанавливается признак окончания обработки.
F Блок7: Лексический разбор оператора программы. При этом:
u выделяется метка/имя, если она есть;
u выделяется мнемоника операции;
u выделяется поле операндов;
u удаляются комментарии в операторе;
u распознается строка, содержащая только комментарий.
F Блок8: Строка содержит только комментарий? В этом случае обработка оператора не производится.
F Блок9: Мнемоника операции ищется в таблице директив.
F Блок10: Завершился ли поиск в таблице директив успешно?
F Блок11: Если мнемоника была найдена в таблице директив, происходит ветвление, в зависимости от того, какая директива была опознана.
F Блок12: Обработка директив типа DD (определения данных) включает в себя:
u выделение элементов списка операндов (одной директивой DD может определяться несколько объектов данных);
u определение типа и, следовательно, размера объекта данных, заданного операндом;
u обработка для каждого операнда возможного коэффициента повторения.
F Блок13: Добавка к счетчику адреса устанавливается равной суммарному размеру объектов данных, определяемых директивой.
F Блок14: Обработка директив типа BSS подобна обработке директив типа DD.
F Блок15: Добавка к счетчику адреса устанавливается равной суммарному объему памяти, резервируемому директивой.
F Блок16: Обработка директивы END состоит в установке в TRUE признака окончания обработки.
F Блок17: Обработка директивы включает в себя вычисление значения имени и занесение его в таблицу символов.
F Блок18: Обработка прочих директив ведется по индивидуальным для каждой директивы алгоритмам. Существенно, что никакие директивы, кроме DD и BSS, не изменяют нулевого значения добавки к счетчику адреса.
F Блок19: Если мнемоника операции не найдена в таблице директив, она ищется в таблице команд.
F Блок20: Завершился ли поиск в таблице команд успешно?
F Блок21: Если мнемоника не была найдена в таблице команд, — ошибка (неправильная мнемоника).
F Блок22: Если мнемоника найдена в таблице команд — определение длины команды, она же будет добавкой к счетчику адреса.
F Блок23: Есть ли в операторе литерал?
F Блок24: Занесение литерала в таблицу литералов (если его еще нет в таблице).
F Блок25: Была ли в операторе метка?
F Блок26: Поиск имени в таблице символов.
F Блок27: Имя в таблице символов найдено?
F Блок28: Если имя найдено в таблице символов — ошибка (повторяющееся имя).Если имя не найдено в таблице символов — занесение имени в таблицу символов.
F Блок29: Формирование и печать строки листинга.
F Блок30: Модификация счетчика адреса вычисленной добавкой к счетчику
F Блок31: Печать строки листинга и переход к чтению следующего оператора.
F Блок32: При окончании обработки — закрытие файла исходного модуля.
F Блок33: Были ли ошибки на 1-м проходе ассемблирования?
F Блок34: Формирование литерального пула.
F Блок35: Выполнение 2-го прохода ассемблирования.