Страница 19 из 26
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, чтобы флаг был установлен или очищен.
|