CodeNet / Платформы / Другие платформы / DOS / Прерывания DOS и BIOS
Функции DOS - INT 24H: обработчик критических ошибок.
Этот вектор (0000:0090) хранит адрес, по которому передается управление, когда драйвер устройства DOS обнаруживает критическую ошибку. адрес по этому вектору копируется в PSP функицями 26H (создать PSP) и 4bH (EXEC). При выходе родительские значения восстанавливаются в векторе INT 24H из родительского PSP.
Нормальный обработчик INT 24H - это код, который выдает сообщение:
Abort, Retry, Ignore? _
которое вы видите при неготовности дискеты или принтера.
Наиболее сложные программы предоставляют собственный обработчик критических ошибок.
Вход
При входе в обработчик INT 24H регистры содержат следующие данные:
- BP:SI => заголовок устройства , позволяющий определить сбойное устройство
- DI = биты 0-7 содержат код ошибки (биты 8-15 не определены)
- AL = если в AH бит 7=0, то в AL номер диска (0=A, 1=B, и т.д.)
- AH = информация об ошибке:
Вы можете обработать ошибку, запросив действие пользователя (например, подготовить дискету или включить принтер). функции DOS выше 0cH не следует использовать (исключая функцию 59H , которая работает нормально). Вы можете получить дополнительную информацию через функцию 59H и/или через блок заголовка устройства, адресуемый через BP:SI.
Выход
После обработки ошибки вы можете загрузить в регистр AL код действия и вернуться в DOS, указав одно из следующих действий:
- AL=0: игнорировать ошибку
- AL=1: повторить операцию
- AL=2: снять. завершить через адрес INT 23H (как при Ctrl-Break)
- AL=3: вернуться в приложение, индицируя сбившуюся функцию DOS
DOS 3.x проверьте AH при входе, чтобы определить допустимые действия. Опция AL=3 кажется идеальной. например, если операция "открыть файл" вызвала ошибку из-за отсутствия диска в устройстве, вы можете предоставить вашему приложению самому обработать эту ситуацию. Однако эта опция имеет недостатки:
- Опция AL=3 НЕДОСТУПНА в версиях DOS младше 3.0
- DOS всегда возвращает код ошибки 53H, который не очень информативен
Стек
При входе в обработчик INT 24H, стек имеет состояние, описанное ниже:
- IP - адрес для возврата в DOS через IRET
- CS - адрес для возврата в DOS через IRET
- Flags
- AX,BX,CX,DX,SI,DI,BP,DS,ES - регистры прикладной программы перед INT 21H
- IP - адрес для возврата непосредственно в приложение
- CS - адрес для возврата непосредственно в приложение
- Flags - регистр флагов приложения
Эту информацию можно использовать, чтобы определить сбившуюся функцию (через AH в стеке) и любые параметры (через другие регистры). Но более существенно то, что ваш обработчик INT 24H может восстановить регистры и осуществить возврат непосредственно в прикладную программу.
Обычно ваш обработчик будет имитировать DOS, загружая AX кодом ошибки DOS и взводя флаг CF, чтобы индицировать ошибку (хорошие программы так и поступают). Когда вы возвращаетесь в приложение таким способом, то, как утверждается в документации, DOS будет в "неустойчивом" состоянии до тех пор, пока не будет вызвана функция с номером старше 0cH. Тем не менее, такая техника успешно используется многими программами.
Вектор INT 24H ИГНОРИРУЕТСЯ для дисковых ошибок, встречающихся при INT 25H/26H