Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






TITLE Macro File





может быть внесено в исходный файл для создания заголовка «Macro File», но в результате будет создано макроопределение с именем TITLE, имеющее формальный параметр File, а, поскольку в этом случае, очевидно, не будет предусмотрена директива ENDM, закрывающая макроопределение, будет скорее всего генерироваться сообщение об ошибке.

Следует помнить, что MASM замещает все вхождения имени формального параметра в теле макроопределения его фактическим значением, даже если программисту это не нужно. Например, если формальный параметр имеет имя AX, в генерируемом макрорасширении MASM замещает все вхождения AX на значение фактического параметра. Если же по логике макроопределения необходимо использование регистра AX, а не одноименного формального параметра, код макрорасширения может быть некорректным.

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

dostuff MACRO

...

dostuf MACRO

...

ENDM

;; Ошибочная строка

ENDM

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

Общий вид макровызова:

имя [[фактический-параметр,...]]

Имя должно быть именем ранее определенного в исходном файле макроопределения. Фактическим параметром может быть имя, число или другое значение. Допустимо любое число фактических параметров, но все они должны помещаться на одной строке. Элементы списка параметров должны разделяться запятыми, пробелами, или TAB-символами.

MASM замещает первый формальный параметр на первый фактический параметр, второй формальный параметр на второй фактический параметр. Если фактических параметров в макровызове больше, чем формальных параметров в макроопределении, лишние фактические параметры игнорируются. Если же фактических параметров меньше, чем формальных, формальные параметры, для которых не заданы фактические, замещаются пустыми строками (пробелами). Для определения того, заданы или не заданы соответствующие фактические параметры могут быть использованы директивы IFB, IFNB, .ERRB и .ERRNB.

В макросредствах языка Ассемблера имеется возможность передавать список значений в качестве одного параметра. Этот список должен быть заключен в одинарные скобки < и >, а сами элементы списка — разделяться запятыми. Пример:

allocb <1,2,3,4>

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

Формат:

LOCAL формальное-имя,...

Формальное-имя может затем использоваться в данном макроопределении с уверенностью, что при каждом макровызове его значение будет уникальным. В директиве LOCAL, если она присутствует, должно быть задано хотя бы одно имя, а если их несколько, они должны разделяться запятыми.

Для обеспечения уникальности определенных директивой LOCAL имен MASM для каждого такого имени при каждом макровызове порождает реальное имя следующего вида:

??номер

Номер представляет собой 16-ричное число в пределах от 0000 до FFFF. Для предотвращения повторного определения имен программисту не рекомендуется определять в своей программе имена этого типа.

Директива LOCAL может использоваться только в макроопределении, причем, там она должна предшествовать всем другим предложениям макроопределения, то есть, следовать непосредственно после MACRO.

Для удаления макроопределений служит директива PURGE.

Формат:

PURGE имя-макроопределения,...

Удаляются все текущие макроопределения с указанными именами. Последующий вызов одного из этих макроопределений будет приводить к ошибке.

Директива PURGE введена для возможности освобождения и повторного использования памяти, занимаемой неиспользуемыми в дальнейшем макроопределениями. Если имя-макроопределения представляет мнемонику инструкции или директивы, восстанавливается первоначальный смысл мнемоники в соответствии со значением данного ключевого слова.

Директива PURGE часто используется для удаления ненужных макроопределений из подключаемой директивой INCLUDE библиотеки макроопределений. Библиотека макроопределений представляет собой обычный последовательный файл, который в общем случае может содержать большое число макроопределений. Комбинация директив INCLUDE и PURGE позволяет выбрать из них только нужные для данной программы, что сократит размер исходного файла.

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

 

Конец текущего макроопределения обозначается директивой ENDM, которая должна находиться в последней строке макроопределения.

Формат:

ENDM

Выход из текущего макроопределения до достижения директивы ENDM обеспечивается директивой EXITM, имеющей следующий формат:

EXITM

Выход из макроопределения по директивам ENDM и EXITM заключается в прекращении генерации текущего макрорасширения и возврате в точку вызова текущего макроопределения в динамически внешнем макрорасширении или в исходной программе.

Пример:

add MACRO param

IFB param

EXITM

ENDIF

ADD AX,param

ENDM

В этом мароопределении осуществляется добавление величины, определяемой формальным параметром param, к содержимому регистра AX. Блок условного ассемблирования IFB обеспечивает выход из макроопределения, если при вызове параметр не был задан.

Date: 2015-05-22; view: 491; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию