Глава 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.-~>

Сайт управляется системой uCoz