Справочник программиста на персональном компьютере фирмы IBM. Клавиатура - Создание процедуры обработки Ctrl-Break
ОГЛАВЛЕНИЕ
3.2.8 Создание процедуры обработки Ctrl-Break.
Когда вводится комбинация Ctrl-Break, то прерывание клавиатуры
устанавливает флаг, указывающий что должна быть выполнена проце-
дура обработки Ctrl-Break. Управление передается этой процедуре
только в тот момент, когда программа использует функцию DOS,
способную распознавать этот флаг. Обычно только стандартные функ-
ции ввода/вывода MS DOS могут распознавать этот флаг (функции от
1 до C прерывания 21H, за исключением функций 6 и 7). Но поместив
строку BREAK=ON либо в файл AUTOEXEC.BAT, либо в CONFIG.SYS,
используемые MS DOS при старте системы, Вы получите ситуацию,
когда обращение к любой функции DOS приведет к вызову процедуры
обработки Ctrl-Break. При этом выполнение программы будет немного
замедлено.
Процедура обработки Ctrl-Break дает возможность завершить
программу в любой момент времени. Когда функция DOS распознает
статус Ctrl-Break, то управление передается процедуре, на которую
указывает вектор прерывания 23H. DOS использует эту процедуру для
завершения работающей программы. Но процедура может быть перепи-
сана Вами, с тем чтобы она удовлетворяла любым Вашим требованиям.
Эта процедура должна быть программируемой, с тем чтобы перед
завершением программы могли быть выполнены все критические опера-
ции. Может требоваться выравнивание стека, с тем чтобы SP указы-
вал на второе слово от вершины (первое слово для программ COM)
перед выполнением завершающей инструкции RET. Вектора прерывания,
измененные программой должны быть восстановлены, а все открытые
устройства ввода/вывода - закрыты. Если были запрещены прерыва-
ния, то надо разрешить их. Все это должно обеспечить машине воз-
можность нормально работать со следующей программой после завер-
шения программы по Ctrl-Break. Другая альтернатива - сделать
процедуру обработки Ctrl-Break, состоящей из одной инструкции
IRET, что запрещает завершение программы таким способом.
Средний уровень.
В данном примере выход из программы происходит после выравни-
вания стека. Процедура кончается инструкцией RET, а не IRET,
поскольку в данном случае она действует в точности так же, как и
инструкция RET при нормальном завершении программы. В момент,
когда она используется, указатель стека (SP) должен указывать на
второе слово стека. Это предполагает, что программа в форме EXE.
Помните, что стек помещаает свое первое слово в самую старшую
ячейку памяти, второе - в ячейку ниже, и т.д. Если размер стека
400 байт, то надо установить SP на 396. Для программ COM надо
устанавливать указатель стека на первое слово стека или просто
завершать процедуру обработки Ctrl-Break прерыванием 21H.
;---это новая процедура обработки Ctrl-Break
C_B PROC FAR
MOV AX,396 ;значение для второго слова стека
MOV SP,AX ;выравниваем указатель стека
RET ;возврат в DOS
C_B ENDP ;
;---изменение вектора прерывания
PUSH DS ;сохраняем регистр
MOV AX,SEG C_B ;готовим адрес процедуры
MOV DS,AX ;
MOV DX,OFFSET C_B ;
MOV AH,25H ;номер функции
MOV AL,23H ;номер вектора
INT 21H ;изменяем вектор
POP DS ;восстанавливаем регистр
Программа может в любое время проверить был ли сделан запрос
на выполнение процедуры обработки Ctrl-Break. Надо поместить в AL
0 и вызвать функцию 33 прерывания 21H. При возврате DL будет
содержать 1, если был установлен флаг прерывания по Ctrl-Break, и
0 - в противном случае. Если при вызове поместить в AL 1, то
статус будет установлен. В этом случае, перед вызовом функции,
поместите в DL 0 или 1, чтобы флаг был установлен или очищен.