Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M2 / Лекция 2.doc
Скачиваний:
16
Добавлен:
16.04.2013
Размер:
207.36 Кб
Скачать

Id_table label byte

len=ln

while len

db 0

len=len-1

endm

endm

def_sto_2 macro id_table,len

;макрос резервирования памяти длиной len

Id_table label byte

rept len

db 0

endm

endm

data segment para public 'data'

def_sto_1 tab_1,10

def_sto_2 tab_2,10

data ends

;сегменты команд и стека в этой программе необязательны

end

Заметьте, что счетчик повторений в директиве REPTуменьшается автоматически после каждой итерации цикла.

Таким образом, директивы REPTиWHILEудобно применять для “размножения” в тексте программы последовательности одинаковых строк без внесения в эти строки каких-либо изменений.

Следующие две директивы, IRPи,IRPCделают этот процесс более гибким, позволяя модифицировать на каждой итерации некоторые элементы впоследовательности_строк.

Директива IRPимеет следующий синтаксис:

Irp формальный_аргумент,

<строка_символов_1,...,строка_символов_N>

последовательность_строк

ENDM

Действие данной директивы заключается в том, что она повторяет последовательность_строк N раз, то есть столько раз, сколько строк_символовзаключено в угловые скобки во втором операнде директивыIRP. Но это еще не все.

Повторение последовательности_строксопровождается заменой в нейформального_аргументастрокой символов из второго операнда.

Так, при первой генерации последовательности_строкформальный_аргументв них заменяется настрока_символов_1.

Если есть строка_символов_2, то это приводит к генерации второй копиипоследовательности_строк, в которойформальный_аргументзаменяется настрока_символов_2. Эти действия продолжаются дострока_символов_Nвключительно.

К примеру, рассмотрим результат определения в программе следующей конструкции:

irp ini,<1,2,3,4,5>

db ini

endm

Макрогенератором будет сгенерировано следующее макрорасширение:

db 1

db 2

db 3

db 4

db 5

Директива IRPCимеет следующий синтаксис:

Irpc формальный_аргумент,строка_символов

последовательность строк

ENDM

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

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

К примеру:

Irpc rg,

push rg&x

endm

Директивы условной компиляции.

Последний тип макросредств — директивы условной компиляции.

Существует два типа этих директив:

  • директивы компиляции по условиюпозволяют проанализировать определенные условия в ходе генерации макрорасширения и, при необходимости, изменить этот процесс;

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

С этими директивами применяются директивы управления процессом генерации макрорасширений EXITMиGOTO.

Директива EXITMне имеет операндов, и ее действие заключается в том, что она немедленно прекращает процесс генерации макрорасширения, начиная с того места, где она встретилась в макроопределении.

Директива GOTOимя_меткипереводит процесс генерации макроопределения в другое место, прекращая тем самым последовательное разворачивание строк макроопределения.Метка, на которую передается управление, имеет специальный формат:

:имя_метки

Примеры применения этих директив будут приведены ниже.

Директивы компиляции по условию.

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

Введение в язык ассемблера этих директив значительно повышает его мощь. Всего имеется 10 типов условных директив компиляции. Их логично попарно объединить в четыре группы:

  1. Директивы IFиIFE– условная трансляцияпо результату вычисления логического выражения.

  2. Директивы IFDEFиIFNDEF– условная трансляцияпо факту определения символического имени.

  3. Директивы IFBиIFNB– условная трансляцияпо факту определения фактического аргумента при вызове макрокоманды.

  4. Директивы IFIDN,IFIDNI,IFDIFиIFDIFI– условная трансляцияпо результату сравнения строк символов.

Условные директивы компиляции имеют общий синтаксис и применяются в составе следующей синтаксической конструкции: