Немаскируемая обработка исключений
⇐ ПредыдущаяСтр 4 из 4 Как производить немаскируемую обработку исключений?Для этого необходимо установить в ноль те флаги в регистре 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|