Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 133

Unknown Author

Именно такой макроассемблер используется в рассматриваемой нами системе MASM. Этим и объясняется полное название ее входного языка - язык макроассемблера (macroassembler language, MASM). Однако в дальнейшем мы по-прежнему будем называть его языком ассемблера (сокращенно - ЯА), используя термин "макроязык" для обозначения только набора макросредств, а термин "макрогенератор" для обозначения той части макроассемблера, что занимается обработкой этих макросредств. Кроме того, термином "окончательная программа" мы будем называть ту программу, которая получается после работы макрогенератора, которая затем переводится (собственно) ассемблером на машинный язык и выполняется.

11.2. Блоки повторения

Иногда в некотором месте программы приходится выписывать несколько раз подряд один и тот же (или почти один и тот же) фрагмент, и хотелось бы, чтобы мы сами выписывали этот фрагмент только раз, а макрогенератор размножал его нужное число раз. Такая возможность предусмотрена в ЯА, и реализуется она с помощью блоков повторения (repeat blocks).

Блок повторения имеет следующую структуру:

<заголовок>

<тело>

ENDM

Здесь <тело> - любое число любых предложений (в частности, ими могут быть снова блоки повторения), a ENDM - директива, указывающая на конец тела и всего блока повторений. Встречая в исходном тексте программы такой блок, макрогенератор подставляет вместо него в окончательную программу несколько Копий тела.

При дублировании тело может выписываться без каких-либо изменений, а мо-Кет копироваться и с модификациями. Как именно происходит дублирование, Только копий создается - все это зависит от заголовка блока. Имеется три разновидности заголовка, в связи с чем различают три варианта блока повторения: ^ЕРТ-блоки, IRP-блоки и IRPC-блоки.

11.2.1. REPT-блоки

Этот тип блоков повторения записывается следующим образом:

*ЕРТ к ^ело>

'^иалог-мифи”

Здесь к - константное выражение с неотрицательным значением. Эго выражение должно быть таким, чтобы можно было вычислить его сразу (например, в нем не должно быть ссылок вперед). Вычислив значение £ макрогенератор создает к точных копий тела блока и подставляет их в окон, чательный текст программы. Например, по блоку

REPT 3 SHR АХ,1 ENDM

будет построен следующий фрагмент окончательной программы:

SHR АХ,1 SHR АХ,1 SHR АХ,1

Другой пример (слева указан фрагмент исходной программы, справа • построенный по нему фрагмент окончательной программы):

N EQU б    N EQU б

Отметим, что в блоках повторения довольно часто используется директива присваивания (=). Например, описать 100-байтовый массив X, элементы которого имеют начальные значения от 0 до 99, можно так (справа указан текст окончательной программы, который фактически эквивалентен директиве

X DB 0,1,2,3,.

...99):

X DB 0

X DB 0

К=0

К=0

REPT 99

К=К+1

|

К=К+1

DB К

=>

DB К

К=К+1

}■    99 таких пар

ENDM

DB К

J

1122. IRP-блоки

Блоки повторения этого типа имеют следующий вид:

IRP p,<vl, ..., vk>

<тело>

ENDM

(Замечание: уголки в записи <vl, ... ,vk> - это явно указываемые символ*1 а не метасимволы.)