Дипломированных специалистов «Информатика и вычислительная техника»



Download 12,06 Mb.
Pdf ko'rish
bet168/357
Sana22.02.2022
Hajmi12,06 Mb.
#115195
TuriДиплом
1   ...   164   165   166   167   168   169   170   171   ...   357
Bog'liq
assembler uchebnik dlya vuzov 2-e izd YuRXUW1

Макрокоманды
По смыслу макрокоманда представляет собой дальнейшее развитие механизма
замены текста. С помощью макрокоманд в текст программы можно вставлять по-
следовательности строк (которые логически могут быть данными или командами)
и даже более того — привязывать их к контексту места вставки.
Представим ситуацию, когда необходимо выполнить некоторые повторяющи-
еся действия. Механизм макрокоманд предоставляет возможность заменить оди-
наковые участки кода одной строкой, а первоначальный исходный текст описать
один раз в определенном месте программы или во внешнем файле. Дальнейшее
наше обсуждение будет посвящено тому, как это сделать.
Определимся с терминологией. Осмысленное рассмотрение данного механиз-
ма предполагает понимание смысла терминов макрокоманда и макроопределение.
Макрокоманда представляет собой строку, одним из компонентов которой явля-
ется символическое имя макрокоманды. Имя макрокоманды может сопровождать-
ся параметрами. Если данная строка встречается в теле исходного текста програм-
мы, то транслятор замещает ее одной или несколькими другими строками. Какими
именно строками —
 макроопределением, которое представляет собой
шаблон (описание) макрокоманды.
Таким образом, для использования макрокоманды в программе первым делом
задают ее макроопределение. Синтаксис макроопределения следующий:
macro
тело макроопределения
Где должны располагаться макроопределения? Есть три варианта.
Макроопределения могут располагаться в начале исходного текста программы
до сегмента кода и данных с тем, чтобы не ухудшать читабельность программы.
Этот вариант следует применять в случаях, если определяемые вами макроко-
манды актуальны только в пределах одной этой программы.
* Макроопределения могут располагаться в отдельном файле. Этот вариант под-
ходит при работе над несколькими программами одной проблемной области.
Чтобы сделать доступными эти макроопределения в конкретной программе,


298 Глава 14. Макросредства языка ассемблера
необходимо в начале исходного текста этой программы записать директиву
include имя_файла, к примеру:
model small
i
;в это место будет вставлен текст файла
Макроопределения могут располагаться в макробиблиотеке. Если у вас есть
универсальные макрокоманды, которые используются практически во всех ва-
ших программах, то их целесообразно записать в так называемую макробиблио-
теку. Сделать актуальными макрокоманды из этой библиотеки можно с по-
мощью все той же директивы
Недостаток этого и предыдущего способов —
в том, что в исходный текст программы включаются абсолютно все макроопре-
деления. Для исправления ситуации можно задействовать директиву PURGE,
в качестве операндов которой через запятую перечисляются имена макроко-
манд, которые не должны включаться в текст программы. К
include
nc
purge
В данном случае в исходный текст программы перед началом компиляции транс-
лятор TASM вместо строки include iomac.inc вставит строки из файла
отличающиеся от оригинала тем, что в этих строках будут отсутствовать мак-
роопределения
и EXIT.
А теперь вернемся к главе б и вспомним программу из листинга
Проанали-
зируем ее текст, выявим повторяющиеся участки и составим для них макроопре-
деления (листинг 14.1).
Первый пример создания и использования макрокоманд
<1>
с макроопределениями
<2> init_ds macro
<3> ;Макрос настройки ds на сегмент данных
<4>
<5> mov
<6>
<7> out_str macro str
<8> ;Макрос вывода строки на экран.
<9>
входе - выводимая строка.
<10>
выходе - сообщение на экране.
<11> push ax
<12> mov
<13> mov
str
<14> int 21h
<15> pop ax
<16> endm
<18.> clear_r macro rg
<19> ;очистка регистра rg
<20> xor rg,rg
<21> endm
<22>
<23> get_char macro
<24>
символа
<25>
символ в


. Макрокоманды 299
<26> mov
<27> int 21h
<28>
<29>
<30> conv_16_2 macro
преобразования символа
цифры
<32> ;в ее двоичный эквивалент в
<33> sub al,30h
<34>
<35>
$+4
<36> sub
<37> endm
<38>
<39> exit macro
<40>
конца программы
<41> mov
<42> int 21h
<43> endm
<44>
<45> datasegment para public "data"
<46>
db "Введите две
цифры (буквы
-
<47>
<48> stk segment stack
<49> db 256
stk
<51>
<52>
para public "code"
<53> assume
<54> m a i n proc
< 5 5 >
n i t_d s
<56> out_str message
<57> clear_r ax
<58>
<59> conv_16_2
<60> mov
<61> mov cl,4h
<62>
<63>
<64> conv_16_2
<65> add
<66>
в al
<67> e x i t
<68> main endp
<69> code ends
<70> end m a i n
В листинге 14.1 в строках 2-7,
30-37, 39-43 описаны мак-
роопределения. Описание их назначения приведено сразу после заголовка в теле
каждого макроопределения. Если вынести эти макроопределения в отдельный
файл, то впоследствии можно использовать их при написании других программ.
Посмотрите на модернизированный исходный текст программы из листинга
в листинге 14.1 (строки 54-68). Если не обращать внимания на некоторые неяс-
ные моменты, то сам сегмент кода стал внешне более читабельным, и даже можно
сказать, что в его новых командах появился какой-то смысл. Откомпилируйте ли-
стинг
и
файл листинга. После этого сравните текст программы до
и после обработки ассемблером. Вы
что исходный текст изменился, — пос-
ле строк программы, в которых были макрокоманды, появились фрагменты тек-
ста. Содержимое этих фрагментов определяется содержимым макроопределений
(шаблонов), заданных в начале программы. Видно, что путем ввода параметров


300 Глава 14. Макросредства языка ассемблера
для макрокоманды можно модернизировать содержимое фактического текста, за-
мещающего макрокоманду.
Функционально макроопределения похожи на процедуры. Сходство в том, что
и те, и другие достаточно один раз где-то описать, а затем вызывать их специаль-
ным образом. На этом сходство заканчивается и начинаются
которые
в зависимости от целевой установки можно рассматривать и как достоинства, и как
недостатки.
В отличие от процедуры, текст которой неизменен, макроопределение в про-
цессе макрогенерации может меняться в соответствии с набором фактических
параметров. При этом коррекции могут подвергаться как операнды команд, так
и сами команды. Процедуры в этом отношении менее гибки.
При каждом вызове макрокоманды ее текст в виде макрорасширения вставля-
ется в программу. При вызове процедуры процессор осуществляет передачу
управления на начало
находящейся в некоторой области памяти
в одном экземпляре. Код в этом случае получается более компактным, хотя быс-
тродействие несколько снижается за счет необходимости осуществления пере-
ходов.
Макроопределение обрабатывается компилятором особым образом. Для того
чтобы использовать описанное макроопределение, его нужно «активизировать»
с помощью макрокоманды. Для этого в нужном месте исходного кода программы
на основе текста заголовка макроопределения указывается следующая синтакси-
ческая конструкция:
В результате применения данной синтаксической конструкции соответствую-
щая строка исходного текста программы заменяется строками из тела макроопре-
деления. Но это не простая замена. Обычно макрокоманда содержит некоторый
список аргументов (список_фактических_аргументов), которыми корректируется
макроопределение. Места в теле макроопределения, которые будут замещаться
фактическими аргументами из макрокоманды, обозначаются с помощью так на-
зываемых формальных аргументов. Таким образом, в результате применения мак-
рокоманды в программе формальные аргументы в макроопределении замещаются
соответствующими фактическими аргументами; в этом и заключается учет кон-
текста. Процесс такого замещения называется макрогенерацией, а результатом этого
процесса является макрорасширение.
К примеру, рассмотрим самое короткое макроопределение в листинге 14.1 —
Как отмечено ранее, результаты работы макроассемблера можно узнать,
просмотрев файл листинга после трансляции. Покажем несколько его фрагмен-
тов, которые демонстрируют, как был описан текст макроопределения
(стро-
ки 24-27), как был осуществлен вызов макрокоманды
с фактическим па-
раметром ах (строка 74) и как выглядит результат работы макрогенератора,
сформировавшего команду ассемблера
ах,ах (строка 75):
<24> clear_r macro rg
<25> ;очистка регистра rg
<2б>
<27>


Макрокоманды 301
<74> clear_r ax
<75>
33
В итоге мы получили то, что и требовалось, — команду очистки заданного реги-
стра, в данном случае АХ. В другом месте программы вы можете выдать ту же мак-
рокоманду, но уже с другим именем регистра. Если у вас есть желание, можете
провести эксперименты с этой и другими макрокомандами. Каждый фактический
аргумент макрокоманды представляет собой строку символов, для формирования
которой применяются определенные правила.
Строка может состоять:
из последовательности символов без пробелов, точек, запятых, точек запя-
той;
из последовательности любых символов, заключенных в угловые скобки
.>), в которой можно указывать как
так и точки, запятые, точки
с запятыми (мы упоминали об этом операторе выделения ассемблера при
обсуждении директивы EQU).
Для того чтобы указать, что некоторый символ внутри строки, представляю-
щей фактический параметр, является собственно символом, а не чем-то иным,
например, некоторым разделителем или ограничивающей скобкой, применя-
ется специальный оператор !. Этот оператор ставится непосредственно перед
нужным символом, и его действие эквивалентно заключению этого символа
в угловые скобки. Таким образом, оператор ! также является оператором выде-
ления, но одиночного символа.
я Для вычисления в строке, представляющей фактический параметр в макроко-
манде, некоторого константного выражения в начале этого выражения нужно
поставить знак % (процент):
%
Значение
вычисляется и подставляется в текстовом виде
в соответствии с текущей системой
Теперь обсудим вопрос, как транслятор распознает формальные аргументы в те-
ле макроопределения для их последующей замены фактическими аргументами?
Прежде всего по их именам в заголовке макроопределения. В процессе генера-
ции макрорасширения компилятор ассемблера ищет в тексте тела макроопределе-
ния последовательности символов, совпадающие с теми последовательностями
символов, из которых состоят формальные параметры. После обнаружения такого
совпадения формальный параметр из тела макроопределения замещается соответ-
ствующим фактическим параметром из макрокоманды. Этот процесс называется

Download 12,06 Mb.

Do'stlaringiz bilan baham:
1   ...   164   165   166   167   168   169   170   171   ...   357




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish