7.4.3.8.1. Коды ошибок сопроцессора

 

Процессор может работать с арифметическими сопроцессорами 80287 и 80387. Бит ЕТ в регистре CRO показывает, какой именно из них присутствует. Значение этого бита устанавливается во время системного сброса RESET по уровню на входе ERROR #. При необходимости этот бит может быть установлен или сброшен загрузкой регистра CRO командой MOV. Если бит ЕТ = 1, то МП 80386 использует 32-разрядный протокол обмена с сопроцессором 80387, иначе он использует 16-разрядный протокол обмена с сопроцессором 80287.

Процессор идентифицирует код 110011 в первых пяти битах команды как код операции, предназначенный для сопроцессора. Команды с таким кодом называются командами ESCAPE, или ESC. Когда МП 80386 обнаруживает код ESC, то он делает следующее: проверяет флаг ЕМ (режим эмуляции) для того, чтобы определить, нужно ли эмулировать функции сопроцессора программным способом, проверяет флаг TS для того, чтобы определить, имело ли место контекстное изменение с момента выполнения последней команды ESC, и для некоторых таких команд проверяет вывод ERROR # для того, чтобы определить, обнаружил ли сопроцессор ошибку в предыдущей команде ESC.

Биты ЕМ и МР регистра CRO управляют реакцией МП 80386 на команды сопроцессора. Бит ЕМ показывает, нужно ли эмулировать функции сопроцессора. Если МП 80386 обнаруживает, что бит ЕМ установлен при выполнении команды ESC, то возникает исключение 7, которое дает возможность программе обработки этого исключения эмулировать команду ESC. Бит МР показывает, подключен ли к магистрали сопроцессор, и управляет функцией команды WAIT. Если МП 80386 обнаруживает, что бит МР установлен во время выполнения команды WAIT, то он проверяет флаг TS. Если флаг TS установлен, возникает исключение 7.

Значения битов ЕМ и МР могут быть изменены с помощью команды MOV, использующей в качестве приемника регистр CRO. Они могут быть считаны командой MOV, использующей регистр CRO в качестве операнда-источника. Эти формы команды MOV могут выполняться только на нулевом уровне привилегий.

Бит TS в регистре CRO помогает определить, соответствует ли контекст сопроцессора текущей задаче. Процессор устанавливает бит TS каждый раз при переключении задачи, вызванном либо программным, либо аппаратным способом. Если МП 80386 обнаруживает, что бит TS уже установлен при интерпретации одной из команд ESC, то он запускает исключение 7. Команда WAIT также вызывает исключение 7, если установлены оба бита TS и МР. Разрешенная только на нулевом уровне привилегий команда CLTS сбрасывает флаг TS.

К сопроцессору имеют отношение три исключения: прерывание 7 (сопроцессор отсутствует), прерывание 9 (выход сопроцессора из сегмента) и прерывание 16 (ошибка сопроцессора). Эти три прерывания включены в общие прерывания (см. выше). Здесь они рассматриваются несколько подробнее.

Прерывание 7 - сопроцессор отсутствует. Это исключение возникает в одном из двух случаев:

процессор обнаруживает либо команду WAIT, либо команду ESC, когда оба бита МР и TS установлены. Если это произошло, то программе обработки исключения следует при необходимости обновить состояние сопроцессора;

процессор обнаруживает команду ESC при установленном флаге ЕМ эмуляции функций сопроцессора. В этом случае программе обработки следует эмулировать вызвавшую это исключение команду. Бит TS также может быть установлен.

Прерывание 9-выход сопроцессора за пределы сегмента. Это исключение возникает в защищенном режиме в следующих случаях:

как первый, так и последний байты операнда (при рассмотрении оборачивания адресов) расположены по адресам сегмента в присутствующих и доступных страницах и адрес оборачивается;

когда операнд команды сопроцессора оборачивается вокруг адресной границы: OFFFFH-для малых сегментов, OFFFFFFFFH-для больших сегментов и нуль - для расширяющихся вниз сегментов. Операнд может оборачиваться вокруг адресной границы, если граница сегмента находится около адресной границы и операнд расположен по адресу вблизи максимально разрешенного адреса в сегменте. Начальный и конечный адреса такого операнда будут находиться вблизи противоположных концов сегмента благодаря оборачиванию адреса;

3)           когда операнд находится по адресу, доступ к которому невозможен. Адрес арифметической команды, инициировавшей отказ, и операнд – данные могут быть утеряны. Команда FSTENV не возвращает достоверных адресов. Выход сопроцессора из сегмента следует обрабатывать исполнением команды FNINIT, что эквивалентно команде FINIT без предшествующей команды WAIT. Адрес возврата в стеке не обязательно указывает на команду, вызвавшую отказ, или на следующую за ней команду. Рестарт с такой команды невозможен.

Прерывание 16-ошибка сопроцессора. При выполнении команд сопроцессоры 80287 и 80387 обнаруживают шесть различных условий исключения. Если это исключение не маскировано соответствующим битом в управляющем слове, сопроцессор посылает сигнал процессору о возникновении ошибки через вывод ERROR #. Процессор вызывает прерывание 16 при следующей проверке вывода ERROR #, которую он осуществляет только для определенных команд ESC и в начале последующей команды WAIT. Если исключение маскировано, то сопроцессор обрабатывает это исключение с помощью расположенной на его плате аппаратной логики. В этом случае он не посылает сигнал процессору по выводу ERROR #.

 

 

 

HotLog

Заказчику web дизайна и программирования - каталог сайтов, обзор дизайн студий