LAB_9_2014c (1075931)
Текст из файла
48
2015 год 2 курс 4-й семестрБольшаков С.А.
Методические указания к лабораторной работе № 9
по дисциплине “Системное Программирование”
"Разработка и использование макрокоманд Ассемблера"
Москва, МГТУ - 2015 год
________________________________________________________________________
СОДЕРЖАНИЕ
1. Цель и задачи лабораторной работы 3
2. Макросы и их применение 3
3. Цели и задачи ЛР № 9 31
4. Требования к выполнению лабораторной работы №9 31
5. Перечень вариантов ЛР по группам 35
6. Перечень вариантов для заполнения массива 35
7. Перечень вариантов для сильных и продвинутых студентов 36
8. Контрольные вопросы по лабораторной работе 36
9. Требования к оформлению отчета по ЛР 37
10. Литература по ЛР СП 38
11. Пример программы с макрокомандой 39
12. Шаблон отчета по ЛР № 9 45
1 Цель и задачи лабораторной работы
Целью выполнения лабораторной работы является изучение языка и возможностей Макроассемблера, способов написания и использования макрокоманд, приемов их отладки и тестирования. В работе студенты разрабатывают собственные макрокоманды, проверяют их работу, получают навыки создания систем макрокоманд и их отладки. По результатам работы оформляется отчет. Данная ЛР выполняется студентами в полном варианте (с дополнительными требованиями) и простом варианте (1 и 2-й пункты задания). Полный вариант выполняется сильными студентами, что учитывается при сдаче зачета по курсу и защите КР.
2 Макросы и их применение
3 Назначение макросов
Макрокоманды – это очень интересный механизм для разработки программ на языке Ассемблер. Макрокоманды или иначе макросы (на жаргоне программистов) обрабатываются на этапе компиляции и позволяют сделать программу более наглядной и обозримой. Макросы могут использоваться для создания собственного языка программирования из команд, записанных пользователем. В программе на языке Ассемблер Вы можете встретить:
-
Машинные команды,
-
Директивы Ассемблера
-
Макрокоманды и
-
Комментарии.
-
Для использования макросов в программах на языке Ассемблер нужно:
-
Описать макрокоманду, дать определения макроса.
-
Выполнить вызов макрокоманды (макровызов).
-
Проверить правильность работы макрокоманды (проверить правильность генерации макрорасширения).
Рассмотрим отдельно эти действия.
4 Описание макросов
Описание макроса или макроопределение задается в следующем формате:
<имя макроса> MACRO <список формальных параметров макросов>
…
<тело макрокоманды>
…
ENDM
Тело макрокоманды состоит из обычных машинных команд, записанных в правилах синтаксиса Ассемблера, директив языка Ассемблер, команд включающих формальные параметры макроса и специальных директив макрокоманд. Список формальных параметров описывается так:
<список формальных параметров макросов>:=<формальный параметр> |
<формальный параметр> , <список формальных параметров макросов >
<формальный параметр>:= <имя параметра>
Пример простой макрокоманды для печати символа на дисплей показан ниже:
PUTCHAR MACRO SIMBOL ; Заголовок макроса с одним параметром
PUSH AX
PUSH DX
MOV DL, SIMBOL ; Использование параметра макроса
MOV AH , 02H ; Константа
INT 021H
POP DX
POP AX
ENDM
Данная макрокоманда сохраняет предварительно в стеке регистры AX и DX, выводит символ на экран дисплея и восстанавливает значения запомненных регистров. Хотя данная макрокоманда выглядит универсальной, при ее вызове возможны ошибки. Например, при задании в качестве параметра регистра АХ (например, макровызов – PUTCHAR AX) компилятор Ассемблера выдаст ошибку при обработке команды в макросе MOV DL, SIMBOL, так как размерности регистров не согласованы (DL – 1 байт и AX –два байта соответственно). Описания макрокоманд могут быть, несомненно, более сложными: из одной макрокоманды можно вызывать другие макрокоманды, создавая, таким образом, системы макрокоманд, которые могут подключаться из библиотек.
5 Параметры макросов и макровызовы
Параметры, задаваемые при описании макрокоманды (определении макрокоманды) называются формальными, а параметры, задаваемые при использовании макрокоманды (макровызове) называются фактическими. Вызов макрокоманды или макровызов задается так:
<имя макрокоманды> <список фактических параметров>
<список фактических параметров макросов>:=< фактический параметр>|
< фактический параметр> , <список фактических параметров макросов >
< фактический параметр>:= <имя параметра> | <пусто>
Как видно из формального описания, при макровызове параметры могут быть пропущены, при этом запятая должна оставаться на месте. Вызов макрокоманды для предыдущего макроопределения может быть таким:
PUTCHAR AL ; Фактический параметр регистр
…
PUTCHAR VAR ; Фактический параметр переменная
…
PUTCHAR ‘A’ ; Фактический параметр константа
Если при вызове макрокоманды задается несколько параметров, то допускается пропуск параметров (запятая при этом остается):
COMPARE VAR1, VAR2, VAR3 ; Параметры все заданы
…
COMPARE VAR1, , VAR3 ; Второй параметр пропущен
…
COMPARE , VAR2, VAR3 ; Первый параметр пропущен
…
COMPARE VAR1, VAR2 ; Третий параметр пропущен
Если параметры при вызове опущены, то в самой макрокоманде нужно предусмотреть проверку наличия конкретного фактического параметра, для чего используются специальные директивы условной компиляции.
6 Параметры по умолчанию
При описании макрокоманды могут быть заданы значения параметров по умолчанию. Это выполняется следующим образом (в дополнение к формальному описанию заголовка макрокоманды):
<формальный параметр>:= <имя параметра> |
<имя параметра> = <значение по умолчанию><имя параметра> = REQ
Такая возможность существует не во всех макроассемблерах. Приведем пример вызова макрокоманды с параметрами по-умолчанию:
PUTCHAR MACRO SIMBOL=REQ , CR=<PER>
В этом примере первый параметр является обязательным (задано служебное слово REQ – require, требуется), а второй параметр получает значение по умолчанию, которое используется в том случае, когда в макровызове параметр не задан.
7 Макрорасширения
После компиляции на место макровызова вставляются команды, полученные на основе макрорасширения (вставки текстового фрагмента). Эти команды должны строго соответствовать синтаксису языка Ассемблер, его семантике, а также логике работы задуманной программы. Макрорасширение вставляется автоматически и его можно, при желании, включить в листинг программы. Для включения в листинг команд макрорасширения используются специальные директивы различного назначения:
-
.LALL - получение в листинге всех макрорасширений
-
.SALL - подавление в листинге всех макрорасширений
-
.XALL – восстановление характеристик вывода листинга, заданного по умолчанию.
-
.LIST – включает печать исходного текста программы.
-
.XLIST – выключает всю печать исходного текста программы.
Макрорасширения для наших примеров получим в следующем виде:
PUTCHAR AL
1 PUSH AX
1 PUSH DX
1 MOV DL, AL ; Регистр
1 MOV AH , 02H
1 INT 021H
1 POP DX
1 POP AX
В первой строке макрорасширения показан уровень расширения. В нашем случае это “1”. Если в самой макрокоманде встречается другой макровызов, то эти строки макрорасширения будут помечены “2”, и так далее.
PUTCHAR VAR
1 PUSH AX
1 PUSH DX
1 MOV DL, VAR ; Переменная
1 MOV AH , 02H
1 INT 021H
1 POP DX
1 POP AX
В случае, когда при вызове макрокоманды передается ошибочный параметр, например, регистр AX ( нужен 1 байт в регистр DL, а передается 2 байта):
PUTCHAR AX
1 PUSH AX
1 PUSH DX
1 MOV DL, AX
********* ERROR ***************
1 MOV AH , 02H
1 INT 021H
1 POP DX
1 POP AX
Компилятор Ассемблера фиксирует ошибку, так как регистры (DL и AX) разной длины. При передаче параметра однобайтовой константы ошибки не возникает:
PUTCHAR ’A’
1 PUSH AX
1 PUSH DX
1 MOV DL, ’A’ ; Константа
1 MOV AH , 02H
1 INT 021H
1 POP DX
1 POP AX
8 Директивы написания макрокоманд
Помимо специальных директив описания макрокоманд (MACRO и MEND) в тексте программы на Ассемблере и в самих макрокомандах могут использоваться следующие директивы макрогенерации:
-
REPT – директива циклического повторения текста по счетчику.
-
IRP - директива циклического повторения текста по списку параметров.
-
IRPC – директива циклического повторения по списку символов (строке).
-
EXITM – директива завершения работы макрокоманды или цикла
-
LOCAL – директива описания локальных переменных и меток макроса.
-
IF, IFE, ELSE, ENDIF – директивы условной компиляции (логическое условие).
-
IF1, IF2, ELSE, ENDIF – директивы условной компиляции (проходы компилятора).
-
IFDEF , IFNDEF, ELSE, ENDIF – директивы условной компиляции (объявление переменных этапа компиляции).
-
IFB, IFNB, ELSE, ENDIF – директивы условной компиляции (проверка наличия параметра макрокоманды).
-
IFIDN, IFIDIF, ELSE, ENDIF - директивы условной компиляции (сравнение переменных этапа компиляции).
-
Служебные символы: “%” , “&” , “!” , “;;” – используются для написания макрокоманд.
Рассмотрит ниже назначение и возможности основных директив описания макрокоманд.
9 Циклическая компиляция
Директивы циклической компиляции (REPT, IRP, IRPC) позволяют организовать циклы генерации текста программы.
Директива REPT имеет следующий синтаксис:
REPT <выражение этапа компиляции>
<тело цикла>
ENDM
Параметр <выражение этапа компиляции> определяет число повторений цикла. Тело цикла может содержать любые команды и операторы языка Ассемблер, включая макрокоманды. Цикл генерации будет повторяться заданное число раз. Это число вычисляется до начала цикла и не может изменяться в цикле. Простейший пример цикла:
REPT 3 ; Константа
DB 0
ENDM
1 DB 0
1 DB 0
1 DB 0
Если параметром циклического оператора является переменная этапа компиляции N, то получим аналогичное макрорасширение:
N = 3
REPT N ; Переменная
DB N
ENDM
1 DB 3
1 DB 3
1 DB 3
Если задано выражение, то получим макрорасширение:
N = 3
REPT N – 1 ; Выражение
DB N
ENDM
1 DB 3
1 DB 3
В теле цикла могут быть использованы выражения этапа компиляции:
K = 3
N = 65 ; код ’A’
REPT K
DB N
N = N + 1 ; В цикле изменяем переменную
ENDM
1 DB 65
1 N = N + 1
1 DB 66
1 N = N + 1
1 DB 67
Допустимо также использование вложенных циклов:
K = 2
N = 3
REPT K ; Цикл
REPT N ; Вложенный цмкл
DB 0
ENDM
ENDM
1 REPT N
1 DB 0
1 ENDM
2 DB 0 ; Уровень вложенности 2
2 DB 0
2 DB 0
1 REPT N
1 DB 0
1 ENDM
2 DB 0
2 DB 0
2 DB 0
Подчеркнутым шрифтом выделены результаты первого прохода компиляции (уровень 1), а окончательные результаты расширения даны на втором уровне.
Директива IRP имеет следующий синтаксис:
IRP <переменная цикла>,<<список фактических параметров > >
<тело цикла>
ENDM
<список фактических параметров >:= <параметр> |
<параметр> , <список фактических параметров >
Директива IRP повторяет цикл столько раз, сколько указано фактических параметров в угловых скобках (отмечу, что в данном случае это терминальные символы). На каждом шуге цикла значение переменной цикла, являющейся формальным параметром этого цикла последовательно принимает значения из перечня параметров. Пример использования директивы IRP приведен ниже:
IRP p, <AX,BX,CX,DX> ; Четыре регистра
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.