Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
166.62 Кб
Скачать

46. Объяснить организацию и применение макрокоманд без параметров.

47. Объяснить организацию и применение макрокоманд с параметрами.

В предыдущем макроопределении требовались фиксированные имена сегментов: CSEG, DSEG и STACK. Для того, чтобы макрокоманда была более гибкой и могла принимать любые имена сегментов, определим эти имена, как формальные параметры: INIT2 MACRO CSNAME,DSNAME,SSNAME ;Формальные параметры ASSUME CS:CSNAME,DS:DSNAME,SC:SSNAME,ES:DSNAME PUSH DS SUB AX,AX PUSH AX MOV AX,DSNAME MOV DS,AX MOV ES,AX ENDM ;Конец макроопределения Формальные параметры в макроопределении указывают ассемблеру на соответствие их имен любым аналогичным именам в теле макроопределения. Все три формальных параметра CSNAME, DSNAME и SSNAME встречаются в директиве ASSUME, а параметр DSNAME еще и в последующей команде MOV. Формальные параметры могут иметь любые правильные ассемблерные имена, не обязательно совпадающими именами в сегменте данных. Теперь при использовании макрокоманды INIT2 необходимо указать в качестве параметров действительные имена трех сегментов в соответствующей последовательности. Например, следующая макрокоманда содержит три параметра, которые соответствуют формальным параметрам в исходном макроопределении: Макроопределение: INIT2 MACRO CSNAME,DSNAME,SSNAME (форм. параметры) Макрокоманда: INIT2 CSEG,DSEG,STACK (параметры)

48) Описать и охарактеризовать дополнительные средства макрокоманд: комментарии, директиву local. Объяснить их использование.

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

mes macro messsage

... ;этот комментарий будет включен в текст листинга

... ;;этот комментарий не будет включен в текст листинга

endm

ДИРЕКТИВА LOCAL в некоторых макрокомандах требуется определять элементы данных или метки команд. При использовании такой макрокоманды в программе более одного раза происходит также неоднократное определение одинаковых полей, данных или меток. В результате ассемблер выдаст сообщения об ошибке из-за дублирования имен. Для обеспечения уникальности, генерируемых в каждом макрорасширении имен используется директива LOCAL, которая кодируется непосредственно после директивы MACRO, даже перед комментариями. Общий формат имеет следующий вид: LOCAL dummy-1,dummy-2,... ;Формальные параметры

49Объяснить использование макрокоманд вложенных и библиотечных

Определение макрокоманд и одноразовое их использование в программе кажется бессмысленным. Лучшим подходом здесь является каталогизация собственных макрокоманд в библиотеке на магнитном диске, используя любое описательное имя, например, MACRO.LIB: INIT MACRO CSNAME,DSNAME,SSNAME . . ENDM PROMPT MACRO MESSGE . . ENDM Теперь для использования любой из каталогизированных макрокоманд вместо MACRO определения в начале программы следует применять директиву INCLUDE: INCLUDE C:MACRO.LIB . . INIT CSEG,DATA,STACK В этом случае ассемблер обращается к файлу MACRO.LIB (в нашем примере) на дисководе C и включает в программу оба макроопределения INIT и PROMPT. Хотя в нашем примере требуется только INIT. Ассемблерный листинг будет содержать копию макроопределения, отмеченного символом C в 30 колонке LST-файла. Следом за макрокомандой идет ее расширение с объектным кодом и с символом плюс (+) в 31 колонке. Так как транслятор с ассемблера является двухпроходовым, то для обеспечения обработки директивы INCLUDE только в первом проходе (а не в обоих) можно использовать следующую конструкцию: IF1 INCLUDE C:MACRO.LIB ENDIF IF1 и ENDIF являются условными директивами. Директива IF1 указывает ассемблеру на необходимость доступа к библиотеке только в первом проходе трансляции. Директива ENDIF завершает IF-логику. Таким образом, копия макроопределений не появится в листинге - будет сэкономлено и время и память.   Макроопределения  могут  быть  вложенными,  т.е.  одно

         макроопределение   может   содержаться  в  другом.  MASM  не

         обрабатывает вложенные макроопределения до тех пор, пока  не

         будет  вызвано  внешнее  макроопределение. Поэтому вложенное

         макроопределение не может быть вызвано до тех пор, пока хотя

         бы  один  раз  не  было  вызвано  внешнее  макроопределение.

         Глубина вложенности может быть произвольной и ограничивается

         лишь размером доступной при ассемблировании памяти.

               Макроопределения   могут   содержать   вызовы   других

         макроопределений. Такие вложенные макровызовы обрабатываются

         так же, как и  другие  макровызовы,  но  лишь  тогда,  когда

         вызвано внешнее макроопределение.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]