Низкоуровневое програмирование Главная - Реальный режим - Прерывания DOS - INT 24h: Адрес обработчика критических ошибок.

INT 24h: Адрес обработчика критических ошибок.

Этот вектор (0000:0090) хранит адрес, по которому передается управление, когда драйвер устройства DOS обнаруживает критическую ошибку. адрес по этому вектору копируется в PSP функицями 26h (создать PSP) и 4Bh (EXEC). При выходе родительские значения восстанавливаются в векторе INT 24h из родительского PSP.
Нормальный обработчик INT 24h - это код, который выдает сообщение:
    "Abort, Retry, Ignore?"
которое вы видите при неготовности дискеты или принтера.

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

Вход:
BP:SI => заголовок устройства , позволяющий определить сбойное устройство
DI = биты 0-7 содержат код ошибки (биты 8-15 не определены)
AL = если в AH бит 7=0, то в AL номер диска (0=A, 1=B, и т.д.)
AH = информация об ошибке:
БитыЗначение
0тип операции:
0 - чтение
1 - запись
1 и 2задействаванная область диска:
00 - системные файлы
01 - таблица FAT
10 - оглавление
11 - область данных
3FAIL-выход разрешён
только DOS3.x
4RETRY-выход разрешён
только DOS3.x
5IGNORE-выход разрешён
только DOS3.x
6зарезерировано, равно 0
7тип устройства:
0 - диск
1 - иные устройства
Вы можете обработать ошибку, запросив действие пользователя (например, подготовить дискету или включить принтер). функции DOS выше 0cH не следует использовать (исключая функцию 59H , которая работает нормально). Вы можете получить дополнительную информацию через функцию 59H и/или через блок заголовка устройства, адресуемый через BP:SI.

Выход:
После обработки ошибки вы можете загрузить в регистр AL код действия и вернуться в DOS, указав одно из следующих действий:
ALсмысл
0игнорироавть ошибку
1повторить операцию
2завершить через адрес 23h (как при Ctrl-Break)
3вернуться в приложение, индицируя сбившуюся функцию DOS
Только для DOS3.0 или выше
DOS 3.x проверьте AH при входе, чтобы определить допустимые действия. Опция AL=3 кажется идеальной. например, если операция "открыть файл" вызвала ошибку из-за отсутствия диска в устройстве, вы можете предоставить вашему приложению самому обработать эту ситуацию. Однако эта опция имеет недостатки:
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