Процессор 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 ; вернуться к эмуляции
Назад | Содержание | Вперед