Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы (книга Комаров) / Программирование на Ассемблере (ч 3).doc
Скачиваний:
143
Добавлен:
08.03.2015
Размер:
540.67 Кб
Скачать

3.15.Макрокоманды

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

3.15.1. Макроопределения и макровызовы

Для создания макрокоманды необходимо дать макроописание выполняемых ею действий. Для этого служат директивы макроопределений MACROиENDM.

Формат макроопределения имеет вид:

Имя_макрокоманды MACRO{Формальный параметр,. . .}

. . . . . . . . . ;Тело макрокоманды

. . . . . . . . . ;(описание выполняемых

. . . . . . . . . ;действий)

ENDM

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

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

Тело макроопределения представляет собой любой текст на ассемблере, описывающий необходимые действия.

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

Имя_макрокоманды {Фактический_параметр,. . .}

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

Пример 3.132:

Создать макрокоманду для вычисленияS=A+B,гдеA,Bнекоторые слова в памяти.

Макроопределение этой команды будет иметь вид:

AddW_Mc MACRO S, A, B

MOV AX, A ; Пересылка операнда

ADD AX, B ; Сложение

MOV S, AX ; Пересылка результата

ENDM

Эта макрокоманда используется путем ее макровызовов следующего вида:

AddW_Mc S1, A1, B1 ;Вычисление S1=A1+B1

AddW_Mc S2, A2, B2 ;Вычисление S2=A2+B2

AddW_Mc Z, 10, Alfa ;Вычисление Z=Alfa+10

AddW_Mc AX, DX, 5 ;Вычисление (AX)=(DX)+5

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

Для контроля за заданием фактических параметров и определения способа обработки их отсутствующих значений могут использоваться директивы условной трансляции IFB,IFNB. Эти директивы записываются в следующем формате:

IFB<Аргумент>;

IFNB <Аргумент>.

Они проверяют значение указанного аргумента, рассматриваемого как строка символов, и вызывают трансляцию нижеследующего программного фрагмента, если аргумент является пробельной строкой (IFB) или отличен от нее (IFNB). В качестве аргумента задается один из формальных параметров макроопределения. Угловые скобки < > обязательны. Зона влияния директивIFBиIFNBограничивается директивойENDIF.

Пример 3.133:

Создать макрокоманду для считывания полного имени человека.

Полное имя человека включает в себя собственно имя First_name, отчество Middle_name и фамилию Last_name. Следовательно, макроопределение для считывания полного имени в общем случае должно иметь вид:

GetName MACRO First_name, Middle_name, Last_name

. . . . . . . . . . ; Эти команды считывают

. . . . . . . . . . ; собственно имя

IFNB <Middle_name>

. . . . . . . . . . ; Эти команды считывают

. . . . . . . . . . ; отчество (при его наличии)

ENDIF

. . . . . . . . . . ; Эти команды считывают

. . . . . . . . . . ; фамилию

ENDM

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

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

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

Для устранения этого противоречия в ассемблере используется директива LOCAL. Эта директива записывается в формате:

LOCALИмя_метки{,Имя_метки . . .}

и обеспечивает локализацию указанных меток исключительно в одном макрорасширении. Директива LOCALобязательно должна следовать сразу же за строкой с директивойMACRO. Между ними недопустимы даже пробельные строки. Использование директивыLOCALприводит к присвоению меткам в каждом макрорасширении уникального имени вида ??N, где N-четырехразрядное 16-ричное число.

Пример 3.134:

Создать макроопределение для реализации временной задержки.

Программная реализация временной задержки сводится к загрузке в регистр некоторого числа и его декрементированию до нулевого значения. Это требует использования метки, и макроопределение будет иметь вид:

Delay MACRO Time

LOCAL M ; Локализация метки

MOV CX, Time ; Загрузка интервала

M:LOOP M ; Временная задержка

ENDM

Макровызовы для реализации задержки осуществляются следующим образом:

Delay 100 ; Задержка на 100 дискрет.

Delay 0 ; Задержка на 65536 дискрет.