ЛАБОРАТОРНАЯ РАБОТА 4
Тема 8. Создание и использование макроопределений и макрокоманд.
Директивы условного ассемблирования
Ассемблер имеет возможность создания своих макросредств. Для этого задаются: имя макроса, директива MACRO и различные команды ассемблера, которые должен генерировать данный макрос. Завершает все директива ENDM.
<NAME.> MACRO
<тело макроопределения >
ENDM
Затем в любом месте программы, где необходимо выполнение этих команд, достаточно указать имя макроса. В результате Ассемблер сгенерирует необходимые команды.
Использование макрокоманд позволяет:
- Упростить и сократить код программы;
- Сделать более понятной;
- Уменьшить число ошибок.
Макроопределение должно находиться до определения сегмента данных.
В макрокомандах могут быть параметры. В этом случае в определении макроса используются формальные параметры, а при вызове указываются фактические.
write macro mess
mov ah,09h
lea dx, mess
int 21h
endm
В программе ставится вызов макрокоманды WRITE MESSEGE.
Количество параметров может быть любое длиной не более 120 колонок через «,».
Макроопределение может содержать ссылку на другое макроопределение (макрокоманда внутри макрорасширения).
В некоторых макрокомандах требуется определить метки. Но при дублировании макроса возникает ошибка из-за повторения имен. Для универсальности используется директива LOCAL, которая указывается после директивы MACRO.
LOCAL <метка1>,<метка1>…
. . .
<метка1>:
. . .
ENDM
Вместо имени метки генерируются метки ??0000, ??0001, ??0002 и т.д.
Все макрокоманды можно записать в отдельный файл (имя файла любое) и подключать его к основной программе командой
INCLUDE С:\MACRO.LIB
Для исключения не нужных макрокоманд указывается команда
PURGE имя1, имя2, ….
Так как транслятор является двухпроходовым, то для обработки директивы один раз можно использовать конструкцию:
IF1
INCLUDE C:MACRO.LIB
ENDIF
Директивы повторения последовательности строк
while конст. выражение
последов. строк
endm
rept конст. выражение
последов. строк
endm
Директивы условного ассемблирования
IFxxx
Операторы
ELSE
Операторы
ENDIF
IF лог.выражение
IFE лог. выражение
Выполняет проверку выражения. IF обеспечивает ассемблирование, если выражение истинно (!=0), а IFЕ, если выражение ложно (==0).
EQ – равно GT — больше
NE — не равно GE — больше или равно
LT — меньше NOT — не равно
LE — меньше или равно AND, OR, XOR
IFDEF идентификатор
IFNDEF идентификатор
Команда проверяет было ли определено указанное имя. Это имя представляет собой метку, переменную или символьное имя. Директива IFDEF используется, если имя было определено, а IFNDEF, если имя не было определено.
IFB <аргум>
IFNB <аргум>
Проверяет значение заданного аргумента. IFB — если аргумент пустой. IFNB — если аргумент не пустой. Аргументами могут быть имена, числа, выражения. Скобки обязательны. Удобно использовать для проверки пустых параметров в макрокомандах (если было задано меньше параметров, то им присваивается 0).
IFIDN <аргум1>,<аргум2>
IFDIF <аргум1>,<аргум2>
Сопоставляют указанные аргум1 и аргум2. IFIDN сравнивает, если они идентичны (посимвольно совпадают), IFDIF – если, они различны. В качестве аргументов могут быть любые имена, числа, выражения. Скобки обязательно.
ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ
Используя макроопределения решить следующие задачи:
- В киоске продаются газеты — 3 коп. и журнал — 20 коп. Спросить желание покупателя (журнал или газета), получить деньги и распечатать сдачу.
- Напишите программу, которая получает строку и слово. С помощью макроса определите входит ли данное слово в строку.
- В продаже книг участвует ЭВМ. Составить программу, которая запрашивает стоимость книг, сумму денег, внесенную покупателем, определяет сдачу (если денег больше — печатает на сколько, если равно, то печатает «спасибо», если меньше — то сколько нужно доплатить).
- Даны три точки A(x1, y1), В(х2, у2) и С(х3, у3). Определить, какая из них ближе к началу координат (вычисление корня квадратного выполнить приблизительно).
- Дана длина ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба.
- Составить программу, реализующую эпизод сказки: спрашивает куда предпочитает пойти герой: (направо, налево, прямо) и печатает, что его ждет в каждом случае.
- Написать программу, которая спрашивала бы сокращенное имя, а печатала бы полное. В случае незнакомого имени – печатать «Я с Вами не знакома».
- Ученикам 1-го класса назначается дополнительный стакан молока 200 мл., если их вес меньше 30 кг. Ввести в программу вес каждого ученика, после взвешивания и рассчитать сколько молока потребуется на класс.
- Услуги телефонной сети оплачиваются по следующему правилу: за разговоры до А минут в месяц оплачиваются В p., а разговоры сверх установленной нормы оплачиваются из расчета С р. в минуту. Написать программу, вычисляющую плату за пользование телефоном для введенного времени разговоров за месяц.
- Грузовой автомобиль выехал из одного города в другой со скоростью vl км/ч. Через t ч в этом же направлении выехал легковой автомобиль со скоростью v2 км/ч. Составить программу, определяющую, догонит ли легковой автомобиль грузовой через tl ч после своего выезда.
- Напишите программу, в которой вводится массив целых чисел. С помощью макроса отсортируйте массив любым известным алгоритмом.
- Напишите программу, в которой вводятся целые числа а, b, c. Найти max{min(a, b), min(c, d)}, для чего написать макрокоманды определения max и min.
- Даны три точки A(x1, y1), В(х2, у2) и С(х3, у3). Определить, будут ли они расположены на одной прямой. Если нет, то вычислить <ABC.
- Заданы координаты трех вершин треугольника (х1, y1), (х2, у2), (х3, у3). Найти его периметр и площадь.
ВОПРОСЫ К ЗАЩИТЕ ЛАБОРАТОРНОЙ РАБОТЫ
- Что такое макрокоманда и как она создается в Ассемблере.
- Как указывается и обрабатывается макрокоманда в программе?
- Использование макрокоманд с параметрами.
- Как создаются библиотеки макроопределений и как их подключить к программе на языке Ассемблера.
- Как исключить ассемблирование ненужных макроопределений.
- Как исключить дублирование меток в макрокоманде?
- Использование макрокоманд внутри макроопределений.
Директивы условного ассемблирования.