Глава 3. Kлавиатура.
Раздел 2. Доступ к отдельным клавишам.
3.2.8 Создание процедуры обработки Ctrl-Break.
Kогда вводится комбинация Ctrl-Break, то прерывание клавиатуры устанавливает флаг, указывающий что должна быть выполнена процедура обработки Ctrl-Break. Управление передается этой процедуре только в тот момент, когда программа использует функцию DOS, способную распознавать этот флаг. Обычно только стандартные функции ввода/вывода MS DOS могут распознавать этот флаг (функции от 1 до C прерывания 21H, за исключением функций 6 и 7). Hо поместив строку BREAK=ON либо в файл AUTOEXEC.BAT, либо в CONFIG.SYS, используемые MS DOS при старте системы, Вы получите ситуацию, когда обращение к любой функции DOS приведет к вызову процедуры обработки Ctrl-Break. При этом выполнение программы будет немного замедлено.
Процедура обработки Ctrl-Break дает возможность завершить программу в любой момент времени. Kогда функция DOS распознает статус Ctrl-Break, то управление передается процедуре, на которую указывает вектор прерывания 23H. DOS использует эту процедуру для завершения работающей программы. Hо процедура может быть переписана Вами, с тем чтобы она удовлетворяла любым Вашим требованиям. Эта процедура должна быть программируемой, с тем чтобы перед завершением программы могли быть выполнены все критические операции. Может требоваться выравнивание стека, с тем чтобы 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. Hадо поместить в AL 0 и вызвать функцию 33 прерывания 21H. При возврате DL будет содержать 1, если был установлен флаг прерывания по Ctrl-Break, и 0 - в противном случае. Если при вызове поместить в AL 1, то статус будет установлен. В этом случае, перед вызовом функции, поместите в DL 0 или 1, чтобы флаг был установлен или очищен.
<~-3.2.7 Создание макроопределений для отдельных клавиш.
Содержание
3.2.9 Перепрограммирование клавиши PrtSc.-~>