Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсач гофаров 5 вариант.doc
Скачиваний:
6
Добавлен:
03.05.2019
Размер:
608.77 Кб
Скачать

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

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

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

<заголовок>

<тело>

ENDM

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

REPT-блоки, IRP-блоки и IRPC-блоки.

2.1. Rept-блоки

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

REPT k

<ТЕЛО>

ENDM

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

rерт 3

SНR АХ,1

ENDM

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

SНR АХ,1

SНR АХ,1

SНR АХ,1

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

N EQU 6 N EQU 6

REPT N-4 DB 0,1

DB 0,1  DW ?

DW ? DB 0,1

ENDM DW ?

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

X DB 0 X DB 0

K=0 K=0

REPT 99 K=K+1

K=K+1  DB K 99 таких пар

DB K K=K+1

ENDM DB K

. . .

2.2. IRР-блоки

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

IRP p,<v1, .... vk>

<тело>

ENDM

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

Здесь р - некоторое имя, оно играет роль формального (фиктивного) параметра и может использоваться в предложениях тела. vi - это фактические параметры; это любые тексты (возможно, и пустые), но, чтобы не было путаницы, они должны быть сбалансированы по кавычкам и не должны содержать запятые, точки с запятой и уголки вне кавычек Параметры vi перечисляются через запятую, а вся их совокупность обязательно заключается в угловые скобки.Встречая такой блок, макрогенератор заменяет его на k копий тела (по одной на каждый фактический параметр), причем в i -й копии все вхождения имени р заменяются на vi . Например:

IRP REG,<AX,CX SI> PUSH AX

PUSH REG  PUSH CX

ENDM PUSH SI

Отметим, что формальный параметр локализуется в теле блока (им нельзя пользоваться вне блока) и может быть любым именем. Если оно совпадает с именем другого объекта программы, то в теле блока оно обозначает именно параметр, а не этот объект. Например, в блоке

IRP BX,<1,5>

ADD AX,BX

ENDM

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

ADD AX,1

ADD AX,5

Замены формального параметра на фактические - это чисто текстуальные подстановки, без учета смысла: просто один участок текста (р) заменяется на другой (vi). При этом параметром р можно обозначить любую часть предложения (в частности, участки комментария) или даже целиком все предложение (однако два и более предложений он не может обозначать), лишь бы после замены р на vi получались правильные предложения ЯА. Например:

IRP Q,<DEC WORD PTR, L: INC> DEC WORD PTR W

Q W JMP M2

JMP M2  L: INC W

ENDM JMP M2

Отметим также, что в теле блока повторения заменяется только формальный параметр, другие имена (например, имена констант) переносятся в копии тела без изменений. Например:

N EQU 1  N EQU 1

IRP P,<A,B> A EQU N (но не A EQU 1)

P EQU N B EQU N

Другие особенности записи формальных и фактических параметров будут рассмотрены в разд. 2.4.