- •Создание программ в перемещаемом формате
- •Обработка управляющей секцией(раздельное ассемблирование)
- •Программы связывания и загрузки
- •Структура и алгоритм работы сз
- •Однопросмотровая схема работы связывающего загрузчика
- •Особенности реализации чистых компоновщиков
- •Чистый загрузчик для мпф:
- •Чистый компоновщик для маф
- •Возможности макроязыков
- •Обработка вложенных макросов
- •Использование макрокоманд внутри макроса
- •Алгоритм обработки макрокоманд внутри макроса (неопережающее описание)
- •Дополнительные возможности макропроцессора
- •Структура трансляторов
- •Правила вывода Бэкуса-Наура:
- •Нисходящий синтаксический анализ
Чистый загрузчик для мпф:
Алгоритм:
1й проход:
1. адрес настройки модуля АНМ=0(модуль в перемещаемом формате)
2. организуем обработку входного потока модулей, каждый из которых обрабатывается следующим образом:
2.1. считываем запись типа Н, извлекаем имя модуля, помещаем его в ТВИ с проверкой на уникальность и присваиваем адрес из АНМ(для 1го модуля будет 0).
2.2. обрабатываем раздел внешних имен. Заносим все внешние имена в ТВИ(если происходит совпадение имен – генерируется ошибка). При этом с каждым именем сопоставляется адрес, получаемый как сумма относительного адреса внешнего имени + адрес настройки модуля
2.3. значение АНМ увеличиваем на длину модуля
Заканчиваем работу, когда заканчиваются модули.
2й проход:
1. организуем цикл по обработке входного потока модулей, каждый их которых обрабатывается следующим образом:
1.1. обрабатываем тело модуля(Т): к относительному адресу загрузки записи прибавляем АНМ, получаем АЗЗ в едином модуле. В выходной объектный модуль переносим измененную запись типа Т.
1.2. обрабатываем раздел модификаторов(М): к ОАМК в текущем модуле прибавляем значение переменной АНМ. Полученный адрес заносим во вспомогательную таблицу модификаторов. Если в модифицируемой команде используется внешняя ссылка, то осуществляется ее поиск в ТВИ. Если поиск неудачен – ошибка(неопределенная внешняя ссылка), если поиск удачен – внешняя ссылка заменяется адресом из ТВИ.
1.3. производим выгрузку ТМ в выходной объектный модуль
1.4. дополнительной обработки записи К не требуется, т к модуль в перемещаемом формате всегда загружается с 0.
Чистый компоновщик для маф
Однопросмотровая схема:
1. Переменной АЗМ присваиваем адрес загрузки
2. организуем цикл по обработке входного потока модулей, каждый из которых обрабатывается следующим образом:
2.1. считываем заголовок модуля Н, имя помещается в ТВИ с проверкой на уникальность и ему присваивается адрес из АЗМ(для 1го будет адрес загрузки)
2.2. обрабатываем запись типа Т?: внешние имен модуля. Если внешнее имя отсутствует в ТВИ, то помещаем его туда, при этом сопоставляя с ним его реальный адрес(сумма относительного адреса внешнего имени + АЗМ). Если имя присутствует и с ним сопоставлен адрес, то ошибка(дважды определенное внешнее имя). Если имя присутствует, но с ним не сопоставлен адрес(ВИ не определено), то назначаем ему адрес РАВИ и организуем проход по дополнительному списку, связанному с данным именем, каждый элемент которого обрабатывается следующим образом: извлекается Реальный Адрес Модифицируемой Команды и по этому адресу производят настройку операндной части: в эту часть заносится РАВС из ТВИ, элемент списка после этого удаляется.
3. обрабатывается раздел R внешних ссылок. Все внешние ссылки из этого раздела заносим в ТВИ с проверкой на уникальность: если ВИ отсутствует, то помещаем ВС в ТВИ и помечаем ее как неопределенную, если ВИ присутствует – ничего не делаем(либо она неопределенна в предыдущих модулях, либо определена и ей сопоставлен адрес)
4. обрабатываем запись Т: к Относительному Адресу Загрузки Записи + АЗМ = РАЗЗ и по этому адресу загружаем в память тело команды.
5. обрабатываем раздел М: к ОАМК + АЗМ = РАМК, по этому адресу в модифицируемой команде настраиваем операндную часть: к АМК + АЗМ , получаем Реальный Адрес Операнда(если не внешняя ссылка). Если в команде встретилось использование внешней ссылки, то осуществляем поиск в ТВИ: если поиск удачен и с ВИ сопоставлен адрес, то заменяем ВС адресом из ТВИ; если с ВИ не сопоставлен адрес, то в дополнительный список заносим РАМК, в операндной части которой встретилось упоминание ВИ
6. длина АЗМ увеличивается на длину модуля
Чистый компоновщик для МАД
2хпросмотровая схема:
Аналогичен связывающему загрузчику
2.04.
Лекция №8
Рассмотрим на каких этапах может производиться процесс настройки перекрестных ссылок.
Статическая и динамическая компоновка
???
Макропроцессоры
Макропроцессор – программа, которая переводит исходный текст на макроязыке в выходной текст на базовом языке. Макроопределение(макрос) – объединение нескольких команд базового языка в более крупные ??? образования. Формат макроса:
Имя_директива MACRO [список формальных параметров]
....
....
MEND
Обращение к макросам будет производиться по имени макроса, и будет выглядеть как обращение к команде базового языка.
M1_MACRO X,Y
...
MEND
...
[metka] M1_5,6
Процесс подстановки вместо макровызова тела макроса называется макрогенерацией или макроассемблированием. Макропроцессор должен уметь:
Собрать в одном тексте макросы в некие специальные таблицы
Выполнить процесс макроассемблирования
Процесс сбора макросов в специальные таблицы называется макроопределением.
Макропроцессоры используются:
в случае если в коде есть одинаковые участки