- •Глава 3. Директивы и операторы ассемблера
- •3.1. Структура программы
- •3.2. Директивы распределения памяти
- •3.2.1. Псевдокоманды определения переменных
- •3.2. Директивы распределения памяти
- •3.2.1. Псевдокоманды определения переменных
- •3.2.2. Структуры
- •3.3. Организация программы
- •3.3.1. Сегменты
- •3.2. Директивы распределения памяти
- •3.2.1. Псевдокоманды определения переменных
- •3.2.2. Структуры
- •3.3. Организация программы
- •3.3.1. Сегменты
- •3.3.2. Модели памяти и упрощенные директивы определения сегментов
- •3.3.3. Порядок загрузки сегментов
- •3.3.4. Процедуры
- •3.3.5. Конец программы
- •3.3.6. Директивы задания набора допустимых команд
- •3.3.7. Директивы управления программным счетчиком
- •3.3.8. Глобальные объявления
- •3.3.9. Условное ассемблирование
- •3.4. Выражения
- •3.5. Макроопределения
- •3.6. Другие директивы
- •3.6.1. Управление файлами
- •4. Основы программирования для ms-dos
- •4.1. Программа типа сом
- •4.2. Программа типа ехе
- •4.3. Вывод на экран в текстовом режиме
- •4.3.1. Средства dos
- •4.4. Ввод с клавиатуры
- •4.4.1. Средства dos
- •4.5. Графические видеорежимы
- •4.5.1. Работа с vga-режимами
- •4.6. Работа с мышью
- •4.7. Другие устройства
- •4.7.1. Системный таймер
- •4.8. Работа с файлами
- •4.9. Управление памятью
- •4.9.1. Обычная память
- •4.10. Загрузка и выполнение программ
- •4.11. Командные параметры и переменные среды
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.