ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 20

Глава 19. Замечания о системном уровне
----------------------------------------------------------------
Системное программирование для процессора i486(TM) требует более
детального понимания структуры модуля обработки операций с
плавающей точкой, чем прикладное программирование. За работу
таких функций, как инициализация, обработка исключений и
синхронизация данных и ошибок, отвечает системный программист.
Это и рассматривается подробно в настоящей главе.
19.1 Архитектура
----------------------------------------------------------------
На программном уровне модуль обработки операций с плавающей
точкой является расширением модуля обработки целочисленных
операций. Однако на уровне аппаратуры механизм взаимодействия
между этими модулями более сложный. В настоящем разделе описано
это взаимодействие и свойства, заинтересующие системного
программиста.
19.1.1 Независимость способа адресации
----------------------------------------------------------------
В отличии от процессора 80287 NPX (но подобно 387(TM) NPX)
модуль обработки операций с плавающей точкой процессора i486
работает независимо от того, работает процессор в режиме
реальной адресации, в защищенном режиме или в виртуальном режиме
процессора 8086.
Числовые команды могут использовать любое место памяти,
доступное задаче, выполняемой в настоящий момент. При работе в
защищенном режиме все ссылки на операнды памяти автоматически
проверяются системой управления памятью и механизмами защиты.
При нарушениях механизма защиты, связанных с вычислительнымм
операциями, процессор автоматически вызвает обработчик
исключений.
Для программирующего вычисления режим работы существенен только
в том случае, если команды модулю обработки операций с плавающей
точкой и ссылки на данные представлены в памяти с помощью команд
FSAVE и FSTENV. Каждая из этих команд имеет один из четырех
форматов в зависимости от режима работы и типа операнда в
команде. Для более детальной информации о командах FSAVE и
FSTENV смотрите главу 20.
19.2 Инициализация и управление процессором
----------------------------------------------------------------
Одни из наиболее важных функций системного программного
обеспечения инициализация и управление аппаратными и
программными ресурсами системы, включая модуль обработки
операций с плавающей точкой. В этом разделе дано описание
инициализации и управления, включая обработку исключений,
которые могут случиться во время выполнения числовых команд.
19.2.1 Инициализация системы
----------------------------------------------------------------
Во время инициализации системы процессора i486 системные
программы должны инициализировать модуль обработки операций с
плавающей точкой и для отражения состояния среды вычислений
установить флаги в регистр CR0. Эти действия могут быть
выполнены быстро и легко, как часть общей инициализации системы.
19.2.2 Настройка конфигурации среды вычислений
----------------------------------------------------------------
Системная программа должна загрузить соответствующие значения в
биты MP, EM и NE регистра управления CR0.
Бит MP (Управление сопроцессором) определяет: прерывается ли
выполнение задачи по команде WAIT, если содержимое модуля
обработки операций с плавающей точкой отлично от выполняемой
задачи. Если MP=1 и NS=1, то по умолчанию команда WAIT будет
выдавать сообщение "Устройство Не Доступно" (вектор прерывания 7)
Бит МР используется командой WAIT микропроцессоров 80286 и
386(TM) DX для ожидания доступа к устройству, отличному от
числового сопроцессора. Устройство информирует о своем состоянии
через контакт BUSY#. Так как процессор i486 не имеет такого
контакта, бит МР не используется, и для нормальной работы ему
необходимо присвоить 1.
Бит ЕМ (Эмуляция сопроцессора) определяет выполняется ли команда
ESC модулем обработки операций с плавающей точкой (ЕМ=0) или
будет обрабатываться программой через вектор прерывания 7
(ЕМ=1). Бит ЕМ использовался в микропроцессоре 386 DX, чтобы
вычислительные операции, написанные для системы 386 DX
CPU/387DX, могли бы быть выполнены на программном эмуляторе
сопроцессора 387 DX в отсуствии сопроцессора 387 DX. Для
нормальной работы процессора i486 биту ЕМ должен быть присвоен
0.
Бит NE (Численные исключения) показывает, как обрабатываются
немаскированные исключения при работе с данными с плавающей
точкой: через вектор прерывания 16 (NE=1) или через внешние
прерывания (NE=0). В системах, использующих контроллер внешних
прерываний для вызова обработчика числовых исключений, биту
NE должен быть присвоен 0. Другие системы могут использовать
автоматическую обработку ошибок через прерывание 16, и в бит NE
тогда заносится 1. Для подробной информации об обработке
численных исключений смотри раздел 19.2.5.
19.2.3 Инициализация модуля обработки операций с плавающей
       точкой
----------------------------------------------------------------
Инициализация модуля обработки операций с плавающей точкой
означает приведение его в определенное состояние, независимо от
предыдущих действий. Инициализация выполняется с помощью
единственной команды FNINIT. В результате устанавливаются все
маски ошибок, во все регистры заносится 0 и устанавливается
режим управления округлением и точностью по умолчанию. В Таблице
19-1 показано состояние модуля операций с плавающей точкой после
выполнения команды FINIT или FNINIT.
Команда FNINIT приводит модуль обработки операций с
плавающей точкой в такое же состояние, которое получается после
нажатия клавиши RESET в результате выполнения встроенного теста
по проверке памяти. Если встроенный тест не запрашивается, то
нажатие RESET оставляет модуль обработки операций с
плавающей точкой неизмененным. Команда FNINIT будет выполнена
после перезагрузки.
        Таблица 19-1. Состояние FPU после инициализации
ЪДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і        Поле         і Значение і    Интерпретация             і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  Слово Управления   і  037FH   і                              і
і    (Управление    * і          і                              і
і    бесконечностью)  і  0       і                              і
і    Управление       і          і  Округление до ближайшего    і
і    округлением      і  00      і                              і
і    Управление       і          і  64 бита                     і
і    точностью        і  11      і                              і
і Маски особых        і          і Все особые ситуации          і
і    ситуаций         і  111111  і заблокированы                і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  Слово Состояния    і  0000H   і                              і
і    (Бит занятости)  і  0       і                              і
і    Код Условия      і  0000    і                              і
і    Вершина Стека    і  000     і  Регистр 0 - вершина стека   і
і    Наличие Особой   і          і                              і
і    ситуации         і  0       і  Особых ситуаций нет         і
і    Стековый флаг    і  0       і                              і
і    Флаги Особых     і          і                              і
і    ситуаций         і  000000  і  Особых ситуаций нет         і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  Слово Признака     і  FFFFH   і                              і
і    Признаки         і  11      і                              і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  Регистры           і  N.C.    і  Не изменялись               і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  Ссылки на Особые   і          і                              і
і  ситуации           і          і                              і
і    Код Команды      і          і                              і
і    Адрес Команды    і          і                              і
і    Адрес Операнда   і          і                              і
АДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
* Процессор i486 не имеет управления бесконечностью. Данная
  величина для программ, написанных для сопроцессора 80287; если
  эти программы зависят от этого бита, то для процессора i486
  они могут работать неверно.
19.2.4 Эмуляция
----------------------------------------------------------------
При присвоении 1 биту ЕМ процессор i486 через вектор прерывания
7 (Устройство Не Доступно) будет вызывать программу обработки
исключений, которая подсчитывает количество команд ЕSC. Бит EM
используется для выполнения числовых операций на процессоре 386
с программным эмулятором сопроцессора 387. Числовые операции,
предназначенные для выполнения на нестандартном эмуляторе
сопроцессора 387, в отсуствии эмулятора могут не быть выполнены
на процессоре i486 . Присвоение 1 биту ЕМ делает возможным
выполнить эти операции или программы, использующие нестандартную
арифметику с плавающей точкой, на процессоре i486.
19.2.5 Обработка числовых исключений
----------------------------------------------------------------
Как только модуль обработки операций с плавающей точкой был
проинициализирован, и началось нормальное выполнение, модуль
обработки операций с плавающей точкой может потребовать
внимания, чтобы обработать числовые исключения. В этой
главе рассматривается написание программных обработчиков
числовых исключений.
Если модуль обработки операций с плавающей точкой встречает
немоскированное исключение, то сразу перед выполнением следующей
команды WAIT или неуправляющей команды с плавающей точкой
вызывается программный обработчик исключений. Вызов происходит
через вектор прерывания 16 или через внешнее прерывание, в
зависимости от значения бита NE регистра управления CR0.
Если NE=1, то немаскированное исключение с плавающей точкой
вызывает прерывание 16, непосредственно перед выполнением
следующей неуправляющей команды с плавающей точкой или команды
WAIT. Прерывание 16 есть сигнал операционной системе о
необходимости вызова обработчика исключений. В главе 9 даны
общие сведения об исключениях и прерываниях процессора i486.
Если NE=0 (и ввод IGGNE# не активен), немаскированное исключение
"замораживает" процессор сразу перед выполнением следующей
неуправляющей команды с плавающей точкой или команды WAIT.
"Замороженный" процессор ожидает внешнее прерывание, которое
должно быть поддержано внешней аппаратурой в ответ на вывод
процессора FERR#. (Независимо от значения NE немаскированное
исключение заставляет вывод FERR# быть активным.) В этом случае
внешнее прерывание вызывает программу обработки исключения.
Усли NE=0, но ввод IGGNE# активен, то процессор не обращает
внимание на исключение и продолжает работу. Обработка ошибок
через внешние прерывания поддерживается для DOS, совместимых с
процессором. В Главе 25 даны некоторые предложения по
совместимости.
При обработке ошибок вычислений процессор должен:
- Не нарушить числовой контекст.
- Сбросить ошибку и попытаться от нее избавиться.
Хотя способы решения этих проблем меняются от реализации к
реализации, большинство обработчиков должны выполнять следующие
основные действия:
- Сохранить среду модуля обработки операций с плавающей точкой
  (слова управления, статуса, признака, операнды и ссылки на
  команды), какой она была время генерации исключения.
- Очистить бит исключения в слове состояния.
- Замаскировать прерывания.
- Распознать исключение, проанализировав слова управления и
  статуса в сохраненной среде.
- Принять системно-зависимые меры по корректировке ситуации.
- Вернуться к прерванной программе и возобновить нормальное
  выполнение.
19.2.6 Реакция на одновременные исключения
----------------------------------------------------------------
В случае, если несколько исключений возникает одновременно,
модуль обработки операций с плавающей точкой сигнализирует об
одном из них в соответствии с приоритетом, указанным в конце
Главы 16. Это означает, например, что SNaN, деленное на 0, дает
ошибочную операцию, а не исключение деления на нуль.
19.2.7 Примеры программ обработки исключений
----------------------------------------------------------------
Программы обработки исключений могут иметь различные формы.
Они могут изменять правила программирования и арифметики
процессора i486. Такие изменения могут переопределить ошибки,
установленные по умолчанию, изменить видимость модуля обработки
операций с плавающей точкой для программиста или изменить
арифметику, определенную для модуля обработки операций с
плавающей точкой.
Чтобы изменить результат выдачи исключения, необходимо
сначала выполнить ненормальную арифметику или ненормальную
загрузку из памяти. Для изменения "видения" модуля обработки
операций с плавающей точкой стековой регистр должен быть
расширен до размеров памяти, чтобы предоставить для работы
"бесконечное" число регистров. Арифметика модуля обработки
операций с плавающей точкой может быть автоматически изменена
через переопределение точности и диапазона значений при
переполнении. Все эти функции процессора i486 могут быть
реализованы через числовые прерывания и программы обработки в
соответствии с нуждами программиста.
Некоторые другие возможные программы в зависимости от применения
могут включать:
- Увеличение счетчика особых ситуаций при последней работе с
  дисплеем или при печати
- Печать или выдача на экран диагностических сообщений
  (например, среда модуля обработки операций с плавающей точкой
  или регистров)
- Прекращение дальнейшего выполнения
- Сохранение величины диагностики (NaN) в результате и
  продолжение вычисления
В зависимости от применения, исключения могут фиксировать, а
могут и опускать ошибки. Как только обработчик исключения
скорректирует условие, вызвавшее исключение, то при
необходимости, команда с плавающей точкой, в которой случилось
исключение, может быть выполнена еще раз. Это не может произойти
при использовании команды IRET, так как прерывания случаются в
команде ESC или в команде WAIT, вызываемой после команды ESC.
Обработчик исключений должен получить (используя команду FSAVE
или FSTENV) адрес нарушившей команды в программе, которая
вызывала команду, сделать копию команды, выполнить ее в
контексте нарушенной программы и затем через команду IRET
вернуться к потоку текущих команд.
Чтобы откорректировать условие, вызвавшее числовое исключение,
обработчик исключений должен распознать состояние модуля
обработки операций с плавающей точкой в то время, когда был
вызван обработчик исключений. Для восстановления состояния
модуля обработки операций с плавающей точкой программисты должны
понимать когда, в течение выполнения числовой команды, нарушение
было обнаружено.
Недопустимые операции, деление на нуль, ненормализованные
исключения обнаруживаются до начала выполнения операции, тогда
как переполнение, отрицательное переполнение и исключения
нарушения точности не возникают до тех пор, пока не будет
вычислен результат. Если исключение обнаружено перед
выполнением, то регистровый стек и память модуля обработки
операций с плавающей точкой еще не были изменены, так как
команда, содержащая нарушение, не выполнялась.
При обнаружении исключения после начала выполнения команды
регистровый стек и память выглядят так, будто команды была
выполнена; например, они могут быть обновлены. (Однако в
командах сохранить и сохранить-извлечь, немаскированное
переполнение и отрицательное переполнение обрабатываются подобно
исключению передя1 я0выполнением; память не обновлялась и из стек
ничего не извлекалось.) Примеры в Главе 20 содержат несколько
обработчиков исключений для обработки числовых исключительных
ситуаций.


Яндекс цитирования