В этом разделе собраны те различия между процессором i486 и системами 386 CPU/387 NPX, которые могут влиять на численное программное обеспечение.
Биты регистра управления:
Бит ET (Тип Расширения) регистра CR0 указывает на наличие в системе математического сопроцессора 80287 (ET = 0) или сопроцессора 387 DX (ET = 1). Аппаратурой процессора i486 этот бит не используется. При перезапуске биту ET присваивается значение 0.
Бит NE (Числовое Расширение) регистра CR0 используется процессором i486 для указания, должны ли немаскированные исключения с плавающей точкой передаваться как внутренние прерывания через вектор прерываний 16 (NE = 1) или как внешние прерывания (NE = 0). При перезапуске биту NE присваивается значение 0, следовательно программное обеспечение, использующее автоматический механизм сообщений об ошибках, должно устанавливать его равным 1.
Для процессоров 80286 и 386 бит MP (Монитор Сопроцессора) регистра CR0 показывает, когда при наличии ловушки команды WAIT контекст FPU отличается от текущей работающей задачи. При MP = 1 и TS = 1 команда WAIT вызовет отказ из-за недоступности устройства (вектор прерываний 7). На микропроцессорах 80286 и 386 бит MP используется для поддержки комады WAIT при ожидании на устройствах, отличных от сопроцессора. Свой статус устройство сообщает через вывод BUSY#. Поскольку у процессора i486 нет такого вывода, бит MP не находит применения, и для нормальной работы перенесенных программ должен быть равен 1.
Инициализация и RESET.
При перезапуске аппаратуры RESET регистры с плавающей точкой не изменяются до обращения к встроенной программе самотестирования (BIST). При обращении к BIST перезапуск RESET действует практически также, как команда FINIT. Единственное отличие состоит в том, что FINIT не изменяет регистры стека, а перезапуск RESET с BIST обнуляет их.
При выполнении перезапуска RESET или команды FINIT математический сопроцессор 387 выдает сообщение об ошибке. Процессор i486 и сопроцессор 80287 этого не делают.
Команда FINIT на процессоре i486 очищает указатели ошибок (данных и команд).
Исключения:
На процессоре i486 неопределенный код операции ESC вызовет исключение неверного кода операции (вектор прерывания 6). Неопределенные коды операций ESC, также как и определенные, при установленном бите TS или EM в регистре CR0 вызывают исключение недоступности устройства (вектор прерывания 7). При обнаружении неопределенного кода операции ESC процессор i486 не делает проверки условий ошибки с плавающей точкой.
Операнд невыровненных данных вызовет исключение выравнивания (вектор прерывания 17) на уровне 3 программного обеспечения. Исключение составляет операция FSAVE/FRSTOR над частью стека.
На процессоре i486 команда WAIT может иногда выполняться как NOP. Это происходит в случае, когда команде WAIT предшествует команда, при выполнении которой осуществляется ожидание. В этом случае на процессоре i486 сообщение о числовом исключении может появиться на одну команду позже, чем на системе 386 CPU/387 NPX.
На процессоре i486 при записи одной части операнда внутрь сегмента страницы, а другой - вне его, ошибка памяти может вызвать запись первой части без второй. В этом же случае системы 386 CPU/387 NPX ничего не запишут.
На процессоре i486 при ошибке сегмента в середине операции FLDENV может случиться, что часть среды будет загружена, а часть - нет. В таких случаях в слове управления FPU останется значение 007FH.
В процессоре i486 прерывание 9 отсутствует. В случаях, когда на процессоре 387 появляется прерывание 9, процессор i486 просто прерывает выполнение команды. При этом, однако, необходима некоторая осторожность. Ошибки памяти (в особенности сбой страниц) при выполнении FLDENV или FRSTOR в случаях, когда операционная система осуществляет переключение задачи, могут вызвать потерю среды с плавающей точкой. Intel настоятельно рекомендует размещать область хранения с плавающей точкой на одной странице с TSS.
Трансцендентные команды:
На процессоре i486 трансцендентные команды могут быть прерваны в некоторых контрольных точках во время выполнения, если INTR находится в состоянии ожидания. Таким образом, трансцендентные команды следует использовать только в среде, где появление INTR-ов ожидается не ранее, чем через 200 тактов.