
- •Создание программ в перемещаемом формате
- •Обработка управляющей секцией(раздельное ассемблирование)
- •Программы связывания и загрузки
- •Структура и алгоритм работы сз
- •Однопросмотровая схема работы связывающего загрузчика
- •Особенности реализации чистых компоновщиков
- •Чистый загрузчик для мпф:
- •Чистый компоновщик для маф
- •Возможности макроязыков
- •Обработка вложенных макросов
- •Использование макрокоманд внутри макроса
- •Алгоритм обработки макрокоманд внутри макроса (неопережающее описание)
- •Дополнительные возможности макропроцессора
- •Структура трансляторов
- •Правила вывода Бэкуса-Наура:
- •Нисходящий синтаксический анализ
Возможности макроязыков
Определяются ограничениями, которые накладываются на грамматические конструкции. К простейшим макроязыкам относятся а)ограничения: на опережающее использование макроса или б) отсутствие ограничения на опережающее описание макроса
А)M1 MACRO
...
MEND
...
M1
Б) M1
...
M1_MACRO
...
MEND
К усложненным макроязыкам:
А) макроопределение может содержать обращение к другим макросам
M1_MACRO
..
MEND
...
M2_MACRO
...
M1
...
MEND
...
M2
Б) использование вложенных макроопределений
M1_MACRO
...
M2_MACRO
...
MEND
..
MEND
..
M1
..
M2
Особенности использования вложенных макроопределений: при обращении к внутреннему макросу сначала нужно обратиться к внешнему.
Реализация простейшего макропроцессора
Простейший макропроцессор будет распознавать простейший макроязык(опережающее описание макроса и отсутствие вложенных макроопределений и макровызовов).
Для реализации нужно: 2 структуры – таблица макроопределений (ТМО), куда будем заносить тело макроса без изменений и таблица имен макроса(ТИМ), содержащая имена макроса и указатели на начало и конец этого макроса в ТМО.
Рис1
Алгоритм работы простейшего макропроцессора
Организуем цикл по обработке строк исходного текста программы, каждая строка обрабатывается следующим образом:
если в строке встретилась инструкция базового языка(Ассемблера), то она переносится в выходной файл без изменений.
если встретилась директива MACRO, то в таблицу ТИМ заносится имя макроса, а ТМО переносим тело макроса без изменений и устанавливаем указатель на начало и конец этого макроса в ТМО.
если встретилось обращение к макросу, то осуществляем поиск в ТИМ: если поиск неудачен т о ошибка, если поиск удачен, то осуществляем процесс макроподстановки – команды заменяется на тело-содержимое макроса, которое берем из ТМО.
M1_MACRO
ADD R1, R2
MOV R1, R3
MEND
...
M1
M1
...
ADD R1, R2
MOV R1, R3
... ADD R1, R2
MOV R1, R3
...
Если опережающее описание макроса отсутствует
Алгоритм работы макропроцессора:
???
Особенности однопросмотровой схемы: ТИМ можно сделать усложненной структурой(например добавить столбец , в который записывать указатель на вспомогательный список).
Обработка вложенных макросов
1M1_MACRO
2 MOV R1, 0
3 MOV R2, 1
4M2_MACRO
5 MOV R1, 2
6 MOV R2, 3
7 ADD R1, R2
8 MEND
9 ADD R2, R1
10 MEND
ВИ |
Адрес |
Имя1 |
РАВИ(реальный адрес внешнего имени) |
Необходимо для реализации макропроцессора: булевская переменная Regim=принимает TRUE, если макропроцессор в режиме макрогенерации и false если в режиме макроопределения, переменная level ???
Vvod Str – выбирает(получает) очередную строку либо из файла, либо из ТМО
ObrabStr – в полученной строке анализируем мнемокод операции и переключаем режим работы макропроцессора
ObrabMacro – будет выполнять формирование строк в ТИМ и в ТМО
MacroGen – реализуем работы макропроцессора в режиме макрогенерации
begin
Regim:=false
while МКОП<>END do
begin
VvodStr;
ObrabStr;
end;
end.
procedure VvodStr;
begin
if Regim then
выбрать строку из ТМО и подставить параметры;
else выбрать строку из входного файла;
end;
procedure ObrabStr;
begin
поиск мнемокод операции(МКОП) в ТИМ;
if нашли then
MACROGEN
if МКОП=MACRO then ObrabMacro
else запистаь строку в выходной файл
9.04
Лекция №9
код1
procedure ObrabMacro;
begin
Level:=1;
while level>0 do
begin
VvodStr;
if МКОП=VACRO then level:=level+1
else if МКОП = MEND then level-1
end;
//зааносим в ТИМ указатель н конец и начало макроса
Заносим в таблицу ТИМ заголовок макроса
макрогенерация
prosedure MacroGen;
begin
Regim:=true;
while " пока не конец макроса" do
begin
VvodStr;
ObrabStr;
end;
Regim:=false
end;
ДЗ МОДИФИЦИРОВАТЬ ЭТОТ ПРОГРАММНЫЙ КОД ДЛЯ ТОГО ЧТОБЫ МОЖНО БЫЛО ИСПОЛЬЗОВАТЬ МАКРОКОМАНДЫ ВНУТРИ МАКРОСА
ДЗ Использование макрокоманд внутри макроса
Изменяется только ObrabStr
Procedure ObrabStr;
If Regim = false then
Begin
«поиск МКОП в ТИМ»
If «поиск удачен» then MacroGen;
If МКОП = MACRO then ObrabMacro;
Else «записать строку в исходный файл»
End;
Else
Begin
«поиск МКОП в ТИМ»
If «поиск неудачен» then «ошибка»;
If «поиск удачен» then «запоминаем строку возврата и список фактических параметров этого макроса»;
.\\проверить макрос на зацикливание
MacroGen;
\\ вернуть сохраненный адрес и параметры возврата
Else «записать строку в исходный файл без изменений»
End;