На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 4 / Обработка break Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Обработка break

DOS проверяет наличие break в двух случаях. Если запрос должен быть обработан в дисковом стеке и если проверка break разрешена, диспетчер прерывания int 21h вызывает подпрограмму проверки break. Подпрограмма опроса клавиатуры (вызываемая с помощью функций в/в символов) во время ожидания ввода и во время ожидания вывода на stdOut проверяет break.


Подпрограмма проверки break проверяет текущее устройство консоли.DOS идентифицирует устройство консоли путем проверки атрибутов драйверов устройства, когда она загружает их (см. главу 6). В своем заголовке устройство текущей консоли будет иметь установленные биты IsStdIn и IsStdOut. Адрес устройства текущей консоли DOS записывает в список списков. DOS будет проверять устройство консоли на break, даже если некоторые программы переназначают stdin. Существует неявное предположение о том, что устройство консоли было объявлено сервисной подпрограммой прерывания int 1Bh и может получать уведомление о break асинхронно. Побочный эффект такого объявления состоит в том, что если stdin переназначается на файл и программа выполняет его чтение с помощью функции прерывания int 21h, номер которых больше 0Ch, то клавиша Control-C не имеет своего обычного предназначения.


Подпрограмма опроса клавиатуры сначала вызывает подпрограмму проверки break и затем проверяет стандартный ввод. Когда идут операции в/в символов, DOS обнаруживает break либо от устройства консоли, либо от стандартного ввода; но когда DOS работает со стеком дискового в/в, то проверяется только устройство консоли.


Подпрограмма DOS, обрабатывающая break, устанавливает SS:SP в значение, записываемое с помощью диспетчера int 21h, восстанавливает все регистры в состояние, предшествующее прерыванию int 21h, сбрасывает флажки критической секции и критической ошибки, и выполняет инструкцию int 23h. ISR int 23h может возвратить управление в подпрограмму обработки break DOS либо по инструкции IRET, либо по инструкции RET. Выполнение инструкции IRET удаляет 6 байтов из стека, в то время как выполнение возврата far (далекий) удаляет только 4 байта. Путем выполнения сравнения значений в SP до и после выполнения инструкции int 23h, подпрограмма break может сообщить, какая инструкция (RET или IRET) возвратила управление.


Если ISR int 23h сохраняет используемые ею регистры, то она может продолжать выполнение с помощью инструкции IRET. Если ISR возвращает управление с помощью возврата far (далекий), то, будет или нет продолжено выполнение, определяется состоянием флага переноса. Если флаг переноса очищен, то выполнение будет продолжено, иначе - программа будет аварийно завершена. Подпрограмма break DOS вынуждает выполнить аварийное завершение путем загрузки в регистр AX значения 4C00h. Во всех случаях управление возвращается в начало диспетчера int 21h. Затем диспетчер повторно выполняет запрос int 21h, или выполняет запрос завершения в случае аварийного завершения.


По умолчанию ISR int 23h содержит инструкцию IRET. Файл COMMAND.COM устанавливает свою собственную ISR int 23h, которая аварийно завершает текущую программу. Другие программы могут устанавливать свои собственные подпрограммы обслуживания int 23h.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz