Статус
нашего
сайта:
ICQ Secrets Center is Online  ICQ Information Center


ICQ SHOP
     5-значные
     6-значные
     7-значные
     8-значные
     9-значные
     Rippers List
ОПЛАТА
СТАТЬИ
СЕКРЕТЫ
HELP CENTER
OWNED LIST
РОЗЫСК!New!
ICQ РЕЛИЗЫ
Протоколы ICQ
LOL ;-)
Настройка компьютера
Аватарки
Смайлики
СОФТ
     Mail Checkers
     Bruteforces
     ICQTeam Soft
     8thWonder Soft
     Other Progs
     ICQ Patches
     Miranda ICQ
ФорумАрхив!
ВАШ АККАУНТ
ICQ LiveJournal

Реклама

Наш канал:

irc.icqinfo.ru

Таненбаум Э.- Архитектура компьютера. стр.404


Таненбаум Э.- Архитектура компьютера. стр.404

Макровызовы не следует путать с вызовами процедур. Основное отличие состоит в том, что макровызов — это команда ассемблеру заменить имя макроса телом макроса. Вызов процедуры — это машинная команда, которая, будучи вставлена в объектную программу, позднее должна быть выполнена для вызова процедуры. В табл. 7.3 сравниваются макровызовы и вызовы процедур.

Таблица 7.3. Сравнение макровызовов и вызовов процедур

Когда совершается вызов?

Макровызов

Во время ассемблирования

Вызов процедуры

Во время выполнения программы

Вставляется ли тело макроса или процедуры в объектную программу каждый раз, когда совершается вызов?

Да

Нет

Вставляется ли в объектную программу, команда вызова процедуры, которая затем выполняется?

Нет

Да

Нужно ли после вызова использовать команду возврата?

Нет

Да

Сколько копий тела макровызова или процедуры появляется в объектной программе?

Одна на каждый макровызов

Одна

Можно считать, что процесс ассемблирования проходит в два прохода. На первом проходе сохраняются все макроопределения, а макровызовы расширяются. На втором проходе обрабатывается полученный в результате текст. Иными словами, исходная программа считывается, а затем трансформируется в другую программу, из которой удалены все макроопределения и в которой каждый макровызов заменен телом макроса. Полученная программа без макросов затем поступает в ассемблер.

Важно иметь в виду, что программа представляет собой строку символов, каковыми могут быть буквы, цифры, пробелы, знаки пунктуации и символы возврата каретки (перехода на новую строку). При макрорасширении определенные подстроки из этой строки заменяются другими символьными строками. Макросы — средство манипулирования символьными строками без изменения их значения.

Макросы с параметрами

Описанные в предыдущем подразделе макросы можно использовать для сокращения объема программ, в которых часто повторяется одна и та же последовательность команд. Однако иногда программа содержит несколько похожих, но не идентичных последовательностей команд. Например, в листинге 7.6 первая последовательность меняет местами значения переменных Р и Q, а вторая — переменных R и S.

Листинг 7.6. Смена значений двух пар переменных без использования макроса

M0V ЕАХ.Р MOV EBX.Q MOV Q.EAX MOV Р.ЕВХ

MOV EAX.R MOV EBX.S MOV S.EAX MOV R.EBX

Для работы с такими почти идентичными последовательностями предусмотрены макроопределения, предлагающие формальные параметры, и макровызовы, в которых формальные параметры заменяются фактическими параметрами. Фактические параметры помещаются в поле операндов макровызова. В листинге 7.7. представлена программа из листинга 7.6, в которую включен макрос с двумя параметрами. Символы Р1 и Р2 — это формальные параметры. Во время расширения макроса каждый символ Р1 внутри тела макроса заменяется первым фактическим параметром, а символ Р2 — вторым фактическим параметром. Пример:

CHANGE P.Q

В этом макровызове Р — это первый фактический параметр, a Q — второй фактический параметр. Таким образом, программы в листингах 7.6 и 7.7 идентичны.

Листинг 7.7. Смена значений двух пар переменных с использованием макроса


⇐ Предыдущая страница| |Следующая страница ⇒

.