3.2.8 Создание процедуры обработки Ctrl-Break.

Error message

Notice: Undefined index: add term path in hansel_get_breadcrumbs() (line 524 of /data/sites/msdosworld.ru/www/sites/all/modules/hansel/hansel.module).

  Когда вводится комбинация 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, чтобы флаг был установлен или очищен.


 

Вы находитесь в разделе: 

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