Информатика и технология программирования


Средства обработки прерываний в Си - часть 2


Значения этих параметров могут быть использованы в программе обработки прерывания.

При изменении этих параметров значения соответствующих регистров будут изменены после выхода из прерывания. Список формальных параметров необходим при обработке программного прерывания, когда регистры используются для передачи входных параметров и результата.

Кроме того, можно использовать указатель на функцию обработки прерывания вида void interrupt(*FUN)( ... ).

Поскольку прерывание предполагает вызов функции по длинному адресу (со сменой сегмента), такой указатель является длинным ( far ). Можно сказать, что подобный указатель является вектором прерывания.

При прямом вызове функции обработки прерывания по указателю (*FUN)() компилятор эмулирует прерывание по адресу, содержащемуся в FUN - генерирует команды записи в стек регистра флaгов и обращения к подпрограмме по длинному адресу в FUN. Это можно назвать эмуляцией прерывания по вектору, сохраненному в FUN.

Принцип обслуживания прерываний в DOS предполагает, что прикладная программа предварительно запоминает старый вектор прерывания и устанавливает собственный вектор прерывания - адрес собственной функции обработки. В ходе обслуживания прерывания программа должна вызвать обработчик прерывания по старому вектору - командой безусловного перехода или эмуляцией прерывания. Это приводит к выполнению цепочки обработчиков прерывания, перехватывающих вектор прерывания друг у друга. Для сохранения и установки вектора прерывания служат функции getvect(), setvect(). В следующем примере рассматривается стандартный способ подключения собственного обработчика прерывания к вектору прерывания от таймера в начало цепочки.


&#35include &#60dos.h&#62
&#35define TIMVEC 0x8 // Номер вектора аппаратного


// прерывания от таймера


void interrupt (*TIMOLD)(...); // Старый вектор прерывания


void interrupt TIMINT(...) // Функция обработки прерывания


{
(*TIMOLD)(); // Эмуляция прерывания по


// старому вектору


// Собственная обработка




Начало  Назад  Вперед



Книжный магазин