Статус
нашего
сайта:
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

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


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

CHANGE MACRO Р1.Р2 MOV ЕАХ.Р1 MOV EBX.P2 MOV P2.EAX MOV Pl.EBX ENDM

CHANGE P.Q

CHANGE R.S

Дополнительные возможности

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

MASM и большинство других ассемблеров позволяют определять макросы внутри других макросов. Эта особенность очень полезна в сочетании с условным ассемблированием программы. Обычно один и тот же макрос определятся в обеих ветвях оператора IF:

Ml MACRO

IF WORDSIZE GT 16 M2 MACRO

ENDM ELSE M2 MACRO

ENDM ENDIF ENDM

В любом случае макрос М2 будет определен, но определение зависит от того, на какой машине ассемблируется программа: на 16-разрядной или на 32-разрядной. Если Ml не вызывается, макрос М2 вообще не будет определен.

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

Реализация макросов в ассемблере

Для реализации макросов ассемблер должен уметь выполнять две функции: сохранять макроопределения и расширять макровызовы. Мы рассмотрим эти функции по очереди.

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

Когда встречается макроопределение, создается новый элемент таблицы с именем макроса, числом параметров и указателем на другую таблицу, в которой будет храниться тело макроса. В этот момент также создается список формальных параметров. Затем считывается тело макроса и сохраняется в таблице макроопределений. Формальные параметры, которые встречаются в теле цикла, указываются специальным символом. Ниже приведен пример внутреннего представления макроса CHANGE. В качестве символа возврата каретки используется точка с запятой, а в качестве символа формального параметра — амперсант.


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

.