Использование параметров в макрокомандах. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование параметров в макрокомандах.



 

В предыдущем макроопределении требовались фиксированные имена сегментов: cseg, dseg и stack. Для того, чтобы макрокоманда была более гибкой и могла принимать любые имена сегментов, определим эти имена, как формальные параметры:

 

Пример2:

init2 macro csname,dsname,ssname                           ;Формальные параметры

assume                   cs:csname,ds:dsname,ss: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 необходимо указать в качестве параметров действительные имена трех сегментов в соответствующей последовательности (фактические параметры – это аргументы, передаваемый в макрос при его вызове).

 

(слайд №12)

Например, следующая макрокоманда содержит три параметра, которые соответствуют формальным параметрам в исходном макроопределении:

 

Макроопределение: init2 macro csname,dsname,ssname     (форм. параметры)

|   |      |

Макрокоманда:    init2           cseg, dseg, stack                  (параметры)

 

Так как ассемблер уже определил соответствие между формальными параметрами и операторами в макроопределении, то теперь ему остается подставить параметры макрокоманды в макрорасширении:

  • Параметр 1: cseg ставится в соответствие с csname в макроопределении. Ассемблер подставляет cseg вместо csname в директиве assume.
  • Параметр 2: dseg ставится в соответствие с dsname в макроопределении. Ассемблер подставляет dseg вместо двух dsname: в директиве assume и в команде mov.
  • Параметр 3: stack ставится в соответствие с ssname в макроопределении. Ассемблер подставляет stack вместо ssname в директиве assume.

 

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

 


(слайд №13)

Комментарии.

 

Комментарии – это пояснения к исходному тексту программы, находящиеся непосредственно внутри комментируемого кода.

Для пояснений назначения макроопределения в нем могут находиться комментарии. Директива comment или символ «;» указывают на строку комментария.

Так как по умолчанию в листинг попадают только команды генерирующие объектный код, то ассемблер не будет автоматически выдавать и комментарии, имеющиеся в макроопределении. Если необходимо, чтобы в расширении появлялись комментарии, следует использовать перед макрокомандой директиву.lall ("list all" - выводить все), которая кодируется вместе с лидирующей

точкой:

.lall

<имя_макроса>    [<формальные_параметры_макроса>]

 

Макроопределение может содержать несколько комментариев, причем некоторые из них могут выдаваться в листинге, а другие - нет. В первом случае необходимо использовать директиву.lall. Во втором – кодировать перед комментарием два символа точка с запятой (;;) - признак подавления вывода комментария в листинг. По умолчанию в ассемблере действует директива.xall, которая выводит в листинг только команды, генерирующие объектный код. И, наконец, можно запретить появление в листинге ассемблерного кода в макрорасширениях, особенно при использовании макрокоманды в одной программе несколько раз. Для этого служит директива.sall ("suppress all" - подавить весь вывод), которая уменьшает размер выводимого листинга, но не оказывает никакого влияния на размер объектного модуля.

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

(слайд №14)

Использование макрокоманд в макроопределениях.

Макроопределение может содержать ссылку на другое макроопределение.

Рассмотрим простое макроопределение dos21, которое заносит в регистр ah номер функции dos и выполняет int 21h:

 

dos21 macro dosfunc

mov ah,dosfunc

int   21h

endm

 

Для использования данной макрокоманды при вводе с клавиатуры необходимо закодировать:

 

lea  dx,namepar

dos21 0ah

 

Предположим, что имеется другое макроопределение, использующее функцию 02 в регистре ah для вывода символа:

 

disp macro char

mov ah,02

mov dl,char

int   21h

endm

 

Для вывода на экран, например, звездочки достаточно закодировать макрокоманду disp '*'. Можно изменить макроопределение disp, воспользовавшись макрокомандой dos21:

 

disp macro char

mov dl,char

dos21 02

endm

 

Теперь, если закодировать макрокоманду disp в виде disp '*', то ассемблер сгенерирует следующие команды:

 

mov dl,'*'

mov ah,02

int   21h

 

Директива local.

 

В некоторых макрокомандах требуется определять элементы данных или метки команд. При использовании такой макрокоманды в программе более одного раза происходит также неоднократное определение одинаковых полей данных или меток. В результате ассемблер выдаст сообщения об ошибке из-за дублирования имен. Для обеспечения уникальности генерируемых в каждом макрорасширении имен используется директива local, которая кодируется непосредственно после директивы macro, даже перед комментариями. Общий формат имеет следующий вид:

 

local dummy-1,dummy-2,;Формальные параметры

 

(слайд №15)



Поделиться:


Последнее изменение этой страницы: 2022-09-03; просмотров: 65; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.207.174 (0.009 с.)