Глава 6. Директивы выбора процессора и идентификаторы процессора
Процессор 8086 представляет собой на самом деле только один
из процессоров семейства iAPx86. Это семейство включает в себя:
- процессор 8088 (который содержит 8-разрядную шину данных),
8086 (содержит 16-разрядную шину данных);
- процессоры 80186 и 80188 (аналогичны процессорам 8086 и
8088, но содержат дополнительные инструкции и работают
быстрее своих предшественников);
- процессор 80286 (который содержит инструкции защищенного
режима);
- процессор 80386 (который может обрабатывать 16- и 32-раз-
рядные данные);
- процессор 80486 (улучшенная версия процессора 80386, кото-
рая отличается более высокой скоростью работы).
Математические сопроцессоры, такие как 8087, 80287 и 80387,
работающие с процессорами семейства iAPx86, позволяют выполнять
операции с плавающей точкой.
В Турбо Ассемблере предусмотрены директивы и предопределен-
ные идентификаторы, которые позволяют вам использовать инструкции
конкретного процессора. Эти директивы и идентификаторы описывают-
ся в данной главе.
Директивы процессоров iAPx86
Процессоры семейства iAPx86 предусматривают использование
множества директив. Заметим, что директивы, начинающиеся с точки,
доступны только в режиме MASM.
Примечание: Список инструкций, допустимых для конкрет-
ных процессоров, можно найти в Главе 1.
Директивы выбора процессоров iAPx86 Таблица 6.1
-----------------T----------------------------------------------¬
¦ Директива ¦ Значение ¦
+----------------+----------------------------------------------+
¦ P8086 ¦ Разрешает ассемблирование только инструкций ¦
¦ ¦ процессора 8086. ¦
¦ ¦ ¦
¦ .8086 ¦ Разрешает ассемблирование инструкций проце- ¦
¦ ¦ ссора 8086 и запрещает все инструкции, дос- ¦
¦ ¦ тупные только на процессорах 80186, 80286 и ¦
¦ ¦ 386. Разрешает также ассемблирование инст- ¦
¦ ¦ рукций сопроцессора 8087, так же как инст- ¦
¦ ¦ рукции .8087 или 8087. ¦
¦ ¦ ¦
¦ P186 ¦ Разрешает ассемблирования инструкций про- ¦
¦ ¦ цессора 80186. ¦
¦ ¦ ¦
¦ .186 ¦ Разрешает ассемблирования инструкций про- ¦
¦ ¦ цессора 80186. ¦
¦ ¦ ¦
¦ P286 ¦ Разрешает ассемблирование всех инструкций ¦
¦ ¦ процессора 80286. ¦
¦ ¦ ¦
¦ P286N ¦ Разрешает ассемблирование непривилегирован- ¦
¦ ¦ ных (реальный режим) инструкций процессора ¦
¦ ¦ 80286 и инструкций арифметического сопро- ¦
¦ ¦ цессора 80287. ¦
¦ ¦ ¦
¦ P286P ¦ Разрешает ассемблирование всех (включая ¦
¦ ¦ защищенный режим) инструкций процессора ¦
¦ ¦ 80286 и инструкций арифметического сопро- ¦
¦ ¦ цессора 80287. ¦
¦ ¦ ¦
¦ .286 ¦ Разрешает ассемблирование непривилегирован- ¦
¦ ¦ ных инструкций процессора 80286 (реальный ¦
¦ ¦ режим) и инструкций арифметического сопро- ¦
¦ ¦ цессора 80287, так же как директива P287. ¦
¦ ¦ ¦
¦ .286C ¦ Разрешает ассемблирование непривилегирован- ¦
¦ ¦ ных инструкций процессора 80286 (реальный ¦
¦ ¦ режим) и инструкций арифметического сопро- ¦
¦ ¦ цессора 80287. ¦
¦ ¦ ¦
¦ .286P ¦ Разрешает ассемблирование всех инструкций ¦
¦ ¦ процессора 80286 (включая защищенный режим) ¦
¦ ¦ и инструкций арифметического сопроцессора ¦
¦ ¦ 80287, как директивы .287 или .P287. ¦
¦ ¦ ¦
¦ P386 ¦ Разрешает ассемблирование всех инструкций ¦
¦ ¦ процессора 386. ¦
¦ ¦ ¦
¦ P386N ¦ Разрешает ассемблирование непривилегирован- ¦
¦ ¦ ных (реальный режим) инструкций процессора ¦
¦ ¦ 386. ¦
¦ ¦ ¦
¦ P386P ¦ Разрешает ассемблирование всех (включая за- ¦
¦ ¦ щищенный режим) инструкций процессора 386. ¦
¦ ¦ ¦
¦ ¦ ¦
¦ .386 ¦ Разрешает ассемблирование непривилегирован- ¦
¦ ¦ ных инструкций процессора 80386 (реальный ¦
¦ ¦ режим), включая все дополнительные инструк- ¦
¦ ¦ ции, и инструкций арифметического сопроцес- ¦
¦ ¦ сора 80387е, как директивы .387 и P387. ¦
¦ ¦ ¦
¦ .386C ¦ Разрешает ассемблирование инструкций проце- ¦
¦ ¦ ссора 80386. ¦
¦ ¦ ¦
¦ .386P ¦ Разрешает ассемблирование всех инструкций ¦
¦ ¦ процессора 80386 (включая защищенный режим) ¦
¦ ¦ и инструкций арифметического сопроцессора ¦
¦ ¦ 80387, как директивы .387 и P387. ¦
¦ ¦ ¦
¦ P486 ¦ Разрешает ассемблирование всех инструкций ¦
¦ ¦ процессора i486 (включая защищенный режим). ¦
¦ ¦ ¦
¦ P486N ¦ Разрешает ассемблирование непривилегирован- ¦
¦ ¦ ных инструкций процессора i486 (реальный ¦
¦ ¦ режим). ¦
¦ ¦ ¦
¦ .486 ¦ Pазрешает ассемблирование дополнительных ¦
¦ ¦ инструкций процессора, поддерживаемых ¦
¦ ¦ процессором 80486 в непривилегированном ре- ¦
¦ ¦ жиме. Разрешает также инструкции сопроцес- ¦
¦ ¦ сора 3867, как директивы .387 и P387. ¦
¦ ¦ ¦
¦ .486C ¦ Разрешает ассемблирование всех инструкций ¦
¦ ¦ процессора i486. ¦
¦ ¦ ¦
¦ .486P ¦ Разрешает ассемблирование всех инструкций ¦
¦ ¦ процессора 80486 (включая защищенный режим) ¦
¦ ¦ и инструкций арифметического сопроцессора ¦
¦ ¦ 80487, как директивы .487 и P487. ¦
L----------------+-----------------------------------------------
Предопределенные идентификаторы
Два предопределенных идентификатора @Cpu и @WordSize
позволяют вам получить информацию о типе используемого процессора
или размере текущего сегмента. Приведем описание этих идентифика-
торов.
Идентификатор @Cpu
Функция: Числовое значение, возвращающее информацию о теку-
щем процессоре.
Замечания: Значение, возвращаемое @Cpu, дает в битовых полях
информацию о типе процессора:
------------T--------------------------------------¬
¦ Бит ¦ Описание ¦
+-----------+--------------------------------------+
¦ 0 ¦ Разрешены инструкции процессора ¦
¦ ¦ 8086. ¦
¦ ¦ ¦
¦ 1 ¦ Разрешены инструкции процессора ¦
¦ ¦ 80186. ¦
¦ ¦ ¦
¦ 2 ¦ Разрешены инструкции процессора ¦
¦ ¦ 80286. ¦
¦ ¦ ¦
¦ ¦ ¦
¦ 3 ¦ Разрешены инструкции процессора ¦
¦ ¦ 80386. ¦
¦ ¦ ¦
¦ 4 ¦ Разрешены инструкции процессора ¦
¦ ¦ i486. ¦
¦ ¦ ¦
¦ 7 ¦ Разрешены привилегированные ¦
¦ ¦ инструкции процессоров (80286, ¦
¦ ¦ 386, 486). ¦
¦ ¦ ¦
¦ 8 ¦ Разрешены инструкции математи- ¦
¦ ¦ ческого сопроцессора 8087. ¦
¦ ¦ ¦
¦ ¦ ¦
¦ 10 ¦ Разрешены инструкции математи- ¦
¦ ¦ ческого сопроцессора 80287. ¦
¦ ¦ ¦
¦ 11 ¦ Разрешены инструкции математи- ¦
¦ ¦ ческого сопроцессора 80387. ¦
L-----------+---------------------------------------
Не определенные здесь биты зарезервированы для будущего ис-
пользования. При использовании идентификатора @Cpu замаскируйте
их, это обеспечит совместимость вашей программы с будущими верси-
ями Турбо Ассемблера.
Так как семейство процессоров 8086 совместимо снизу-вверх,
то когда вы разрешаете тип процессора по директиве .286, автома-
тически разрешаются также младшие типы сопроцессоров (8086,
80186).
Это значение только предоставляет информацию о процессоре,
который вы выбрали на этапе ассемблирования с помощью .286 или
аналогичных директив. Тип процессора, на котором выполняется ваша
программа, не указывается.
Пример:
IPUSH = @Cpu AND 2 ; разрешает непосредственную
; инструкцию push процессора
; 186 и старше
IF IPUSH
PUSH 1234
ELSE
mov ax,1234
push ax
ENDIF
Идентификатор @WordSize
Функция: Числовое значение, указывающее 16- или 32-разрядные
сегменты.
Примечания: @WordSize возвращает значение 2, если текущим
сегментом является 16-разрядный сегмент, и 4, если это 32-разряд-
ный сегмент.
Пример:
IF @WordSize EQ 4
mov esp,0100h
ELSE
mov sp,0100h
ENDIF
Директивы сопроцессора 8087
Имеющиеся директивы задания сопроцессора перечислены в сле-
дующей таблице. Заметим, что директивы, начинающиеся с точки,
доступны только в режиме MASM.
Директивы сопроцессора 8087 Таблица 6.2
-----------------T----------------------------------------------¬
¦ Директива ¦ Значение ¦
+----------------+----------------------------------------------+
¦ .287 ¦ Разрешает ассемблирование всех инструкций ¦
¦ ¦ арифметического сопроцессора 80287. Исполь- ¦
¦ ¦ зуйте данную директиву, если вы знаете, что ¦
¦ ¦ вам не потребуется запускать программы на ¦
¦ ¦ машине с сопроцессором 8087. Данная дирек- ¦
¦ ¦ тива приводит к оптимизации инструкций. При ¦
¦ ¦ этом они становятся несовместимыми с сопро- ¦
¦ ¦ цессором 8087. Поэтому не используйте дан- ¦
¦ ¦ ную директиву, если ваши программы должны ¦
¦ ¦ работать на сопроцессоре 8087. ¦
¦ ¦ ¦
¦ .387 ¦ Разрешает ассемблирование всех инструкций ¦
¦ ¦ арифметического сопроцессора 80387. Исполь- ¦
¦ ¦ зуйте данную директиву, если вы знаете, что ¦
¦ ¦ вам не потребуется запускать программы на ¦
¦ ¦ машине с сопроцессором 8087. Данная дирек- ¦
¦ ¦ тива приводит к оптимизации инструкций. При ¦
¦ ¦ этом они становятся несовместимыми с сопро- ¦
¦ ¦ цессором 8087. Поэтому не используйте дан- ¦
¦ ¦ ную директиву, если ваши программы должны ¦
¦ ¦ работать на сопроцессоре 8087. ¦
¦ ¦ ¦
¦ .8087 ¦ Разрешает ассемблирование инструкций ариф- ¦
¦ ¦ метического сопроцессора и запрещает все ¦
¦ ¦ инструкции, доступные для сопроцессоров ¦
¦ ¦ 80287 и 80387. Этот режим инструкций сопро- ¦
¦ ¦ цессора используется Турбо Ассемблером по ¦
¦ ¦ умолчанию. ¦
¦ ¦ ¦
¦ P287 ¦ Разрешает ассемблирование инструкций ариф- ¦
¦ ¦ метического сопроцессора 80287. ¦
¦ ¦ ¦
¦ P387 ¦ Разрешает ассемблирование инструкций ариф- ¦
¦ ¦ метического сопроцессора 80287. ¦
¦ ¦ ¦
¦ P8087 ¦ Разрешает ассемблирование только инструк- ¦
¦ ¦ ций арифметического сопроцессора 8087. В ¦
¦ ¦ Турбо Ассемблере этот режим назначается по ¦
¦ ¦ умолчанию. ¦
L----------------+-----------------------------------------------
Директивы эмуляции сопроцессора
Если вам нужны реальные инструкции с плавающей точкой, то
нужно использовать сопроцессор 8087. Если у вас установлен пакет
программной эмуляции инструкций с плавающей точкой, то для его
использования можно указать директиву EMUL. (Директива EMUL рабо-
тает аналогично параметру /e).
Примечание: Директивы EMUL и NOEMUL работают как в ре-
жиме MASM, так и в режиме Ideal.
Например:
Finit ; реальные инструкции сопроцессора
; 8087
EMUL
Fsave BUF ; эмулируемая инструкция
При использовании сопроцессора 8087 вы можете либо эмулиро-
вать инструкции с плавающей точкой с помощью директивы EMUL, либо
принудительно использовать инструкции с плавающей точкой с по-
мощью директивы NOEMUL. Заметим, что вы можете использовать инс-
трукции EMUL и NOEMUL, когда хотите генерировать инструкции с
плавающей точкой для одной части файла и эмулируемые инструкции
для другой.
Приведем пример использования инструкции NOEMUL:
NOEMUL ; ассемблировать реальные инструкции
; с плавающей точкой
finit
EMUL ; вернуться к эмуляции
Назад | Содержание | Вперед