Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Алгоритм работы Макропроцессора





Очевидно, что когда Макропроцессор обрабатывает макровызов, он уже должен «знать» макроопределение данной макрокоманды. Для обеспечения этого таблицы макроопределений и имен макроопределений должны быть созданы до начала обработки макровызовов. Поэтому Макропроцессор должен состоять из двух проходов, на первом проходе строятся таблицы макроопределений и имен макроопределений, а на втором осуществляется обработка макровызовов. Если макроопределения сосредоточены в начале исходного модуля, то Макропроцессор может быть и однопроходным. Ниже мы приводим алгоритм работы 2-проходного Макропроцессора, при этом мы исходим из следующих предпосылок:

u наш Макропроцессор является независимым от Ассемблера;

u таблица параметров объединяется с таблицей локальных переменных, в дальнейшем мы называем объединенную таблицу таблицей локальных переменных;

u операторы Макроязыка включают в себя: MACRO, MEND, MEXIT, MNOTE, LOCL, GLBL, SET, MGO, MIF;

u обеспечиваются локальные и глобальные переменные макроопределений, уникальные метки.

Алгоритм выполнения 1-го прохода следующий:

 

F Блок1: 1-й проход Макропроцессора

F Блок2: Инициализация: открытие исходного файла, создание пустых таблиц, признак «обработка макроопределения» устанавливается в FALSE.

F Блок3: Чтение следующей строки исходного файла с проверкой конца файла.

F Блок4: Если при чтении строки найден конец файла, выводится сообщение об ошибке, закрываются файлы, освобождается память...

F Блок5:...и Макропроцессор завершается с признаком ошибки.

F Блок6: Если конец файла не достигнут, выполняется лексический разбор прочитанной строки с выделением имени и мнемоники операции.

F Блок7: Алгоритм Макропроцессора разветвляется в зависимости от мнемоники операции

F Блок8: Если мнемоника операции MACRO — заголовок макроопределения, то в таблицу имен макроопределений заносится имя, находящееся в этом операторе и начальный адрес свободной области в таблице макроопределений. (При занесении имени в таблицу имен макроопределений проверяется, нет ли уже в таблице такого имени, если есть — ошибка)

F Блок9: Оператор MACRO записывается в таблицу макроопределений.

F Блок10: Признак «обработка макроопределения» устанавливается в TRUE.

F Блок11: Если мнемоника операции MEND — конец макроопределения, то оператор записывается в таблицу макроопределений...

F Блок12:...и признак «обработка макроопределения» устанавливается в FALSE.

F Блок13: Если мнемоника операции END — конец программы, то проверяется установка признака «обработка макроопределения».

F Блок14: Если этот признак установлен в TRUE, т.е., конец программы встретился до окончания макроопределения, то выводится сообщение об ошибке, закрываются файлы, освобождается память...

F Блок15:...и Макропроцессор завершается с признаком ошибки.

F Блок16: Если этот признак установлен в FALSE, то выполняются завершающие операции...

F Блок17:...и заканчивается 1-й проход Макропроцессора.

F Блок18: При любой другой мнемонике оператора проверяется установка признака «обработка макроопределения».

F Блок19: Если этот признак установлен в TRUE, то оператор записывается в таблицу макроопределений, если признак установлен в FALSE, то оператор игнорируется Макропроцессором.

Алгоритм выполнения 2-го прохода следующий:

 

F Блок1: 2-й проход макропроцессора

F Блок2: Начальные установки: открытие файлов, создание пустых таблиц. Признак режима обработки устанавливается в значение «обработка программы».

F Блок3: Признак конца обработки установлен?

F Блок4: Если признак конца обработки установлен, выполняются завершающие операции...

F Блок5:...и работа Макропроцессора заканчивается.

F Блок6: Выполняется разбор строки.

F Блок7: Проверяется признак режима обработки.

F Блок8: Если признак режима установлен в значение «обработка макроопределения», то проверяется мнемоника оператора.

F Блок9: Если в режиме обработки макроопределения встречается мнемоника MEND, то режим переключается в «обработка программы», все прочие операторы в режиме обработки макроопределения игнорируются.

F Блок10: Если признак режима работы установлен в значение «обработка программы», происходит ветвление алгоритма в зависимости от мнемоники оператора.

F Блок11: Обработка оператора MACRO заключается в установке режима обработки в значение «обработка программы».

F Блок12: Обработка директивы Ассемблера END заключается в установке признака окончания работы и выводе оператора в выходной файл.


F Блок13: Любая другая мнемоника ищется в Таблице машинных команд и в Таблице директив Ассемблера. Если мнемоника найдена в одной из этих таблиц, то...

F Блок14:...оператор просто выводится в выходной файл.

F Блок15: Если оператор не является оператором языка Ассемблера, то предполагается, что это макровызов и соответствующее мнемонике имя ищется в Таблице имен макроопределений.

F Блок16: Если имя не найдено в Таблице имен макроопределений, то оно ищется в библиотеках макроопределений.

 

F Блок17: Если имя не найдено и в библиотеках макроопределений, вырабатывается сообщение об ошибке и управление передается на чтение следующего оператора программы.

F Блок18: Если имя не найдено в библиотеках макроопределений, соответствующие элементы включаются в Таблицу имен макроопределений и в Таблицу макроопределений.

F Блок19: Если имя есть в Таблице макроопределений, выполняется обработка макровызова, после чего управление передается на чтение следующего оператора программы.

Алгоритм обработки макровызова следующий:

 

F Блок1: Обработка макровызова. На входе этого модуля есть номер элемента в Таблице имен макроопределений и разобранный текст оператора макровызова.

F Блок2: Создание пустых: Таблицы локальных переменных, Таблицы меток.

F Блок3: Чтение первой строки из Таблицы макроопределений по адресу, записанному в элементе Таблице имен макроопределений. (Здесь и далее мы подразумеваем, что после чтения очередной строки макроопределения указатель для следующего чтения устанавливается на адрес следующей строки, если он не изменен явным образом.)

F Блок4: Проверка параметров: сопоставление фактических параметров вызова с формальными параметрами, описанными в заголовке макроопределения (Заголовок находится в строке, только что считанной из Таблицы макроопределений).

F Блок5: При несоответствии фактических параметров формальным выдается сообщение об ошибке...

F Блок6:...и обработка макровызова завершается

F Блок7: При правильном задании фактических параметров параметры и их значения заносятся в Таблицу локальных переменных.

F Блок8: Создается и заполняется Таблица меток макроопределения. При этом текст макроопределения просматривается до оператора MEND, выявляются метки и заносятся в таблицу. Проверяется уникальность меток. После заполнения таблицы меток указатель чтения из Таблицы макроопределений устанавливается на вторую (следующую за заголовком строку) текста макроопределения.

F Блок9: Читается следующая строка текста макроопределения.

F Блок10: Если строка является комментарием Ассемблера, строка выводится в макрорасширение.

F Блок11: Если строка является комментарием Макроязыка, управление передается на чтение следующей строки макроопределения.

F Блок12: Выполняется разбор строки.

F Блок13: Алгоритм ветвится в зависимости от мнемоники оператора.

F Блок14: При обработке оператора LOCL имя локальной переменной ищется сначала в Таблице локальных переменных...

F Блок15:...а затем — в Таблице глобальных переменных.

F Блок16: Если имя найдено в одной из таблиц, формируется сообщение о неуникальном имени.

 

F Блок17: В противном случае заносится новая строка в таблицу локальных имен. В любом случае управление передается на чтение следующей строки макроопределения.


F Блок18: Обработка оператора GLBL отличается от оператора LOCL только тем, что новая строка создается в Таблице глобальных переменных.

F Блок19: При обработке оператора LOCL вычисляется выражение — операнд команды. Вычисление включает в себя подстановку значений входящих в выражение переменных. Возможны ошибки — из-за использования неопределенных имен и ошибок в синтаксисе выражения.

F Блок20: Имя переменной ищется сначала в Таблице локальных переменных.

F Блок21: Если имя найдено, изменяется его значение в Таблице локальных переменных.

F Блок22: Если имя переменной не найдено, оно ищется в Таблице глобальных переменных.

F Блок23: Если имя найдено в Таблице глобальных переменных, изменяется его значение в этой таблице.

F Блок24: Если имя не найдено ни в одной из таблиц, формируется сообщение о неопределенном имени.

F Блок25: При обработке оператора MIF вычисляется условное выражение — 1-й операнд команды (возможны ошибки).

F Блок26: Проверяется значение вычисленного условного выражения.

F Блок27: Если значение выражения «истина», имя метки — 2-го операнда команды ищется в Таблице меток макроопределения.

F Блок28: Если метка найдена в таблице, указатель для следующего чтения из Таблице макроопределений устанавливается на адрес соответствующий метке

F Блок29: Если метка найдена в таблице, выдается сообщение о неопределенной метке.

F Блок30: При обработке оператора MGO имя метки — операнда команды ищется в Таблице меток макроопределения.

 

F Блок31: Если метка найдена в таблице, указатель для следующего чтения из Таблице макроопределений устанавливается на адрес соответствующий метке.

F Блок32: Если метка найдена в таблице, выдается сообщение о неопределенной метке.

F Блок33: При обработке оператора MNOTE выводится сообщение, определяемое операндом.

F Блок34: Устанавливается и анализируется код серьезности. Код серьезности является общим для всей работы Макропроцессора, его значение изменяется только, если новое значение больше текущего (более серьезная ошибка)

F Блок35: Если код серьезности не допускает продолжения работы Макропроцессора, устанавливается признак завершения работы.

F Блок36: При обработке оператора MEXIT устанавливается и анализируется код серьезности.

F Блок37: Если код серьезности не допускает продолжения работы Макропроцессора, устанавливается признак завершения работы.

F Блок38: Освобождаются структуры данных, созданные для обработки макровызова...

F Блок39:...и обработка макровызова завершается.

F Блок40: При обработке оператора MEND освобождаются структуры данных, созданные для обработки макровызова...

F Блок41:...и обработка макровызова завершается.

F Блок42: Любая другая мнемоника операции означает, что оператор является не оператором Макроязыка, а оператором языка Ассемблера. В этом случае прежде всего проверяется, не имеет ли оператор метки, которая должна быть уникальной.


F Блок43: Если оператор имеет такую метку, формируется имя уникальной метки и индекс уникальных меток увеличивается на 1.

F Блок44: Выполняются подстановки в операторе языка Ассемблера (значение имен ищутся в Таблицах локальных и глобальных переменных, возможны ошибки).

F Блок45: Оператор языка Ассемблера записывается в макрорасширение.

 







Date: 2015-05-22; view: 684; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.015 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию