- •Методические указания
- •«Моделирование программы гипотетической машины с помощью макросредств»
- •1.Введение.
- •2.Пример выполнения курсовой работы.
- •2.1.Задание.
- •2.2.Анализ задачи и разработка алгоритма.
- •2.3.Разработка программы для гм.
- •2.3.1. Определение данных.
- •2.3.2.Определие команд гм.
- •2.4.Моделирование программы гм на реальной эвм.
- •2.4.1.Выборка и запиь слов гм.
- •2.4.2. Макроопрделения для команд гм.
- •2.5.Технология подготовки программы к выполнению и ее отладка.
- •2.6. Результаты работы программы
- •3. Варианты курсовой работы
- •4.Приложения
- •2. Блоки повторения
- •2.1. Rept-блоки
- •Irpc-блоки
- •2.4 Макрооператоры
- •3. Макросы
- •113.1. Макроопределения
- •3.1. Макрокоманды
- •3. 3. Макроподстановки и макрорасширения
- •3. 5. Макросы и процедуры
- •3. 6. Определение макроса через макрос
- •3.7. Директива local
- •113.8. Директива ехiтм
- •3. 9. Переопределение и отмена макросов
- •4. Условное ассемблирование
- •4. 1. Директивы if и ife
- •4.2. Операторы отношения. Логические операторы
- •4.3. Директивы ifidn ,ifdif , ifb и ifnb
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.