Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методички по ассемблеру / Методичка_часть2.doc
Скачиваний:
602
Добавлен:
02.05.2014
Размер:
545.28 Кб
Скачать

3.3.6. Директивы задания набора допустимых команд

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

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

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

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

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

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

.386p — разрешены все команды 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.

Не все ассемблеры поддерживают каждую директиву, например MASM и WASM не поддерживают .487 и .587, так как их действие не отличается от .387. Естественно, ассемблеры, вышедшие до появления последних процессоров и расширений, не в состоянии выполнять соответствующие им команды.

Если присутствует директива .386 или выше, ассемблер WASM всегда определяет все сегменты как 32-битные при условии, что не указан явно операнд USE16. MASM и TASM действуют так же, только если директива задания набора команд указана перед директивой .model.

3.3.7. Директивы управления программным счетчиком

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

org выражение

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

even

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

align значение

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

3.3.8. Глобальные объявления

public язык метка... ; Для TASM и MASM

или

public метка язык... ; для WASM

Метка, объявленная директивой PUBLIC, становится доступной для других модулей программы. Так, можно объявлять имена процедур, переменные и константы, определенные директивой EQU. Необязательный операнд языка (C, PASCAL, BASIC, FORTRAN, SYSCALL или STDCALL) указывает, что метка будет вызываться из модуля, написанного на соответствующем языке, и при необходимости изменяет ее (например, добавляет _ перед первым символом метки).

comm расст язык метка:тип... ; для TASM

comm язык расст метка:тип... ; для TASM

comm расст метка:тип язык... ; для WASM

Директива COMM описывает общую переменную. Такие переменные доступны из всех модулей, и их размещение в программе определяется на этапе компоновки. Обязательные аргументы директивы COMM — метка (собственно имя общей переменной) и тип (BYTE, WORD, DWORD, FWORD, QWORD, TBYTE или имя структуры). Необязательный операнд «расстояние» (NEAR или FAR) указывает, находится ли переменная в группе сегментов DGROUP (ближняя переменная, для доступа достаточно смещения) или вне этих сегментов (дальняя переменная, для доступа потребуется сегментный адрес). Для моделей памяти TINY, SMALL и COMPACT по умолчанию значение этого операнда принимается за NEAR. И наконец, операнд «язык» действует аналогично такому же операнду для PUBLIC.

extrn язык метка:тип... ; для MASM и TASM

extrn метка:тип язык... ; для WASM

Описывает метку, определенную в другом модуле (с помощью PUBLIC). Тип (BYTE, WORD, DWORD, FWORD, QWORD, TBYTE, имя структуры, FAR, NEAR, ABS) должен соответствовать типу метки в том модуле, где она была установлена (тип ABS используется для констант из других модулей, определенных директивой EQU). Необязательный операнд языка действует так же, как и для директивы PUBLIC.

global язык метка:тип... ; для MASM и TASM

global метка:тип язык... ; для WASM

Директива GLOBAL действует, как PUBLIC и EXTRN одновременно. Когда указанная метка находится в этом же модуле, она становится доступной для других модулей, как если бы выполнилась директива PUBLIC. Если метка не описана — она считается внешней и выполняется действие, аналогичное действию директивы EXTRN.