Системное программирование

Автор: Пользователь скрыл имя, 10 Марта 2013 в 15:44, курс лекций

Описание работы

Один из основных принципов машины фон Неймана — то, что и программы, и данные хранятся в одной и той же памяти. Сохраняемая в памяти программа представляет собой некоторые коды, которые могут рассматриваться как данные. Возможно, с точки зрения программиста программа — активный компонент, она выполняет некоторые действия. Но с точки зрения процессора команды программы — это данные, которые процессор читает и интерпретирует. С другой стороны программа — это данные с точки зрения обслуживающих программ, например, с точки зрения компилятора, который на входе получает одни данные — программу на языке высокого уровня (ЯВУ), а на выходе выдает другие данные — программу в машинных кодах.

Работа содержит 1 файл

Системное программирование 15 лекций.doc

— 946.00 Кб (Скачать)

Условные выражения  описаны выше. Обычно предусматриваются  специальные формы:

IFDEF имя

IFNDEF имя

проверяющие просто определено или не определено данное имя.

Операторы условных блоков довольно часто являются не операторами Макроязыка, а директивами  самого языка Ассемблера.

4

Операторы повторений

Операторы повторений Макроязыка (или директивы повторений языка Ассемблера) заставляют повторить блок операторов исходного текста, возможно, с модификациями в каждом повторении. Операторы повторений играют роль операторов цикла в языках программирования, они не являются обязательными для макроязыка, так как цикл можно обеспечить и условным переходом.

Как и в языках программирования, в Макроязыке может  быть несколько форм операторов повторения, приведем некоторые (не все) из возможных  форм:

MDO выражение

блок_операторов_макроопределения

ENDMDO

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

MDOLIST переменная_макроопределения, 
список_выражений

блок_операторов_макроопределения

ENDMDO

обработка блока  операторов повторяется столько  раз, сколько элементов имеется в списке_выражений, при этом в каждой итерации переменной_макроопределения присваивается значение очередного элемента из списка_выражений.

MDOWHILE условное_выражение 

блок_операторов_макроопределения

ENDMDO

обработка блока  операторов повторяется до тех пор, пока значение условного_выражения — «истина».

4

Выдача сообщения

При возникновении  ошибок или ситуаций, требующих предупреждения программисту в листинг должно выводиться сообщение. Если в результате ошибки программиста, написавшего макроопределение или макровызов будет сгенерирован неправильный код программы на языке Ассемблера, то эта ошибка будет выявлена только Ассемблером на этапе трансляции программы. Однако выгоднее выявлять ошибки не как можно более ранних этапах подготовки программы, в Макроязыке ошибочные ситуации (ошибки в параметрах и т.п.) могут быть выявлены при помощи условных операторов или блоков, а для выдачи сообщения об ошибке должен существовать специальный оператор Макроязыка. Формат такого оператора примерно следующий:

MOTE код_серьезности,код_ошибки,сообщение_об_ошибке

код_серьезности — числовой код, определяющий возможность продолжения работы при наличии ситуации, вызвавшей сообщения.

Должны индицироваться, как минимум, следующие ситуации:

u работа Макропроцессора может быть продолжена, по окончании ее может выполняться ассемблирование;

u работа Макропроцессора может быть продолжена, но ассемблирование выполняться не может;

u работа Макропроцессора не может продолжаться.

код_ошибки — числовой код, служащий, например, для поиска развернутого описания сообщений и действий при его возникновении в документе «Сообщения программы»

сообщение_об_ошибке — текст, печатаемый в листинге

4

Завершение обработки

Обработка макроопределения завершается при достижении оператора MEND. Однако, поскольку алгоритм обработки макроопределения может разветвляться, должна быть предусмотрена возможность выхода из обработки и до достижения конца макроопределения. Эта возможность обеспечивается оператором MEXIT. Операндом этого оператора может быть код_серьезности.

4

Комментарии макроопределения

Если в тексте макроопределения имеются комментарии, то они переходят в макрорасширение  так же, как и операторы машинных команд и директив Ассемблера. Однако, должна быть обеспечена и возможность  употребления таких комментариев, которые не переходят в макрорасширение — комментарии, которые относятся не к самой программе, а к макроопределению и порядку его обработки. Такие комментарии должны обладать некоторым отличительным признаком. Возможны специальные директивы Ассемблера, определяющие режим печати комментариев макроопределения.

4

Макрорасширения в листинге

Как уже неоднократно говорилось, макрорасширения для  Ассемблера неотличимы от программного текста, написанного программистом  «своей рукой». Но программист, анализируя листинг программы, конечно, должен видеть макрорасширения и отличать их от основного текста. Как правило, директивы Ассемблера, управляющие печатью листинга предусматривают режим, при котором макрорасширение не печатается в листинге, а печатается только макрокоманда и режим, при котором в листинге печатается и макрокоманда, и ее макрорасширение, но операторы макрорасширения помечаются каким-либо специальным символом.

Структуры данных Макропроцессора 

 

Таблица макроопределений, строго говоря, не таблица, а просто массив строк, в который записываются тексты всех макроопределений (от оператора MACRO до оператора MEND), найденных в обрабатываемом модуле.

Таблица имен макроопределений содержит имена макроопределений и  указатель на размещение текста макроопределения в таблице макроопределений, как показано на рисунке.  

 

Все таблицы  имеют переменный размер и заполняются  в процессе работы. Индекс уникальных меток — число, используемое для  формирования уникальной части имен меток, встречающихся в макроопределениях

Для обработки  каждого макровызова создаются:

u Таблица параметров, содержащая информацию о параметрах макроопределения.

u Таблица локальных переменных, содержащая информацию о локальных переменных макроопределения.

Структура этих таблиц — такая же, как и таблицы глобальных переменных, эти две таблицы могут быть объединены в одну таблицу параметров и локальных переменных.

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: Если имя найдено в одной из таблиц, формируется сообщение о неуникальном имени.  

Информация о работе Системное программирование