|
Это может
быть истолковано, как необходимость соблюдения строгого правила
ввода исходного текста программы с клавиатуры.
Листинг 1-9. Тест макро сравнения имен регистров - ?reg
-----------------------------------------------------------------
?reg ax ; "AX" - регистр ?
FFFF dw ?isr16 <--- TRUE
?reg CS ; "CS" - регистр ?
FFFF dw ?isr16 <--- TRUE
?reg zork ; "ZORK" - регистр ?
0000 dw ?isr16 <--- FALSE
0000 dw ?isr8 <--- FALSE
?reg 01234h ; "1234" - регистр ?
0000 dw ?isr16 <--- FALSE
0000 dw ?isr8 <--- FALSE
?reg bР ; "BP" - регистр ?
0000 dw ?isr16 <--- FALSE
0000 dw ?isr8 <--- FALSE
-----------------------------------------------------------------
Синтаксический анализ аргументов макро
С помощью макро, распознающего имена регистров, можно реализо-
вать обобщенное макро PUSH, которое мы назовем @PUSHOP (протолк-
нуть операнд). |
panda 2007 |
|
|
(Замечание: мы рассматриваем имя pusha для " про-
толкнуть все", но PUSHA является кодом операции для чипов 186,188
и 286 фирмы Intel. Использование его для макро может ограничить
совместимость снизу вверх. |
резервное копирование файлов |
|
{img3} |
программа резервного копирования |
|
Конечно, Вы всегда можете использовать
команду PUSHA в макро pusha для микропроцессоров 8086 и 8088).
Как упоминалось ранее относительно типа операнда, который не
- 1-27 -
определен и не является регистром, необходимо делать некоторые
предположения. Для макро @PUSHOP предположим, что неизвестные
операнды являются ссылками на непосредственные данные. |
win zip |
|
|
домашняя бухгалтерия, системы управления базой данных, система распознавания текста, asplinux 11, avast edition, .
сетевой экран
|
Во-вторых, необходимо проводить две проверки: одну для
16-битовых регистров и одну для 8-битовых регистров. В данной ре-
ализации наличие двух отдельных проверок не приносит нам никакой
выгоды, однако такие проверки окажутся полезными в следующем при-
мере.
Макро ?reg имеет два дополнительных синтаксических элемента.
Один - директива завершения макро EXITM. Эта директива использу-
ется для завершения работы макро ?reg при обнаружении совпадения.
Менее очевидно использование двойного амперсанда в операторе
IFIDN. Согласно Руководству по MASM фирмы Майкрософт пользователь
должен "указывать столько амперсандов, сколько имеется уровней
вложенности". Столь лаконичное выражение не вносит ясности в ре-
шение проблемы. "Уровни вложенности" относятся не к глубине бло-
ков, где появляется ссылка, а к глубине блоков, где находится ее
описание. Таким образом, arg1 приводится только с одним амперсан-
дом, в то время как reg, описание которого находится во вложенном
блоке, требует наличия двух амперсандов. Фирма Майкрософт не ут-
верждает, что это предел разрешенного количества уровней вложен-
ности или количества требуемых амперсандов. В тех случаях, когда
казалось бы необходимо указывать множество амперсандов, попытки
написания примеров, позволяющих выявить правильное функционирова-
ние, не увенчались успехом.
Приведенный Листинг 1-9 с макро ?reg показывает, что это макро
выполняет возложенную на него функцию. Заметьте,что регистр bР,
который распознается MASM, отбрасывается макро ?reg.
|
|
|