Dec ecx
ENDW REPEAT …. Dec ecx .UNTIL ecx=20
Макросы Мá крос (от англ. macros, мн.ч. от macro) — программный объект, который во время вычисления заменяется на новый объект, создаваемый определением макроса на основе его аргументов. Корректный перевод термина с английского — «макрокоманда», слово же «макрос» получило распространение благодаря использованию в локализованных продуктах американской корпорации Microsoft В языке ассемблер, макрос — символьное имя, заменяемое при обработке на последовательность программных инструкций, данных, меток, директив, вызовов других макросов и т.д.. Для каждого компилятора (ассемблера) существует специальный синтаксис объявления и вызова макросов. Макрос может «разворачиваться» в различные последовательности инструкций при каждом вызове — в зависимости от сработавших разветвлений внутри макроса и переданных ему аргументов. Макрос, как и процедура, может принимать входные аргументы. Однако не следует отождествлять макросы и процедуры, так как процедура отделена от основной программы, а макрос является ее частью. Вызов макроса в программе разворачивается в последовательность кода и данных во время ассемблирования. Возможность создания макроса с формальными параметрами рассмотрим на примере: Vivod_stroki macro line Mov ax, offsetline Mov ah, 0s Int 21 Endm
В этом случае при вызове макроса при заданном параметре line будет выводится на экран необходимая строка. Если формальных параметров несколько, то они перечисляются после macro через запятую. Пример создания макроса, читающего файл в doc 16 разрядный ассемблер:
Read macro Fhandle, NOfBytes, Buff Mov bx, FHandle Mov ex, NofBytes Mov dx,.0 Buff Mov al, 3fh Int 21h Endm
В программе вызов макроса будет осуществляться строкой: Read Handle, 16d, packBuff В этом случае из файла с Хендлом по имени Handle будет прочитано 16 байт в буфер packBuff. Если при вызове макроса не нужно указывать все параметры, то существуют специальные директивы ifnb (if not blank) и ifb. Тогда макрос read можно переписать следующим образом:
Read macro Fhandle, NOfBytes, Buff ifnb < Fhandle> Mov bx, FHandle Endif Mov ex, NOfBytes Mov dx,.0 Buff Mov al, 3fh Int 21h Endm
В этом случае подразумевается, что регистр bx уже содержит дескриптор файла в регистре bx и при этом его можно будет пропустить. Часто используемым макросом в программамх для 16-разрядного режима является макрос завершения программы, записываемый в начало программы перед указанием директивы процессора:
|