Статус нашего сайта: |
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 |
Таненбаум Э.- Архитектура компьютера. стр.405CHANGE 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. В качестве символа возврата каретки используется точка с запятой, а в качестве символа формального параметра — амперсант. |