Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LK_MashZavYP_Akchurin_2011.pdf
Скачиваний:
191
Добавлен:
10.06.2015
Размер:
8.79 Mб
Скачать

9.11. Макроязык и макрокоманды

Ассемблер поддерживает макроязык, который дает Вам возможность создать ваши собственные команды. Это особенно полезно, когда программа выполняет частные задачи несколько раз. Макроязык позволяет Вам:

Определить ваши собственные макрокоманды, и переопределить существующие макрокоманды.

Упростить длинный или сложный ассемблерный код.

Обратиться к макробиблиотекам, созданным архиватором.

Определить условные и повторяемые блоки в пределах макрокоманд.

Управлять строками в пределах макрокоманд.

Управлять листингом расширения макрокоманд.

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

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

Использование макрокоманды - процесс из 3 шагов. Шаг 1: Определение макрокоманды

Вы должны определить макрокоманды прежде, чем Вы можете использовать их в вашей программе. Имеются два метода для определения макрокоманд:

Макрокоманды могут быть определены в начале исходного файла или в копируемом / включаемом файле.

Макрокоманды могут также быть определены в макробиблиотеке. Макробиблиотека является собранием файлов в формате архива, созданном архиватором. Каждый элемент архивного файла (макробиблиотеки) может содержать одно макроопределение, соответствующее имени этого элемента. Вы можете обратиться к макробиблиотеке, используя .mlib директиву.

477

Шаг 2: Вызов макрокоманды

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

Шаг 3: Расширение макрокоманды

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

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

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

имя макрокоманды .macro [параметр 1] [, ..., параметр n]

Имя макрокоманды называет макрокоманду. Вы должны поместить имя в поле метки исходной инструкции. Только первые 128 знаков имени существенны. Ассемблер размещает макро-имя во внутренней таблице кодов операций, заменяя любую команду или прежнее макроопределение, имеющее то же самое имя.

Директива .macro идентифицирует исходную инструкцию, как первую строку макроопределения. Вы должны разместить .macro в поле кода операции.

478

Параметр 1,…, параметр n - являются необязательными символами замены, которые появляются как операнды директивы .macro.

Пример. Определение, вызов и расширение макрокоманды. Код определяет макрокоманду sadd4 с четырьмя параметрами r1, r2, r3, r4.

1

sadd4

.macro r1,r2,r3,r4

2

sadd4

r1, r2 ,r3, r4

4r1 = r1 + r2 + r3 + r4

5.endm

Макровызов: следующий код вызывает макрокоманду sadd4 с четырьмя параметрами:

10

 

 

11

00000000

sadd4 A0,A1,A2,A3

Макробиблиотеки. Один из способов определения макрокоманд - создание макробиблиотеки. Макробиблиотека - собрание файлов, которые содержат макроопределения. Вы должны использовать архиватор, чтобы собрать эти файлы, или элементы, в одном файле (называемом архивом). Каждый элемент макробиблиотеки содержит одно макроопределение. Файлы в макробиблиотеке должны быть не оттранслированными исходными файлами. Имя макрокоманды и имя элемента должны быть одинаковыми, а расширение имени файла с макрокомандой должно быть .asm.

Например:

Макрокоманда

Имя файла в макробиблиотеке

simple

simple.asm

add3

add3.asm

Вы можете обращаться к макробиблиотеке, используя .mlib директиву ассемблера. Синтаксис: .mlib имя файла

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

479

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

Рекурсивные и вложенные макрокоманды. Макроязык поддерживает рекур-

сивные и вложенные макровызовы. Это означает, что Вы можете вызывать другие макрокоманды внутри макроопределения. Вы можете вкладывать макрокоманды глубиной до 32 уровней. Когда Вы используете рекурсивные макрокоманды, Вы вызываете макрокоманду из ее собственного определения (макрокоманда вызывает саму себя).

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

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

.macro, .mexit, .endm и .var допустимы только с макрокомандами; оставшиеся директивы - общие директивы языка ассемблера.

Создание макрокоманд:

Мнемоника и синтаксис

 

Описание

 

 

 

.endm

 

Завершает макроопределение

 

имя

.macro [параметр 1] [, ..., па-

 

Определяет макрокоманду с указанным

раметр n]

 

именем

 

 

 

.mexit

 

Выполняет переход к .endm

 

.mlib

имя файла

 

Указывает

библиотеку,

содержащую

 

 

 

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

 

 

Управление символами замены:

 

 

 

 

 

 

 

 

 

 

 

Мнемоника и синтаксис

 

Описание

 

 

 

.asg

[“]строка знаков[“]

 

Назначает

знаковую строку

символу

 

 

 

замены

 

 

 

.eval

четкое выражение, символ за-

 

Исполняет

арифметику

на

числовом

мены

 

символе замены

 

 

.var

символ 1 [, символ 2, ..., символ

 

Определяет

локальные

символы

n]

 

 

макрокоманды

 

 

480

Условная трансляция:

Мнемоника и синтаксис

 

Описание

.break

[четкое

 

Прерывает трансляцию повторяемого блока (необя-

выражение]

 

 

зательная)

.endif

 

 

Заканчивает условную трансляцию

.endloop

 

 

Заканчивает трансляцию повторяемого блока

.else

 

 

Необязательный условный блок

.elseif

четкое

 

Необязательный условный блок

выражение

 

 

 

.if четкое выражение

 

Начинает условную трансляцию

.loop

[четкое

 

Начинает трансляцию повторяемого блока

выражение]

 

 

 

Создание сообщений во время трансляции:

 

 

 

Мнемоника и синтаксис

 

Описание

.emsg

 

 

Посылает сообщение об ошибке стандартному уст-

 

 

 

ройству вывода

.mmsg

 

 

Посылает сообщение стандартному устройству вы-

 

 

 

вода

.wmsg

 

 

Посылает предупреждение стандартному устройству

 

 

 

вывода

Форматирование листинга:

 

 

 

 

Мнемоника и синтаксис

 

Описание

.fclist

 

 

Разрешает распечатку ложных условных блоков (по

 

 

 

умолчанию)

.fcnolist

 

 

Подавляет распечатку ложных условных блоков

.mlist

 

 

Разрешает распечатку макрокоманды (по умолча-

 

 

 

нию)

.mnolist

 

 

Подавляет распечатку макрокоманды

.sslist

 

 

Разрешает распечатку расширений символов заме-

 

 

 

ны

.ssnolist

 

 

Подавляет листинг расширений символов замены

 

 

 

(по умолчанию)

481

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]