5.1.4. Int 23h - Адрес обработки Ctrl-Break

      В   этом  векторе   (0:8Ch)  хранится   адрес,  на  который

 передается  управление  при   нажатии  пользователем  комбинации

 клавиш Ctrl-Break  или Ctrl-C. Этот вектор  копируется в PSP при

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

 программы.

 

      ДОС  вызывает  Int  23h  всякий  раз,  когда  он распознает

 нажатие   Ctrl-Break.   Распознавание   Ctrl-Break  определяется

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

 задан фн 23h:

 

      -  если  флаг  прерывания  установлен,  то  ДОС  распознает

 Ctrl-Break  во время  выполнения любых  функций, кроме  фн 06h и

 07h;

      -  если этот  флаг  сброшен,  то ДОС  распознает Ctrl-Break

 только во время обмена  с консолью, принтером и последовательным

 интерфейсом.

 

      Стандартный   обработчик  Ctrl-Break,   встроенный  в  ДОС,

 вызывает  немедленное  завершение  текущей  программы. Вы можете

 написать  свой обработчик  Ctrl-Break и  установить его  адрес в

 вектор   23h   с   помощью   фн   25h.   При   этом   Вы  должны

 руководствоваться следующими правилами.

 

      1. При входе в обработчик  Ctrl-Break все регистры имеют те

 же  значения,  что  и  перед  вызовом  функции ДОС, распознавшей

 Ctrl-Break.

 

      2.  Если  Вы  хотите  игнорировать  Ctrl-Break,  то  просто

 подайте команду IRET.

 

      3.  Если Вы  хотите  выполнить  какие-либо действия,  то Вы

 должны:

 

      -   сохранить   все   регистры   перед   этим  действием  и

 восстановить их перед выходом;

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

  

      Ваш обработчик  может обращаться к  любым функциям ДОС,  но

 если  он  использует  ввод-вывод  символов   (фн  01h - 0Ch)   и

 пользователь  вновь   нажмет  Ctrl-Break,  то   произойдет  крах

 системы.

 

      4.  Если Вы  хотите завершить  текущий процесс,  то подайте

 команды:

 

       stc  ; CF=1

       retf ; длинный возврат

 

      ДОС  произведет  нормальное  завершение  текущего процесса.

 RETF с CF=0 эквивалентен IRET.

 

      Если  Ваша программа  подолгу не  обращается к вводу-выводу

 (например,  производит  длинные  вычисления),  то  для  проверки

 нажатия  Ctrl-Break  можно  поместить  внутрь  цикла  вычислений

 обращение к фн 0Bh.

 

      См. также: Запуск и завершение программ

                 Символьный ввод-вывод.

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

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