Инициализация: открытие исходного файла, создание пустых таблиц, признак "обработка макроопределения" устанавливается в FALSE.
Чтение следующей строки исходного файла с проверкой конца файла.
Если при чтении строки найден конец файла, выводится сообщение об ошибке, закрываются файлы, освобождается память...
... и Макропроцессор завершается с признаком ошибки.
Если конец файла не достигнут, выполняется лексический разбор прочитанной строки с выделением имени и мнемоники операции.
Алгоритм Макропроцессора разветвляется в зависимости от мнемоники операции
Если мнемоника операции MACRO - заголовок макроопределения, то в таблицу имен макроопределений заносится имя, находящееся в этом операторе и начальный адрес свободной области в таблице макроопределений. (При занесении имени в таблицу имен макроопределений проверяется, нет ли уже в таблице такого имени, если есть - ошибка)
Оператор MACRO записывается в таблицу макроопределений.
Признак "обработка макроопределения" устанавливается в TRUE.
Если мнемоника операции MEND - конец макроопределения, то оператор записывается в таблицу макроопределений...
... и признак "обработка макроопределения" устанавливается в FALSE.
Если мнемоника операции END - конец программы, то проверяется установка признака "обработка макроопределения".
Если этот признак установлен в TRUE, т.е., конец программы встретился до окончания макроопределения, то выводится сообщение об ошибке, закрываются файлы, освобождается память...
... и Макропроцессор завершается с признаком ошибки.
Если этот признак установлен в FALSE, то выполняются завершающие операции ...
... и заканчивается 1-й проход Макропроцессора.
При любой другой мнемонике оператора проверяется установка признака "обработка макроопределения".
Если этот признак установлен в TRUE, то оператор записывается в таблицу макроопределений, если признак установлен в FALSE, то оператор игнорируется Макропроцессором.
1-й проход Загрузчика.
Начальные установки. Создание пустой Глобальной таблицы. Стартовый адрес=пусто. Относительный адрес 1-го сегмента - 0. Размер программы - 0.
Выборка следующего имени из списка объектных модулей. Если весь список объектных модулей обработан - переход на окончание 1-го прохода.
Чтение заголовка очередной записи объектного модуля, если объектный модуль обработан полностью - переход к следующему модулю.
Чтение остальной части записи (размер записи содержится в ее заголовке).
Разветвление в зависимости от типа записи.
При обработке записи окончания проверяется, имеется ли в записи стартовый адрес. Если стартового адреса нет - никакая другая обработка записи не производится.
Если в записи есть стартовый адрес, проверяется, не был ли он уже установлен.
Если стартовый адрес не был установлен, он устанавливается.
Если стартовый адрес был установлен, выдается сообщение об ошибке. (Ни эта, ни последующие рассмотренные ошибки не приводят к немедленному завершению 1-го прохода, однако, если на 1-ом проходе были ошибки, 2-й проход не выполняется).
При обработке записи связывания выполняется перебор элементов Таблицы внешних символов...
... и разветвление - в зависимости от типа элемента.
Для элемента - сегмента вычисляется начальный адрес следующего сегмента и длина сегмента прибавляется к общему размеру программы.
Для элемента - входной точки ищется имя точки в Глобальной таблице .
Если имя не найдено в Глобальной таблице, в таблицу добавляется новый элемент.
Если имя найдено в Глобальной таблице, - ошибка, неуникальное внешнее имя.
При окончании 1-го прохода проверяется, установился ли адрес стартовой точки программы.
Если этот адрес не установлен - ошибка.
Если этот адрес установлен и в ходе выполнения 1-го прохода не было других ошибок, Загрузчик продолжает работу.
Выделяется память для программы в соответствии с ее размером.
В Глобальную таблицу внешних символов записываются фактические адреса.
Выполняется 2-й проход.
Освобождается Глобальная таблица
Если не было ошибок на 2-ом проходе
... управление передается на стартовый адрес программы