Ü
"РЛ" - Н А Ч И Н А Ю Щ И М
[}
место при использовании модульного принципа про-
граммирования, однако его применение начинающи-
ми мне представляется неактуальным.
Главное, что вы должны помнить, описывая и ис-
пользуя макросы, так это то, что передача
парамет-
ров
в макрос не означает передачи
значений
этих па-
раметров! Если, например, в ранее описанный мак-
рос вы попытаетесь передать в качестве параметра
имя какой-то ячейки, то результат будет плачевным:
GoSub
Counter,
12,
RO
приведет к формированию такого кода:
MOV
A,
#Counter
MOV
R5,
#12
MOV
R
6
, RO
CALL
Subroutine
Как видите, в первой команде происходит пересыл-
ка в аккумулятор не содержимого ячейки Counter, а
ее адреса, что, естественно, приведет к непредсказу-
емому поведению подпрограммы.
Кроме простых макроподстановок, имеются особые
макрокоманды, выполняющие достаточно серьезную
работу. Правильнее было бы назвать их не макроса-
ми, а
макрооператорами,
и, кстати, почти такой тер-
мин и используется в некоторых иностранных источ-
никах. Будем использовать этот термин и мы, чтобы
хоть как-то их отделить от обычных макроподстано-
вок.
Макрооператор повтора REPT. Описывается сле-
дующим образом:
REPT
<кол-во повторов»
<тело>
ENDM
Этот макрооператор заставляет компилятор повто-
рить указанное число раз все, что находится в теле.
Например:
REPT
6
NOP
ENDM
приведет к генерации следующего кода:
NOP
NOP
NOP
NOP
NOP
NOP
Этот макрооператор в отличие от обычного макро-
са не может быть вызван по имени, т.к. не может иметь
имя, его надо явно указывать в нужных местах. Ка-
жется, что он не может дать какого-то существенного,
облегчения труда, однако не следует забывать прави-
ло видимости имен, ведь в нем не указывается, что
'речь идет
только
об именах меток, значит, оно дей-
ствует для
любых
имен. Посмотрите пример:
CNT
VAR
5
REPT
5
DB
CNT
CNT
VAR
CNT+1
ENDM
Сначала мы описываем именованную константу
CNT, причем используем директиву VAR, которая в от-
личие от EQU допускает переопределение константы.
Затем макрооператором REPT пять раз повторяем
пару строк - директиву описания байта и директиву
переопределения константы, т.е. на каждой итерации
повторения мы будем получать значение CNT на
1
больше, чем ранее. В итоге компилятор сформирует
следующий код:
DB
5
DB
6
DB
7
DB
8
DB
9
Это уже интересно, не правда ли? То есть с помо-
щью макрооператора REPT мы легко можем форми-
ровать сколь угодно большие ряды чисел. Если учесть,
что в директиве VAR мы можем использовать практи-
чески любые формулы для вычисления очередного
значения, легко понять, что возможности тут широчай-
шие! Кроме того, зто ведь не последний макроопера-
тор ©. Есть еще IRP:
IRP
<Параметр>, «ссписок значений»
<тело»
ENDM
Этот макрооператор выполняет повтор тела
столько раз, сколько значений указано в списке, при
этом на каждой итерации параметр получает очеред-
ное значение из списка. Например:
IRP
Е1, 1,7 ,2 2 ,3 3
MOV
РО , #Е1
ENDM
приводит к генерации следующего кода:
MOV
РО, #1
MOV
РО, #7
MOV
РО, #22
MOV
РО, #33
А вот макрооператор IRPC имеет почти такой же
формат, как IRP, но вместо списка использует строку
символов, т.е. позволяет обрабатывать строки посим-
вольно:
IRPC
Е 1, 'П р и ве т'
MOV
РО, #Е1
ENDM
сгенерирует
MOV
РО, # 'П '
MOV
РО, # 'р '
MOV
РО, # ' и '
MOV
РО, # ' в '
MOV
РО, #'е'
MOV
РО, # 'т '
Конечно, использовать зти макрооператоры для
вывода строк, как показано в примерах, не очень оп-
тимально, ведь если строка длинная, то и команд по-
лучится много, цикл для таких целей гораздо лучше.
Но назначение этих макрооператоров не ограничива-
ется этим примером, его гораздо удачнее применять,
например, для “шифрования” строк в своих программах,
32
U Радиолюбитель - 0 2 /2 0 0 8
предыдущая страница 32 Радиолюбитель 2008-02 читать онлайн следующая страница 34 Радиолюбитель 2008-02 читать онлайн Домой Выключить/включить текст