II
"РЛ" - Н А Ч И Н А Ю Щ И М
II
одинаковые. Например, мы используем часто подпрог-
рамму, которая использует в качестве своих рабочих
параметров значения аккумулятора и двух регистров
Я5 и Яб. Для вызова этой подпрограммы нам прихо
дится постоянно использовать подобный код:
MOV
A,
#Constl
MOV
R5,
#Const2
MOV
R
6
, Меті
CALL
Subroutine
Если это приходится делать часто, то, мягко гово-
ря, это утомляет. Для облегчения рутинного труда про-
граммиста специально придуман метод, получивший
название макроподстановок или
макрокоманд
(очень
часто используют еще более простой термин -
м ак-
рос).
Сущность этого метода в том, что мы обознача-
ем группу команд программы при помощи специаль-
ных директив описания макроса, назначаем имя этой
группе, а затем в своей программе используем это имя
вместо нашей группы команд. Компилятор, встретив
в тексте имя макроса, осуществляет простую подста-
новку на его место той самой ранее описанной груп-
пы команд, после чего ее компилирует. Таким обра-
зом, макросы служат только для сокращения числа
вводимых команд вручную, но не приводит к сокра-
щению объема кода. Кроме команд в теле макроса
могут быть использованы любые допустимые дирек-
тивы, а также имена других макросов, т.е. возможно-
сти весьма широкие.
Простейшее описание тела макроса осуществля-
ется при помощи пары директив MACRO - ENDM:
<ИмяМакроса> MACRO [Параметры]
[Тело макроса]
ENDM
Каждой директиве MACRO обязательно должна со-
ответствовать завершающая директива ENDM. В ка-
честве параметров могут быть использованы любые
допустимые в тексте программы символы: имена ре-
гистров, метки, константы, выражения и т.п., если па-
раметров несколько, то они перечисляются через за-
пятую. При описании макроса используются условные
имена параметров, а при компиляции вместо этих ус-
ловных значений будут подставлены фактически пе-
реданные параметры.
Вот пример простого макроса, реализующего вы-
шеупомянутый вызов подпрограммы:
MACRO
A l, A2, A3
MOV
A,
#A1
MOV
R5,
#A2
MOV
R
6
, A3
CALL
Subroutine
ENDM
Когда в программе нам потребуется осуществить
вызов подпрограммы Subroutine, мы просто укажем
имя нашего макроса с нужными параметрами:
GoSub
C onstl,
Const2, Meml
В результате чего компилятор вставит в это место
точно такой же код, как был приведен в начале главы в
качестве примера. Если потребуется повторить действие,
но уже с другими параметрами, мы напишем, напри-
мер, так:
GoSub
12,
30,
Counter
И компилятор поместит в это место очень похожий
код:
MOV
A,
#12
MOV
R5,
#30
MOV
R
6
,
Counter
CALL
Subroutine
Внутри тела макроса, как я уже говорил, допуска-
ется использовать имена других макросов, любые ко-
манды. Некоторое ограничение накладывается на ис-
пользование меток внутри макроса. Дело в том, что
любая метка в тексте ассемблерной программы явно
задает соответствующий адрес, поэтому недопусти-
мо наличие нескольких меток с одинаковыми имена-
ми. Если в теле макроса мы зададим какую-либо мет-
ку, то, встретив в программе имя макроса, компиля-
тор просто подставит на это место код тела макроса,
а значит и нашу метку. Если этот же макрос затем бу-
дет встречен компилятором еще раз, он сделает то же
самое, и в программе окажется уже две одинаковых
метки - компилятор выдаст ошибку. Чтобы получить
возможность использования в теле макроса меток, не-
обходимо ограничить их “видимость” только телом
макроса, т.е. вне его метка перестает существовать.
Делается это при помощи директивы LOCAL:
LOCAL <список имен>
Как и ранее, если меток нам надо несколько, то их
имена следует перечислить через запятую (или исполь-
зовать несколько директив LOCAL). Вот пример описа-
ния макроса с использованием локальной метки:
Wait
MACRO
D elta
LOCAL
M l, М2
MOV
A,
D elta
JZ
М
2
Ml:
DEC
A
JNZ
Ml
М
2
:
ENDM
Встретив ссылку на макрос с локальными метками
в теле, компилятор будет подставлять не имена ме-
ток, а фактически вычисленные адреса, т.е. в тексте
программ метки М1 и М2 просто не будут существо-
вать. Если внутри макроса используется другой мак-
рос, то для него описанные локальные метки “охваты-
вающего” макроса будут уже видимы, а вот имя тако-
го вложенного макроса будет не видно вне “охватыва-
ющего”. Таким образом, правило видимости имен мож-
но сформулировать так:
все локально описанные име-
на видимы (доступны) только внутри охватывающего
их тела макроса.
Н ебольш ое отступление. Подобное правило ви-
димости может быть расширено и на программные мо-
дули, т.е. вся программа представляет собой некое по-
добие всеохватывающего макроса ©. Несмотря на всю
натянутость такого сравнения, оно действительно имеет
Радиолюбитель - 0 2 /2 0 0 8 [|
31
предыдущая страница 31 Радиолюбитель 2008-02 читать онлайн следующая страница 33 Радиолюбитель 2008-02 читать онлайн Домой Выключить/включить текст