5.1.5. Int 24h - Обработчик фатальных ошибок

      В  этом   векторе  (0:90h)  хранится   адрес,  по  которому

 передается  управление,  если  какой-либо  драйвер ДОС обнаружит

 фатальную  ошибку  (например,  незакрыта  дверца  дисковода  или

 выключен принтер).  Этот вектор копируется  в PSP при  вызове фн

 26h и 4Bh и восстанавливается из него при завершении программы.

 

      Стандартный обработчик фатальных  ошибок, встроенный в ДОС,

 выводит на экран вопрос

 

      Abort, Retry, Ignore?

 

      (завершить аварийно, повторить ошибку, игнорировать?)

 

 и ждет ответа пользователя.

 

      Если   Вы   не   хотите,   чтобы   ДОС   портил   тщательно

 сформированный Вашей  программой экран, то  она должна содержать

 свой обработчик этого прерывания.

 

      Вход: BP:SI указывает на заголовок драйвера устройства,

            обнаружившего ошибку;

            DI содержит в младшем байте код ошибки (см. 6.4);

            старший байт неопределен;

            AH = информация об ошибке:

 

   7   6   5   4   3   2   1   0

 ┌───┬───┬───┬───┬───┬───────┬───┐

    │ 0 │                  

 └─┬─┴───┴─┬─┴─┬─┴─┬─┴───┬───┴─┬─┘ Бит:

                          └─>0: тип операции (0=чтение,

                                1=запись)

                     └───────>1-2: испорченная область диска:

                                   00=системные файлы, 01=FAT

                                   10=каталог, 11=область

                                   данных

                └─────────────>3:1=допустимо FAIL   \  только

             └─────────────────>4:1=допустимо RETRY   > в ДОС

          └─────────────────────>5:1=допустимо IGNORE /  3.x

   └─────────────────────────────>7: тип устройства: 0=диск,

                                                     1=прочие

 

             AL = номер дисковода (0=A, 1=B, ...), если бит 7 в

                  AH равен 0.

 

      Примечание:  Если бит  7 в  AH=1, то  остальные биты  AH не

 определены.

 

      Ваш обработчик  ошибок может вывести  на экран подсказку  и

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

 дисковода или включения принтера).  Нельзя обращаться к функциям

 ДОС  с номерами  более 0Ch  (за исключением  фн 59h),  т. к. это

 разрушит  внутренний  стек  ДОС.  Дополнительную  информацию  об

 ошибке можно получить обращением к фн 59h или анализом заголовка

 драйвера, на который указывают регистры BP:SI.

 

      Выход:   Обычно  обработчик   фатальной  ошибки   выполняет

 следующие действия:

 

      - обрабатывает или пытается исправить ошибку;

      - заносит в AL код действия (учитывая биты AH - в ДОС 3.x):

           0 = игнорировать ошибку (IGNORE);

           1 = повторить операцию (RETRY);

           2 = аварийно завершить (ABORT) программу через Int 23h

               (см. 5.1.4);

           3 = вернуться   в   прикладную   программу  (FAIL)   с

               сообщением о неудачном выполнении функции ДОС.

      - вернуть управление ДОС командой IRET.

 

      Наилучшим  вариантом представляется  возврат с  AL=3. Если,

 например, операция "открыть файл"  обнаружила отсутствие диска в

 дисководе, Вы  позволяете своей программе  обработать эту ошибку

 стандартным образом (анализом бита CF и кода ошибки после вызова

 функции ДОС). Недостатки этого подхода:

 


      - вариант AL=3 отсутствует в версиях ДОС, предшествовавших

 3.0;

      -  ДОС  в  этом  случае  возвращает  программе  не  слишком

 информативный код ошибки 53h.

 

      СТЕК: При входе в обработчик Int 24h стек содержит значения

 всех  регистров   программы,  на  момент   вызова  функции  ДОС,

 обнаружившей  фатальную ошибку.  Для доступа  к этой  информации

 выполните следующие команды:

 

      push  bp

      mov   bp,sp

 

      Тогда стек будет иметь следующее содержимое:

 

 Смещение  Содержимое

 ─────────────────────

  00h      Значение BP, которое Вы втолкнули

  02h      IP функции ДОС     \  Адрес возврата в ДОС через

  04h      CS функции ДОС      > IRET

  06h      Флаги функции ДОС  /

  08h      AX  \

  0Ah      BX   |

  0Ch      CX   |

  0Eh      DX   |  Регистры Вашей программы перед

  10h      SI    >

  12h      DI   |  вызовом функции ДОС

  14h      BP   |

  16h      DS   |

  18h      ES  /                \

  1Ah      IP Вашей программы    |  Адрес возврата в прикладную

  1Ch      CS Вашей программы     >

  1Eh      Флаги Вашей программы |  программу через IRET

                                /

 

      Отсюда Вы  можете узнать, в какой  функции произошла ошибка

 (анализируя AH  и остальные регистры  в строке). Кроме  того, Вы

 можете восстановить регистры и  вернуться непосредственно в Вашу

 программу.

 

      В последнем  случае следует занести  в AX код  ошибки ДОС и

 установить флаг  CF, указывающий на  наличие ошибки. Техническое

 описание  говорит,  что  в  этом  случае  ДОС будет находиться в

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

 какая-либо функция с номером более 0Ch. Тем не менее, этот метод

 используется многими успешно работающими программами.

 

      Примечание: Дисковые  ошибки при выполнении  Int 25h/26h не

 вызывают обращения к Int 24h.

 

      См. также: Фн 59h

                 Коды ошибок ДОС

                 Запуск и завершение программ

 

 

Вы находитесь в разделе: 
Также вам будет интересно:

Добавить коментарий