Предопределенные идентификаторы
Два предопределенных идентификатора @Cpu и @WordSize позволяют вам получить информацию о типе используемого процессора или размере текущего сегмента. Приведем описание этих идентификаторов.
Идентификатор @Cpu
Функция: Числовое значение, возвращающее информацию о текущем процессоре.
Замечания: Значение, возвращаемое @Cpu, дает в битовых полях информацию о типе процессора:
Бит | Описание |
---|
0 | Разрешены инструкции процессора 8086. | 1 | Разрешены инструкции процессора 80186. | 2 | Разрешены инструкции процессора 80286. | 3 | Разрешены инструкции процессора 80386. | 4 | Разрешены инструкции процессора i486. | 7 | Разрешены привилегированные инструкции процессоров (80286, 386, 486). | 8 | Разрешены инструкции математического сопроцессора 8087. | 10 | Разрешены инструкции математического сопроцессора 80287. | 11 | Разрешены инструкции математического сопроцессора 80387. |
Не определенные здесь биты зарезервированы для будущего использования. При использовании идентификатора @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Директива | Значение |
---|
.287 | Разрешает ассемблирование всех инструкций арифметического сопроцессора 80287. Используйте данную директиву, если вы знаете, что вам не потребуется запускать программы на машине с сопроцессором 8087. Данная директива приводит к оптимизации инструкций. При этом они становятся несовместимыми с сопроцессором 8087. Поэтому не используйте данную директиву, если ваши программы должны работать на сопроцессоре 8087. | .387 | Разрешает ассемблирование всех инструкций арифметического сопроцессора 80387. Используйте данную директиву, если вы знаете, что вам не потребуется запускать программы на машине с сопроцессором 8087. Данная директива приводит к оптимизации инструкций. При этом они становятся несовместимыми с сопроцессором 8087. Поэтому не используйте данную директиву, если ваши программы должны работать на сопроцессоре 8087. | .8087 | Разрешает ассемблирование инструкций арифметического сопроцессора и запрещает все инструкции, доступные для сопроцессоров 80287 и 80387. Этот режим инструкций сопроцессора используется Турбо Ассемблером по умолчанию. | P287 | Разрешает ассемблирование инструкций арифметического сопроцессора 80287. | P387 | Разрешает ассемблирование инструкций арифметического сопроцессора 80287. | P8087 | Разрешает ассемблирование только инструкций арифметического сопроцессора 8087. В Турбо Ассемблере этот режим назначается по умолчанию. |
Директивы эмуляции сопроцессора
Если вам нужны реальные инструкции с плавающей точкой, то нужно использовать сопроцессор 8087. Если у вас установлен пакет программной эмуляции инструкций с плавающей точкой, то для его использования можно указать директиву EMUL. (Директива EMUL работает аналогично параметру /e).
Примечание: Директивы EMUL и NOEMUL работают как в режиме MASM, так и в режиме Ideal.
Например:
Finit ; реальные инструкции сопроцессора 8087 EMUL Fsave BUF ; эмулируемая инструкция
При использовании сопроцессора 8087 вы можете либо эмулировать инструкции с плавающей точкой с помощью директивы EMUL, либо принудительно использовать инструкции с плавающей точкой с помощью директивы NOEMUL. Заметим, что вы можете использовать инструкции EMUL и NOEMUL, когда хотите генерировать инструкции с плавающей точкой для одной части файла и эмулируемые инструкции для другой.
Приведем пример использования инструкции NOEMUL:
NOEMUL ; ассемблировать реальные инструкции с плавающей точкой finit EMUL ; вернуться к эмуляции
1 2
8 8 8
| |