Endm L: inc word ptr W

Jmp M

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

3) Вид заголовка:IRPC P , S1S2….SK

IRPC P , S1S2….SK

<тело>

еndm

P - формальный параметр, Si –символы, любые, кроме пробелов и точки с запятой, если необходимо использовать здесь пробел или точку с запятой, то надо всю последовательность символов записать в угловых скобках. Встречая такой блок, макрогенератор заменяет его на k копий тела так, что в i-той копии параметр Р заменен на символ Si. Например:

IRPC A, 175P add AX , 1

add AX, A → add AX , 7

endm add AX , 5

add AX , P

31) Макрооператоры в Ассемблере

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

1) & - амперсанд – используется для того, чтобы указать границы формального параметра, выделить его из окружающего текста, при этом в текст программы он не записывается. Например:

а) IRP W, <1,5,7> var1 DW ?

VAR&W DW? → var5 DW ?

endm var7 DW ?

б) IRPC A, ″ < DB ′A, ″, ″B′

DB ′A, &A, &A&B′ → DB ′A, <, <B’

endm

Здесь параметры W и А заменяются на фактические параметры только в том месте, где они выделены макрооператором &.

Если знаков & рядом несколько, то макрогенератор удаляет за один проход только один из них, и это используется для организации вложенных блоков повторений и макросов. Например:

…………………………..

IRPC P1, AB IRPC P2, HL inc AH

IRPC P2, HL inc A&P2 inc AL

inc P1&&P2 → endm → inc BH

endm IRPC P2, HL inc BL

endm inc B&P2

endm

2) Макрооператор < > -угловые скобки действует так, что весь текст, заключенный в эти скобки, рассматривается как одна текстовая строка, и в неё могут входить пробелы, запятые и другие разделители. Этот макрооператор часто используется для передачи текстовых строк в качестве параметров для макросов и для передачи списка параметров вложенному макроопределению или блоку повторений.

а) IPR V , <<1,2>,3> DB 1,2

DB V → DB 3

endm

б) IRPC S, <A; B> DB ´A´

DB ´S´ → DB ´ ; ´

endm DB ´B´

Если в примере б) скобок < > не будет, то символ В будет восприниматься как комментарий после;

3) Макрооператор ! - восклицательный знак используется аналогично угловым скобкам, но действует только на один следующий символ, так что, если этим символом является один из символов ограничения - запятая, угловая скобка и т.д., то он будет передаваться как параметр или часть параметра.

4) Макрооператор % - процент указывает на то, что следующий за ним текст является выражением, которое должно быть вычислено, и результат передается как параметр. Например:

K EQU 4

………… DW k+1

IRP A, <k+1, % k+1, W% k+1> DW 5

DW A → DW W5

Endm

5) Макрооператор ;; - две точки с запятой определяют начало макрокомментария. Текст макрокомментария не включается в макрорасширения и в листинг программы.

22) Макросы в Ассемблере, их описание и использование

Описание макроса, макроопределение, имеет вид:

<имя макроса> Macro <формальные параметры>

LOCAL <список имен>

<тело>

Endm

Первая строка - это заголовок макроса, имя макроса будет использоваться для обращения к этому Макроопределению. Формальные параметры записываются через запятую и/или пробел, это локальные имена, никак не связанные с объектами программы. Количество Формальных параметров не ограничено, но они должны умещаться в одной строке. Поскольку на место каждой Макрокоманды записывается Макрорасширение, кроме того, одни и те же метки могут использоваться и в самой программе, чтобы не возникало ошибки «метка уже определена», директива LOCAL <список имен> перечисляет через запятую имена меток, которые будут использоваться в теле макроса. <тело> - это копируемый фрагмент программы, любое количество любых директив и команд Ассемблера, в которых используются формальные параметры.

Макрокоманда – обращение к макросу:<имя макроса> <фактические параметры>

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

С помощью директивы EXITM можно осуществить досрочный выход из макроса, если использовать команды условной генерации IF x … endif.

C помощью директивы PURGE <имя макроса> можно отменить определенный ранее макрос. Эта директива часто используется сразу после директивы INCLUDE, включившей в текст программы файл с большим количеством готовых макроопределений.

Примеры макросов

1)Использование макросов позволяет составлять программу в терминах более крупных операций. Опишем в виде макроса оператор IF x< y then GOTO L.

IF_L MACRO x, y, L

Mov AX, x

Cmp AX, Y

Jl L

Endm

Используя этот макрос, поиск После макрогенерации в программе будет текст:

минимального из 3-х чисел запишется так: ------------------------------

; DX = min (A,B,C) mov DX, A

Mov DX, A mov AX, A

IF_L A, B, M1 cmp AX, B

Mov DX, B jl, M1

M1: IF_L DX, C, M2 mov DX, B

Mov DX, C M1: mov AX, DX

M2: ---------------------- cmp AX, C

Jl M2

Mov DX, C

M2: ------------------------------

2) Обращение к процедурам будет нагляднее, если передачу параметров оформить как макрос.

Например: Вычислить CX = NOD(A,B) + NOD(C,D), если есть процедура вычисления NOD(x,y), и результат ее находится в АХ.

CALL_NOD MACRO x, y

Mov AX, x

Mov BX, y

call NOD ; (AX) = NOD(x, y)

Endm

Наши рекомендации