Директивы

Директивы являются указанием транслятору на выполнение некоторых действий. У директив нет аналогов в машинном представлении.

Директива LABEL определяет метку и задает ее тип. Тип может быть одним из: BYTE (байт), WORD (слово), DWORD (двойное слово), FWORD (6 байт), QWORD (учетверенное слово), TBYTE (10 байт), NEAR (ближняя метка), FAR (дальняя метка). Метка получает значение, равное адресу следующей команды или следующих данных, и тип, указанный явно. С помощью директивы LABEL удобно организовывать доступ к одним и тем же данным, как к байтам, так и к словам, определив перед данными две метки с разными типами.

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

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

DB – определить байт;

DW – определить слово (2 байта);

DD – определить двойное слово (4 байта);

DF – определить 6 байт (адрес в формате 16-битный селектор: 32-битное смещение);

DQ – определить учетверенное слово (8 байт);

DT – определить 10 байт (80-битные типы данных, используемые FPU)

Сегмент программы описывается директивами SEGMENT и ENDS. Например,

имя_сегмента segment

...

имя_сегмента ends

В данном случае «имя_сегмента» является меткой начала сегмента, а «segment» - директивой ассемблера, указывающей на начало или конец сегмента программы.

Директива ASSUME указывает ассемблеру, с каким сегментом или группой сегментов связан тот или иной сегментный регистр. Эта директива не изменяет значений сегментных регистров, а только позволяет ассемблеру проверять допустимость ссылок и самостоятельно вставлять при необходимости префиксы переопределения сегментов, если они необходимы.

Модели памяти задаются директивой .MODEL. Например,

.Model модель

где «модель» – одно из следующих слов:

TINY – код, данные и стек размещаются в одном и том же сегменте размером до 64 Кб. Эта модель памяти чаще всего используется при написании на ассемблере небольших программ;

SMALL – код размещается в одном сегменте, а данные и стек – в другом (для их описания могут применяться разные сегменты, но объединенные в одну группу). Эту модель памяти также удобно использовать для создания программ на ассемблере;

COMPACT – код размещается в одном сегменте, а для хранения данных могут использоваться несколько сегментов, так что для обращения к данным требуется указывать сегмент и смещение (данные дальнего типа);

MEDIUM – код размещается в нескольких сегментах, а все данные – в одном, поэтому для доступа к данным используется только смещение, а вызовы подпрограмм применяют команды дальнего вызова процедуры;

LARGE и HUGE – и код, и данные могут занимать несколько сегментов;

FLAT – то же, что и TINY, но используются 32-битные сегменты, так что максимальный размер сегмента, содержащего и данные, и код, и стек, – 4 Гб.

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

.8086 – используется по умолчанию. Разрешены только команды 8086;

.186 – разрешены команды 80186;

.286 и .286c – разрешены непривилегированные команды 80286;

.286 p – разрешены все команды 80286;

.386 и. 386c – разрешены непривилегированные команды 80386;

.386 p – разрешены все команды 80386;

.486 и .486c – разрешены непривилегированные команды 80486;

.486p – разрешены все команды 80486;

.586 и .586c – разрешены непривилегированные команды P5 (Pentium);

.586p – разрешены все команды P5 (Pentium);

.686 – разрешены непривилегированные команды P6 (Pentium Pro, Pentium II);

.686p – разрешены все команды P6 (Pentium Pro, Pentium II);

.8087 – разрешены команды NPX 8087;

.287 – разрешены команды NPX 80287;

.387 – разрешены команды NPX 80387;

.487 – разрешены команды FPU 80486;

.587 – разрешены команды FPU 80586;

.MMX – разрешены команды IA MMX;

.K3D – разрешены команды AMD 3D.

Программный счетчик – внутренняя переменная ассемблера, равная смещению текущей команды или данных относительно начала сегмента, она как бы отображает содержимое счетчика команд EIP микропроцессора. Для преобразования меток в адреса используется именно значение этого счетчика. Значением счетчика можно управлять с помощью директив ORG, EVEN и ALIGN.

Для установки программного счетчика используется директива ORG:

ORG выражение; Устанавливает значение программного счетчика.

Директива ORG с операндом 100h обязательно используется при написании файлов типа COM, которые загружаются в память после блока параметров размером 100h.

Директива EVEN делает текущее значение счетчика кратным двум, вставляя команду NOP, если оно было нечетным. Это увеличивает скорость работы программы, так как для доступа к слову, начинающемуся с нечетного адреса, процессор должен считать два слова из памяти. Если при описании сегмента не использовалось выравнивание типа BYTE, счетчик в начале сегмента всегда четный.

Директива ALIGN округляет значение программного счетчика до кратного указанному после директивы значению. Оно может быть любым четным числом. Если счетчик некратен указанному числу, эта директива вставляет необходимое количество команд NOP.

Конец программы определяется с помощью директивы END. Например

end start_label

Этой директивой завершается любая программа на ассемблере. В роли необязательного операнда здесь выступает метка start_label (или выражение), определяющая адрес, с которого начинается выполнение программы. Если программа состоит из нескольких модулей, только один файл может содержать начальный адрес.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: