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