Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
9
1. Макродирективы
С помощью макросредств ассемблера можно не только частично изменять входящие в макроопределение строки, но и модифицировать сам набор этих строк и даже порядок их следования. Сделать это можно с помощью набора макродиректив (далее просто директив). Их можно разделить на две группы:
- директивы повторения WHILE, REPT, IRP и IRPC. Директивы этой группы предназначены для создания макросов, содержащих несколько идущих подряд одинаковых последовательностей строк. При этом возможна частичная модификация этих строк.
- директивы управления процессом генерации макрорасширения EXITM и GOTO. Они предназначены для управления процессом формирования макрорасширения из набора строк соответствующего макроопределения. С помощью этих директив можно как исключать отдельные строки из макрорасширения, так и вовсе прекращать процесс генерации. Директивы EXITM и GOTO обычно используются вместе с условными директивами компиляции, поэтому они будут рассмотрены вместе с ними.
Директивы WHILE и REPT
Директивы WHILE и REPT применяют для повторения определенное количество раз некоторой последовательности строк. Эти директивы имеют следующий синтаксис:
WHILE константное_выражение
последовательность_строк
ENDM
REPT константное_выражение
последовательность строк
ENDM
Следующие две директивы, IRP и IRPC, делают этот процесс более гибким, позволяя модифицировать на каждой итерации некоторые элементы в последовательность_строк.
Директива IRP
Директива IRP имеет следующий синтаксис:
IRP формальный_аргумент, <строка_символов_1,...,строка_символов_N>
последовательность_строк
ENDM
Действие данной директивы заключается в том, что она повторяет последовательность_строк N раз, то есть столько раз, сколькострок_символов заключено в угловые скобки во втором операнде директивы IRP. Повторение последовательности_строк сопровождается заменой в ней формального_аргумента строкой символов из второго операнда. Так, при первой генерации последовательности_строкформальный_аргумент в них заменяется на строка_символов_1.
Если есть строка_символов_2, то это приводит к генерации второй копии последовательности_строк, в которой формальный_аргументзаменяется на строка_символов_2. Эти действия продолжаются до строка_символов_N включительно.
К примеру, рассмотрим результат определения в программе следующей конструкции:
irp ini,<1,2,3,4,5>
db ini
endm
Макрогенератором будет сгенерировано следующее макрорасширение:
db 1
db 2
db 3
db 4
db 5
Директива IRPC
Директива IRPC имеет следующий синтаксис:
IRPC формальный_аргумент,строка_символов
последовательность строк
ENDM
Действие данной директивы подобно IRP, но отличается тем, что она на каждой очередной итерации заменяет формальный_аргументочередным символом из строка_символов.
Понятно, что количество повторений последовательность_строк будет определяться количеством символов в строка_символов. К примеру:
irpc rg,
push rg&x
endm
В процессе макрогенерации эта директива развернется в следующую последовательность строк:
push ax
push bx
push cx
push dx
Директивы условной компиляции
Директива EXITM не имеет операндов, и ее действие заключается в том, что она немедленно прекращает процесс генерации макрорасширения, начиная с того места, где она встретилась в макроопределении.
Директива ^ GOTO имя_метки переводит процесс генерации макроопределения в другое место, прекращая тем самым последовательное разворачивание строк макроопределения. Метка.
Директивы компиляции по условию
Данные директивы предназначены для организации выборочной трансляции фрагментов программного кода. Такая выборочная компиляция означает, что в макрорасширение включаются не все строки макроопределения, а только те, которые удовлетворяют определенным условиям. То, какие конкретно условия должны быть проверены, определяется типом условной директивы.
Всего имеется 10 типов условных директив компиляции:
- Директивы IF и IFE условная трансляция по результату вычисления логического выражения.
- Директивы IFDEF и IFNDEF условная трансляция по факту определения символического имени.
- Директивы IFB и IFNB условная трансляция по факту определения фактического аргумента при вызове макрокоманды.
- Директивы IFIDN, IFIDNI, IFDIF и IFDIFI условная трансляция по результату сравнения строк символов.
Условные директивы компиляции имеют общий синтаксис и применяются в составе следующей синтаксической конструкции:
IFxxx логическое_выражение_или_аргументы
фрагмент_программы_1
ELSE
фрагмент_программы_2
ENDIF
2. Подобно вызову процедуры прерывание заставляет микропроцессор сохранить в стеке информацию для последующего возврата, а затем исполнить программу обработки прерывания.
Прерывание всегда вызывает косвенный переход к своей прграмме обработки за счет получения ее адреса из 32-битового вектора прерывания. Сохраняя в стеке адрес прерывания, сохраняют еще и флаги. Прерывания могут быть инициированы внешним устройством системы или специальной командой прерывания из программы. Есть три различные команды прерывания - две команды вызова и одна команда возврата.
INT - Команда прерывания. Формат команды: INT тип_прерывания
Тип прерывания это номер, идентифицирующий один из 256 различных векторов, находящихся в памяти.
При исполнении команды INT микропроцессор производит следующие действия:
1. Помещает в стек значение регистра флагов;
2. Обнуляет флаг трассировки OF и флаг включения/выключения прерываний IF;
3. Помещает в стек значение регистра CS;
4. Вычисляет адрес вектора прерывания, умножая тип прерывания на 4;
5. Загружает второе слово вектора прерываний в регистр CS;
6. Помещает в стек значение регистра указателя команд IP;
7. Загружает в регистр указателя команд IP первое слово вектора прерывания.
После команды INT в стеке окажутся значения регистра флагов и регистров CS и IP. Флаги трассировки TF и прерывания IF будут равны нулю. Пара регистров CS и IP будет указывать на начальный адрес программы обработки прерывания. Затем микропроцессор начнет исполнять эту программу.
INTO - команда прерывания по переполнению. Она представляет собой команду условного прерывания. Команда инициирует прерывание лишь тогда, когда флаг переполнения OF равен единице.
IRET - команда возврата после прерывания. Действие команды то же, что и у команды RET для процедуры. Поэтому она исполняется последней при исполнении микропроцессором программы обработки прерывания. Команда IRET извлекает из стека три 16-битовых значения и загружает их в регистр указателя команд IP, регистр CS и регистр флагов.