Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Немаскируемая обработка исключений




Как производить немаскируемую обработку исключений?Для этого необходимо

установить в ноль те флаги в регистре CWR,которые соответствуют интересующим

нас типам исключений.Далее нужно написать обработчик исключения,реализу-

ющий последовательность действий по корректировке ситуации,приведшей к ис-

ключению.Неясным остается вопрос о том,как передать управление обработчику

исключения?Для ответа на него нужно разобраться с проблемой взаимодействия

процессора и сопроцессора при возникновении исключения.

В главе 2 мы упоминали о существовании группы системных регистров про-

цессора.В контексте нашего рассмотрения интерес представляет один из них —

регистр CRO.Он имеет несколько битов,имеющих отношение к сопроцессору

(табл.17.3).

Таблица 17.3. Биты CRO,имеющие отношение к сопроцессору

Положение

бита в CRO

Название

бита

МР (Math

Present)

Назначение

Сопроцессор присутствует.Бит должен быть

установлен в 1Положение

бита в CRO

Название

бита

ЕМ (Emulation

Math)

TS (Ta ^k

Switched)

ET (Extension

Type)

NE (Numeric

Error)

Назначение

Эмуляция сопроцессора.Когда ЕМ =1,выполнение

любой команды сопроцессора вызывает исключение 7.

В программах для микропроцессосоров 18086...1386

это позволяло иметь альтернативные фрагменты кода

для выполнения одинаковых вычислений

с использованием команд сопроцессора (ЕМ =0)

и без них (ЕМ =1),то есть тогда,когда в конкретной

конфигурации компьютера сопроцессор отсутствует

Задача переключена.Бит предназначен для

согласования контекстов основного процессора

и сопроцессора.Бит TS устанавливается в единицу

при каждом переключении задачи.Состояние этого

бита проверяется процессором,если очередной

выбранной командой является команда сопроцессора.

Если бит TS установлен в единицу,то процессор

возбуждает исключение 7,обработчик которого

выполняет необходимые действия,возможно,

по сохранению или восстановлению контекста

вычислений с плавающей точкой.С битом TS

работает команда CLTS,которая устанавливает

значение этого бита в 0

Тип расширения.Единичное значение этого бита

означает поддержку инструкций сопроцессора

Численная ошибка.Бит определяет способ обработки

исключений сопроцессора:через сигнал внешнего

прерывания или путем генерации исключения

(см.далее)

Начиная с модели i486 процессор и сопроцессор размещаются в одном корпу-

се.Это упростило организацию взаимодействия между ними.Рассмотрим процес-

сы,протекающие в к эмпьютере при возникновении одного из шести перечислен-

ных ранее исключений сопроцессора.При возникновении ситуации исключения

сопроцессор устанавливает бит суммарной ошибки ES в регистре состояния SWR

и формирует на однс м из своих выходов сигнал ошибки.Этот сигнал ошибки од-

новременно воспринимается самим процессором,который генерирует исключе-

ние 10h,и в то же самое время,независимо от процессора,заводится на вход IRQ13

программируемого контроллера прерываний,обработчик которого вызывается

через вектор прерывания 75h [8 ].Таким образом,появление сигнала ошибки на

выходе сопроцессора приводит к генерации в основном процессоре двух исключе-

ний с номерами 10h я 75h.

Исключение 10п!является синхронным,так как вызов его обработчика санк-

ционируется процессором при выполнении команд WAIT/FWAIT.Данные команды

в процессорах i486 и Pentium встроены практически во все команды сопроцессора

за исключением некоторых команд управления,поэтому работа любой команды

сопроцессора начинается с выяснения того,было ли зафиксировано какое-нибудьиз незамаскированных исключений.Здесь важно то,что контекст вычислитель-

ной ситуации после выполнения команды,вызвавшей исключение,оказывается

полностью сформированным (так как исключение синхронное,то есть ожидаемое)

и с ним можно корректно работать.

Если сигнал поступает на вход программируемого контроллера прерываний

IRQ13,то обработка исключения 75h может начаться в процессоре раньше,чем

в сопроцессоре закончит выполняться команда,вызвавшая исключение,то есть

в этом случае обработка прерывания является асинхронной к вычислительному

процессу.

Необходимо отметить влияние бита NE на процессы,протекающие в компьюте-

ре при возникновении исключения.Его состояние определяет стиль обработки

исключения процессором.Если бит NE =1,то процессор возбуждает исключение

16 (обработка в стиле 1286 и выше),если NE =0,то при возникновении исключения

процессор останавливается и ждет прерывания от программируемого контролле-

ра прерываний (обработка в стиле 18086).По умолчанию бит NE устанавливается в 0.

Если посмотреть на распределение прерываний в реальном и защищенном ре-

жимах,то необходимо обратить внимание на номер 7 вектора прерываний — обра-

щение к несуществующему сопроцессору.Прерывание появилось в процессоре 1286,

для которого сопроцессор не являлся обязательным устройством.Для того чтобы

программа,выполняющая математические вычисления,была независимой от ап-

паратной конфигурации конкретного компьютера,писалось два варианта фраг-

ментов кода,на которых эти вычисления выполнялись,— один с использованием

команд сопроцессора и второй с использованием целочисленных команд.При рас-

познавании в потоке команд инструкций сопроцессора процессоры 1286 и 1386 про-

веряли бит эмуляции сопроцессора ЕМ (см.табл.17.3).Если он был равен 1,то

процессор возбуждал исключение 7.Это означало,что сопроцессора в конфигура-

ции компьютера нет и его функции должны эмулироваться командами целочис-

ленного устройства.Забота об установке бита ЕМ ложилась на системное программ-

ное обеспечение.

Для процессоров i486 и Pentium состояние вычислительной среды определяет-

ся состоянием регистров после выполнения команды FINIT и содержимым регист-

ра CRO (биты МР и NE).

Что должен делать обработчик исключений сопроцессора?Его действия зави-

сят от того,какое незамаскированное исключение им обрабатывается.Следует

отметить основные действия по обработке любого исключения.

1.Сохранение среды сопроцессора командой FSTENV.Это необходимо для после-

дующего выяснения причин исключения,а в среде сопроцессора как раз и за-

фиксировано состояние регистров управления сопроцессором при возникно-

вении исключения.

2.Сброс установленных битов исключений в регистре SWR для предотвращения

циклического возникновения исключений.

3.Выяснение типа исключения.Если незамаскированными являются исключе-

ния нескольких типов,то обработчик путем анализа соответствующих битов

в регистре SWR должен определить их.Заметим,что содержимое SWR берется из

сохраненной при входе в процедуру по команде FSTENV среды сопроцессора.

Выполнение действий по корректировке ситуации.

5.Возвращение в прерванную программу (командой IRET).

Однако выяснить причину исключения мало,да это и несложно.Важно,испра-

вив ситуацию,вернуть управление прерванной программе.В защищенном режи-

ме работы процессора прерывания (исключения)делятся на несколько групп:сбои,

ловушки,исключения.Это деление осуществляется в зависимости от того,какая

информация сохраняв тся о месте возникновения прерывания (исключения)и воз-

можности возобновления прерванной программы.Для сопроцессора ситуация ана-

логична.Здесь инфор мация о месте возникновения исключения зависит от типа

исключения.Так,для исключений недействительной операции,деления на ноль

и денормализованног(э операнда запоминается адрес команды,вызвавшей исклю-

чение.То есть ситуация для этих типов исключений распознается,и исключение

возбуждается до исполнения команды сопроцессора (по классификации для за-

щищенного режима -• это сбой).При этом операнды в стеке ив памяти не моди-

фицируются.Для остальных типов исключений ошибочная ситуация распознает-

ся после выполнения действий «виноватой» команды.Это означает,что в стеке

в качестве адреса места возникновения исключения запоминается адрес следую-

щей (после виновниц ы)команды программы.При этом операнды в памяти и в ре-

гистровом стеке,возможно,будут изменены.Ваши действия должны учитывать

эти особенности возникновения различных типов исключений.

i

!

Использование отладчика

Отладчик Turbo Debuger предоставляет широкие возможности для отладки про-

грамм,использующих сопроцессор.Для наблюдения за состоянием регистров,со-

ставляющих программную модель сопроцессора в среде Turbo Debuger,необходи-

мо открыть специальное окно Numeric processor.Для этого выберите пункт главного

меню View > Numeric processor или нажмите сочетание клавиш Alt+V и далее N.По

умолчанию окно появится в компактном виде.Для того чтобы раскрыть его пол-

ностью,щелкните мь шью на стрелке в правом верхнем углу окна.

В заголовке окна отображаются четыре сообщения.

Модель сопроцессора (автоматически определяется отладчиком).

«IPTR=...» — сообщение о текущем содержимом указателя команд.Этот указа-

тель содержит физический (20-разрядный)адрес памяти,по которому распо-

ложена последняя выполнявшаяся инструкция сопроцессора.

ж «OPTR=...» — coo эщение об адресе памяти,к которому обращалась последняя

команда сопроцессора (если она имела адресный операнд).

9 «OPCODE=...» — |сообщение о коде операции последней исполняемой коман-

ды сопроцессора.Интересно отметить то,как формирует отладчик код опера-

У!Ы отмечали,что машинный код операции всех команд со-

сется с одинаковой последовательности битов — 11011,

ции в этом поле,

процессора начи

поэтому в поле OPCODE эти биты отбрасываются.Например,код команды fid —

Od906h (в двоичнфм виде — 1101 1001 0000 ОНО).Убираем пять битов,одина-

ковых для кода операции каждой команды сопроцессора,и получаем то,чтовидим в поле OPCODE заголовка окна Numeric processor,— 0106h (0000 0001 0000

ОНО).

В окне Numeric processor выделяются три области.Сразу заметим,что в отличие

от областей окна CPU области окна Numeric processor нельзя раскрывать отдельно.

Основную часть окна Numeric processor занимает область Registers,которая отража-

ет состояние восьми регистров стека сопроцессора ST(0)...ST(7).Указываются только

логические номера регистров.Наиболее полная информация о регистрах стека

предоставляется,если окно Numeric processor развернуто.Рассмотрим поля Registers,

описывающие состояние каждого из регистров стека сопроцессора.Первое поле

показывает состояние регистра.Возможные значения в этом поле следующие:

EMPTY -«пустой»;

VALID — в регистре корректное вещественное число;;

ZERO — в поле нулевое значение;

NaN — в регистре находится специальное численное значение — нечисло (Not

a Number).

Второе поле показывает логический номер регистра стека.Третье поле содер-

жит значения в регистре в виде 80-разрядного числа с плавающей точкой.Четвер-

тое поле показывает содержимое регистра стека в шестнадцатеричном виде.

В ходе отладки вы можете влиять на содержимое регистров стека.Для этого

в области Registers можно вызвать контекстное меню,активизируемое правой кноп-

кой мыши.В меню три команды:

в ZERO — обнуление содержимого регистра;

• EMPTY — освобождение регистра стека,при этом содержимое самого регистра

стека не изменяется,а изменению подвергается только тег в регистре тегов,

в который заносится значение lib;

it CHANGE — запись в регистр стека некоторого значения,которое должно быть

в допустимом формате в соответствии с синтаксисом ассемблера.

Следующую область окна Numeric processor условно можно назвать Control.Об-

ласть Control содержит совокупность полей,названия которых совпадают с назва-

ниями битов или полей битов в регистре управления сопроцессором CWR.Пере-

числим эти поля:

.1 1 IM — маска недействительной операции;

DM — маска денормализованного операнда;

ZM — маска деления на нуль;

ОМ — маска переполнения;

- UM — маска отрицательного переполнения;

РМ — маска точности;

IEM — маска запроса на прерывание (для i8087);

.PC — поле управления точностью;

RC — поле управления округлением;

1C — поле управления значением бесконечности. Контекстное меню области Control содержит всего одну команду — Toggle.Ее

назначение — циклическое изменение содержимого активного (в котором нахо-

дится курсор)поля.

Третья область ок та Numeric processor — Status — содержит совокупность полей,

названия которых совпадают с названиями битов или полей битов в регистре со-

стояния сопроцессор 1SW R:

IE — ошибка недействительной операции;

'DE — ошибка дено{>мализованного операнда;

-ZE — ошибка делещия на нуль;

ОЕ — ошибка переполнения;

UE — ошибка отрицательного переполнения;

-РЕ — ошибка точности;

• IR — маска запросу на прерывание;

-СС — код условия (состояние битов СЗ,С2,С1,СО);

-ST — указатель вер шины стека (поле ТОР регистра SWR).

Контекстное меню области Status содержит всего одну команду — Toggle.Ее на-

значение — цикличес кое изменение содержимого активного поля.

Сам процесс отладки программы ничем не отличается от процесса отладки про-

граммы для основного процессора.

Общие рекомендации

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...