Директивы WHILE и REPT
Директивы WHILE и REPT применяют для повторения определенное количество раз некоторой последовательности строк.
Эти директивы имеют следующий синтаксис:
WHILE константное_выражение последовательность_строк ENDM |
REPT константное_выражение последовательность строк ENDM |
Обратите внимание, что последовательность повторяемых строк в обеих директивах ограничена директивой ENDM.
При использовании директивы WHILE макрогенератор транслятора будет повторять последовательность_строк до тех пор, пока значение константное_выражение не станет равно нулю. Это значение вычисляется каждый раз перед очередной итерацией цикла повторения (то есть значение константное_выражение
должно подвергаться изменению внутри последовательность_строк
в процессе макрогенерации).
Директива REPT, подобно директиве WHILE, повторяет последовательность_строк столько раз, сколько это определено значением константное_выражение. Отличие этой директивы от WHILE состоит в том, что она автоматически уменьшает на единицу значение константное_выражение после каждой итерации.
В качестве примера рассмотрим листинг 4, в котором демонстрируется применение директив WHILE и REPT для резервирования области памяти в сегменте данных. Имя идентификатора и длина области задаются в качестве параметров для соответствующих макросов def_sto_1 и def_sto_2.
Листинг 4. Использование директив повторения ;prg_13_3.asm def_sto_1 macro id_table,ln:=
;макрос резервирования памяти длиной len. ;Используется WHILE id_table label byte len=ln while len db 0 len=len-1 endm endm def_sto_2 macro id_table,len ;макрос резервирования памяти длиной len id_table label byte rept len db 0 endm endm data segment para public 'data' def_sto_1 tab_1,10 def_sto_2 tab_2,10 data ends ;сегменты команд и стека в этой программе необязательны end |
Заметьте, что счетчик повторений в директиве REPT
уменьшается автоматически после каждой итерации цикла. Проанализируйте результат трансляции листинга 13.3.
Таким образом, директивы REPT и WHILE удобно применять для “размножения” в тексте программы последовательности одинаковых строк без внесения в эти строки каких-либо изменений.
Следующие две директивы, и , делают этот процесс более гибким, позволяя модифицировать на каждой итерации некоторые элементы в последовательность_строк.