Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lec_asm_06_3495.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
178.18 Кб
Скачать

13.3. Псевдооператоры макроассемблера

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

13.3.1. Псевдооператор local

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

Таким образом, если макроопределение содержит помеченные команды или псевдооператоры, то необходимо указать Ассемблеру, чтобы он изменял метки при каждом расширении макроопределения. Сообщает Ассемблеру, какие метки должны изменяться при каждом расширении, псевдооператор LOCAL. Псевдооператор имеет формат

LOCAL [список формальных параметров]

Он заставляет Ассемблер создать уникальное имя для каждой метки из списка формальных параметров и подставить это имя при каждом вхождении метки в расширение макроопределения.

Пример.

Рассмотрим макроопределение, которое заставляет микропроцес­сор ожидать, пока значение COUNT не уменьшится до нуля.

WAIT MАCRO COUNT

LOCAL NEXT

PUSH CX ; Сохранить текущее значение CX

МOV CX, COUNT ; Поместить счетчик в CX

NEXT: LOOP NEXT ; Повторять, пока счетчик не обратится в 0

POP CX ;Восстановить исходное значение СХ

ENDM

Указание метки NEXT в операторе LOCAL позволяет нам пользоваться этим макроопределением в прог­рамме более одного раза.

Оператор LOCAL должен следовать непосредственно за операто­ром MACRO. Если требуется несколько операторов LOCAL, то они должны быть первыми операторами в макроопределении. Они должны предшествовать любому другому оператору и даже комментариям.

Указание метки в операторе LOCAL также означает, что можно использо­вать такую же метку в других макроопределениях. Ассемблер дает ей новое внутреннее имя всякий раз, когда расширяет макроопределение; таким образом дублирование меток исключается.

13.3.2. Псевдооператоры повторения

Псевдооператоры повторения заставляют Ассемблер повторить в макроопределении последовательность операторов на языке ассемблера.

Псевдооператор REPT имеет формат:

REPT выражение

. . .

ENDM

Он получает свой счетчик числа повторений из выражения, указанного в поле операнда.

Пример.

Следующее макроопределение зарезерви­рует LENGTH байтов памяти и присвоит им в качестве начальных значений числа от 1 до LENGTH:

ALLOCATE MACRO TLABEL, LENGTH

TLABEL EQU THIS BYTE

VALUE = 0

REPT LENGTH

VALUE = VALUE + 1

DB VALUE

ENDМ

ENDM

Обратите внимание на то, что здесь нам понадобились два оператора ENDM: одним отмечен конец действия псевдооператора REPT, а другим – конец макроопреде­ления.

После задания макроопределения ALLOCATE им можно воспользоваться для создания 40-байтовой таблицы TABLE1, указав такую последовательность опера­торов:

DATA SEGMENT PARA DATA

ALLOCATE TABLE1, 40

DATA ENDS

Псевдооператор повторения IRP имеет формат:

IRP параметр, < список аргументов >

. . .

ENDM

Он заставляет Ассемблер повторять находящиеся между псевдооперато­рами IRP и ENDM операторы по одному разу для каждого аргумента списка. При каждом повторении производится подстановка очередно­го аргумента вместо каждого вхождения параметра в блок операторов.

Пример. Последовательность операторов

IRP VALUE , < 1, 2, 3, 5, 7 >

DW VALUE*VALUE*VALUE

ENDM

создаст таблицу из 5 слов, содержащую кубы первых 5 простых чисел.

Псевдооператор IRPC похож на псевдооператор IRP, но его аргументами явля­ются не числа, а строковые переменные. Формат:

IRPC параметр, строка

. . .

ENDM

Он заставляет Ассемблер повторять находящиеся между псевдооперато­рами IRPC и ENDM операторы по одному разу для каждого символа строки. При каждом повторении производится подстановка очередного символа строки вместо каждого вхождения параметра в блок операторов.

Пример.

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

IRPC CHAR, 01234

DB CHAR

ENDM

создает в памяти 5-байтовую строку символов, содержащую ASCII-коды цифр от 0 до 4.

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