Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Макросы и процедуры. Особенности директив повторения. Условные директивы
Макрокоманда - это программный инструмент, который позволяет вам создавать собственные операции ассемблера. На самом деле макро- определения относятся к механизму препроцессора. Макропроцессор позволяет определять новые коды операций для процессора. Пр: hex2ascii macro cmp al,10 sbb al,69h das endmВ использовании макрокоманды можно выделить два шага. На первом шаге макрокоманда определяется в программе. Программист присваивает ей имя и определение. Определение состоит из из операций ассемблера и команд, которые будут генерироваться каждый раз при появлении имени макрокоманды. Второй шаг - применение макрокоманды. Это происходит когда ассемблер встречает ее имя в качестве кода операции. Ассемблер заменяет это имя указанными в определении командами. Оператор MACRO является кодом псевдооперации. Эта конкретная псев- дооперация сообщает ассемблеру, что начинается определение макроко- манды. В поле имени операции указано это имя, которое программа приписывает определяемой макрокоманде, в нашем случае hex2ascii. Команды, которые будут заменять макрокоманды, следуют за строкой заголовка. Наконец, ключевое слово ENDM указывает ассемблеру на конец определения. Текст между операторами MSCRO и ENDM называется телом макрокоманды. Макрокоманду можно сравнить с подпрограммой. Подпрограмма - это участок программы, определяемый в единственном месте программы, Программа может передать управление подпрограмме из любой своей точки. Использование подпрограмм экономит время написания и объем памяти, занимаемый программой. Вместо того, чтобы каждый раз переписывать команды подпрограммы, когда необходимо ее выполнение, вы вставляете ее вызов. Подпрограмма выполняет свою определенную функцию, и управление возвращантся в точку вызова. Макрокоманда точно также определяется в ассемблируемой программе в единственном месте. После того, как макрокоманда определена, ее можно привлечь в любой точке транслируемой программы. Использование макрокоманды экономит время составления программ и место, занимаемое исходным файлом. Разница между макрокомандой и подпрограммой заключается в моменте их использования. Макрокоманда является операцией текстовой обработки. Она определяется и "выполняется" во время ассемблирования. Выполнение макрокоманды состоит в замене имени макрокоманды текстом, составляющим тело макрокоманды. Подпрограмма же хотя и определяется при ассемблировании, но выполняется не раньше, чем сама программа. Мы будем говорить, что макрокоманда выполняется при ассемблировании, а подпрограмма - во время выполнения программы.
Директивы компиляции по условию Данные директивы предназначены для организации выборочной трансляции фрагментов программного кода. Такая выборочная компиляция означает, что в макрорасширение включаются не все строки макроопределения, а только те, которые удовлетворяют определенным условиям. То, какие конкретно условия должны быть проверены, определяется типом условной директивы. Введение в язык ассемблера этих директив значительно повышает его мощь. 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 это выражение встретилось:
Директивы IFDEF и IFNDEF Синтаксис этих директив следующий: IF(N)DEF символическое_имяфрагмент_программы_1 ELSEфрагмент_программы_2ENDIFДанные директивы позволяют управлять трансляцией фрагментов программы в зависимости от того, определено или нет в программе некоторое символическое_имя. Директива IFDEF проверяет, описано или нет в программе символическое_имя, и если это так, то в объектный модуль помещается фрагмент_программы_1. В противном случае, при наличии директивы ELSE, в объектный код помещается фрагмент_программы_2. Действие IFNDEF обратно IFDEF. Если символического_имени в программе нет, то транслируется фрагмент_программы_1. Если оно присутствует, то при наличии ELSE транслируется фрагмент_программы_2. Если ELSE отсутствует, а символическое_имя в программе определено, то часть программы, заключенная между IFNDEF и ENDIF, игнорируется. В качестве примера рассмотрим ситуацию, когда в объектный модуль программы должен быть включен один из трех фрагментов кода. Какой из трех фрагментов будет включен в объектный модуль, зависит от значения некоторого идентификатора switch:
Директивы IFB и IFNB Синтаксис этих директив следующий: IF(N)B аргументфрагмент_программы_1 ELSEфрагмент_программы_2ENDIFДанные директивы используются для проверки фактических параметров, передаваемых в макрос. При вызове макрокоманды они анализируют значение аргумента, и в зависимости от того, равно оно пробелу или нет, транслируется либо фрагмент_программы_1, либо фрагмент_программы_1. Какой именно фрагмент будет выбран, зависит от кода директивы:
В качестве типичного примера применения этих директив предусмотрим строки в макроопределении, которые будут проверять, указывается ли фактический аргумент при вызове соответствующей макрокоманды:
Если теперь в сегменте кода вызвать макрос show без аргументов, то будет выведено сообщение о том, что не задан регистр и генерация макрорасширения будет прекращена директивой exitm.
|
|||||||
Последнее изменение этой страницы: 2017-02-06; просмотров: 409; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.189.145.20 (0.01 с.) |