Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Использование библиотеки макроопределений. ⇐ ПредыдущаяСтр 4 из 4
Определение таких макрокоманд, как INIT1 и INIT2 и одноразовое их использование в программе кажется бессмысленным. Лучшим подходом здесь является каталогизация собственных макрокоманд в библиотеке, используя любое описательное имя, например, MACRO.LIB:
INIT MACRO CSNAME,DSNAME,SSNAME . . ENDM PROMPT MACRO MESSGE . . ENDM
Теперь для использования любой из каталогизированных макрокоманд вместо MACRO определения в начале программы следует применять директиву INCLUDE:
INCLUDE <путь>MACRO.LIB . . INIT CSEG,DATA,STACK
В этом случае ассемблер обращается к файлу MACRO.LIB (в нашем примере) по указанному пути и включает в программу оба макроопределения INIT и PROMPT. Хотя в нашем примере требуется только INIT. Ассемблерный листинг будет содержать копию макроопределения Так как транслятор с ассемблера является двухпроходовым, то для обеспечения обработки директивы INCLUDE только в первом проходе (а не в обоих) можно использовать следующую конструкцию:
IF1 INCLUDE <путь>MACRO.LIB ENDIF
IF1 и ENDIF являются условными директивами. Директива IF1 указывает ассемблеру на необходимость доступа к библиотеке только в первом проходе трансляции. Директива ENDIF завершает IF-логику. Таким образом, копия макроопределений не появится в листинге - будет сэкономлено и время и память. Расположение директивы INCLUDE не критично, но она должна появиться ранее любой макрокоманды из включаемой библиотеки.
(слайд №16) Директива очистки.
Директива INCLUDE указывает ассемблеру на включение всех макроопределений из специфицированной библиотеки. Например, библиотека содержит макросы INIT, PROMPT и DIVIDE, хотя программе требуется только INIT. Директива PURGE позволяет "удалить" нежелательные макросы PROMPT и DIVIDE в текущем ассемблировании:
IF1 INCLUDE <путь>MACRO.LIB ;Включить всю библиотеку ENDIF PURGE PROMRT,DIYIDE ;Удалить ненужные макросы ... INIT CSEG,DATA,STACK ;Использование оставшейся макрокоманды Директива PURGE действует только в процессе ассемблирования и не оказывает никакого влияния на макрокоманды, находящиеся в библиотеке.
Конкатенация (&).
Символ амперсанд (&) указывает ассемблеру на сцепление (конкатенацию) текста или символов. Следующая макрокоманда MOVE генерирует команду MOVSB или MOVSW:
MOVE MACRO TAG REP MOVS&TAG ENDM
Теперь можно кодировать макрокоманду в виде MOVE B или MOVE W. В результате макрорасширения ассемблер сцепит параметр с командой MOVS и получит REP MOVSB или REP MOVSW.
Директивы повторения: REPT, IRP, IRPC.
Директивы повторения заставляют ассемблер повторить блок операторов, завершаемых директивой ENDM. Эти директивы не обязательно должны находиться в макроопределении, но если они там находятся, то одна директива ENDM требуется для завершения повторяющегося блока, а вторая ENDM – для завершения макроопределения.
(слайд №17) REPT: Повторение.
Операция REPT приводит к повторению блока операторов до директивы ENDM в соответствии с числом повторений, указанным в выражении:
REPT выражение
В следующем примере происходит начальная инициализация значения N=0 и затем повторяется генерация db n пять раз:
n = 0 rept 5 n = n + 1 db n endm
В результате будут сгенерированы пять операторов db от db 1 до db 5. Директива rept может использоваться таким образом для определения таблицы или части таблицы. Другим примером может служить генерация пяти команд movsb, что эквивалентно rep movsb при содержимом cx равном 05:
rept 5 movsb endm
IRP: Неопределенное повторение.
Операция IRP приводит к повторению блока команд до директивы endm. Основной формат:
IRP dummy, Аргументы, содержащиеся в угловых скобках, представляют собой любое число правильных символов, строк, числовых или арифметических констант. Ассемблер генерирует блок кода для каждого аргумента. В следующем примере ассемблер генерирует DB 3, DB 9, DB 17, DB 25 и DB 28:
IRP N,<3, 9, 17, 25, 28> DB N ENDM
IRPC: Неопределенное повторение символа.
Операция IRPC приводит к повторению блока операторов до директивы ENDM. Основной формат:
IRPC dummy,string
Ассемблер генерирует блок кода для каждого символа в строке "string". В следующем примере ассемблер генерирует DW 3, DW 4... DW 8:
IRPC N,345678 DW N ENDM
(слайд №18) Условные директивы.
Ассемблер поддерживает ряд условных директив. Условные директивы наиболее полезны внутри макроопределений, но не ограничены только этим применением. Каждая директива IF должна иметь спаренную с ней директиву ENDIF для завершения IF-логики и возможную директиву ELSE для альтернативного действия:
IFxx (условие) . . ELSE (не обязательное действие) . . ENDIF (конец IF-логики)
Обработка данных директив макроассемблером заключается в вычислении логического выражения – условия и включения в объектный модуль либо блок до директивы ELSE, если условие истинно, либо блок до директивы ENDIF, если условие ложно. Отсутствие директивы ENDIF вызывает сообщение об ошибке: "Undeterminated conditional" (незавершенный условный блок). Если проверяемое условие истинно, то ассемблер выполняет условный блок до директивы ELSE или при отсутствии ELSE - до директивы ENDIF. Если условие ложно, то ассемблер выполняет условный блок после директивы ELSE, а при отсутствии ELSE вообще обходит условный блок. (слайд №19) Ниже перечислены различные условные директивы:
(слайд №20) Ниже приведен простой пример директивы IFNB (если не пробел). Для DOS INT 21H все запросы требуют занесения номера функции в регистр AH, в то время как лишь некоторые из них используют значение в регистре DX. Следующее макроопределение учитывает эту особенность:
DOS21 MACRO DOSFUNC,DXADDRES MOV AH,DOSFUNC IFNB MOV DX,OFFSET DXADDRES ENDIF INT 21H ENDM Использование DOS21 для простого ввода с клавиатуры требует установки значения 01 в регистр AH:
DOS21 01 Ассемблер генерирует в результате команды MOV AH,01 и INT 21H. Для ввода символьной строки требуется занести в регистр AH значение 0AH, а в регистр DX - адрес области ввода:
DOS21 0AH,IPFIELD Ассемблер генерирует в результате обе команды MOV и INT 21H.
|
|||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2022-09-03; просмотров: 72; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.115.120 (0.022 с.) |