Макросы и процедуры. Особенности директив повторения. Условные директивы 


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



ЗНАЕТЕ ЛИ ВЫ?

Макросы и процедуры. Особенности директив повторения. Условные директивы



Макрокоманда - это программный инструмент, который позволяет вам создавать собственные операции ассемблера. На самом деле макро- определения относятся к механизму препроцессора. Макропроцессор позволяет определять новые коды операций для процессора. Пр:

hex2ascii macro cmp al,10 sbb al,69h das endm

В использовании макрокоманды можно выделить два шага. На первом шаге макрокоманда определяется в программе. Программист присваивает ей имя и определение. Определение состоит из из операций ассемблера и команд, которые будут генерироваться каждый раз при появлении имени макрокоманды. Второй шаг - применение макрокоманды. Это происходит когда ассемблер встречает ее имя в качестве кода операции. Ассемблер заменяет это имя указанными в определении командами. Оператор MACRO является кодом псевдооперации. Эта конкретная псев- дооперация сообщает ассемблеру, что начинается определение макроко- манды. В поле имени операции указано это имя, которое программа приписывает определяемой макрокоманде, в нашем случае hex2ascii. Команды, которые будут заменять макрокоманды, следуют за строкой заголовка. Наконец, ключевое слово ENDM указывает ассемблеру на конец определения. Текст между операторами MSCRO и ENDM называется телом макрокоманды.

Макрокоманду можно сравнить с подпрограммой. Подпрограмма - это участок программы, определяемый в единственном месте программы, Программа может передать управление подпрограмме из любой своей точки. Использование подпрограмм экономит время написания и объем памяти, занимаемый программой. Вместо того, чтобы каждый раз переписывать команды подпрограммы, когда необходимо ее выполнение, вы вставляете ее вызов. Подпрограмма выполняет свою определенную функцию, и управление возвращантся в точку вызова. Макрокоманда точно также определяется в ассемблируемой программе в единственном месте. После того, как макрокоманда определена, ее можно привлечь в любой точке транслируемой программы. Использование макрокоманды экономит время составления программ и место, занимаемое исходным файлом. Разница между макрокомандой и подпрограммой заключается в моменте их использования. Макрокоманда является операцией текстовой обработки. Она определяется и "выполняется" во время ассемблирования. Выполнение макрокоманды состоит в замене имени макрокоманды текстом, составляющим тело макрокоманды. Подпрограмма же хотя и определяется при ассемблировании, но выполняется не раньше, чем сама программа. Мы будем говорить, что макрокоманда выполняется при ассемблировании, а подпрограмма - во время выполнения программы.

Директивы компиляции по условию

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

Введение в язык ассемблера этих директив значительно повышает его мощь.
Всего имеется 10 типов условных директив компиляции. Их логично попарно объединить в четыре группы:

1. Директивы IF и IFE — условная трансляция по результату вычисления логического выражения.

2. Директивы IFDEF и IFNDEF — условная трансляция по факту определения символического имени.

3. Директивы IFB и IFNB — условная трансляция по факту определения фактического аргумента при вызове макрокоманды.

4. Директивы IFIDN, IFIDNI, IFDIF и IFDIFI — условная трансляция по результату сравнения строк символов.

Условные директивы компиляции имеют общий синтаксис и применяются в составе следующей синтаксической конструкции:

IFxxx логическое_выражение_или_аргументыфрагмент_программы_1 ELSEфрагмент_программы_2ENDIF

Заключение некоторых фрагментов текста программы — фрагмент_программы_1 и фрагмент_программы_2 — между директивами IFxxx, ELSE и ENDIF приводит к их выборочному включению в объектный модуль. Какой именно из этих фрагментов — фрагмент_программы_1 или фрагмент_программы_2 — будет включен в объектный модуль, зависит от конкретного типа условной директивы, задаваемого значением xxx, и значения условия, определяемого операндом (операндами) условной директивы логическое_выражение_или_аргумент(ы).

Синтаксические конструкции, соответствующие директивам условной компиляции, могут быть вложенными друг в друга

Директивы IF и IFE

Синтаксис этих директив следующий:

IF(E) логическое_выражениефрагмент_программы_1 ELSEфрагмент_программы_2ENDIF

Обработка этих директив макроассемблером заключается в вычислении логического_выражения и включении в объектный модуль фрагмент_программы_1 или фрагмент_программы_2 в зависимости от того, в какой директиве IF или IFE это выражение встретилось:

  • если в директиве IF логическое выражение истинно, то в объектный модуль помещается фрагмент_программы_1.
    Если логическое выражение ложно, то при наличии директивы ELSE в объектный код помещается фрагмент_программы_2. Если же директивы ELSE нет, то вся часть программы между директивами IF и ENDIF игнорируется и в объектный модуль ничего не включается. Кстати сказать, понятие истинности и ложности значения логического_выражения весьма условно. Ложным оно будет считаться, если его значение равно нулю, а истинным — при любом значении, отличном от нуля.
  • директива IFE аналогично директиве IF анализирует значение логического_выражения. Но теперь для включения фрагмент_программы_1 в объектный модуль требуется, чтобы логическое_выражение имело значение “ложь”.

Директивы IFDEF и IFNDEF

Синтаксис этих директив следующий:

IF(N)DEF символическое_имяфрагмент_программы_1 ELSEфрагмент_программы_2ENDIF

Данные директивы позволяют управлять трансляцией фрагментов программы в зависимости от того, определено или нет в программе некоторое символическое_имя. Директива IFDEF проверяет, описано или нет в программе символическое_имя, и если это так, то в объектный модуль помещается фрагмент_программы_1. В противном случае, при наличии директивы ELSE, в объектный код помещается фрагмент_программы_2.
Если же директивы ELSE нет (и символическое_имя в программе не описано), то вся часть программы между директивами IF и ENDIF игнорируется и в объектный модуль не включается.

Действие IFNDEF обратно IFDEF. Если символического_имени в программе нет, то транслируется фрагмент_программы_1. Если оно присутствует, то при наличии ELSE транслируется фрагмент_программы_2. Если ELSE отсутствует, а символическое_имя в программе определено, то часть программы, заключенная между IFNDEF и ENDIF, игнорируется.

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

  • если switch = 0, то сгенерировать фрагмент для вычисления выражения
    y = x*2**n;
  • если switch = 1, то сгенерировать фрагмент для вычисления выражения
    y = x/2**n;
  • если switch не определен, то ничего не генерировать.

Директивы IFB и IFNB

Синтаксис этих директив следующий:

IF(N)B аргументфрагмент_программы_1 ELSEфрагмент_программы_2ENDIF

Данные директивы используются для проверки фактических параметров, передаваемых в макрос. При вызове макрокоманды они анализируют значение аргумента, и в зависимости от того, равно оно пробелу или нет, транслируется либо фрагмент_программы_1, либо фрагмент_программы_1. Какой именно фрагмент будет выбран, зависит от кода директивы:

  • Директива IFB проверяет равенство аргумента пробелу. В качестве аргумента могут выступать имя или число.
    Если его значение равно пробелу (то есть фактический аргумент при вызове макрокоманды не был задан), то транслируется и помещается в объектный модуль фрагмент_программы_1.
    В противном случае, при наличии директивы ELSE, в объектный код помещается фрагмент_программы_1. Если же директивы ELSE нет, то при равенстве аргумента пробелу вся часть программы между директивами IFB и ENDIF игнорируется и в объектный модуль не включается.
  • Действие IFNB обратно IFB. Если значение аргумента в программе не равно пробелу, то транслируется фрагмент_программы_1.
    В противном случае, при наличии директивы ELSE, в объектный код помещается фрагмент_программы_1. Если же директивы ELSE нет, то вся часть программы (при неравенстве аргумента пробелу) между директивами IFNB и ENDIF игнорируется и в объектный модуль не включается.

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

show macro regifb display 'не задан регистр'exitmendif...endm

Если теперь в сегменте кода вызвать макрос show без аргументов, то будет выведено сообщение о том, что не задан регистр и генерация макрорасширения будет прекращена директивой exitm.



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 409; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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