прерываний. В библиотеке СИ имеется функция для организации цепочки прерывания с именем _chain_intr.
Для описания функции, выполняющей обработку прерывания, следует использовать ключевое слово interrupt. Такая функция завершается командой возврата из прерывания IRET. Для нее автоматически генерируются команды сохранения регистров на входе и их восстановления при выходе из обработчика прерывания. void interrupt far int_funct(...)
{
// Тело обработчика прерывания
}
Ключевое слово interrupt используется также для описания переменных, предназначенных для хранения векторов прерываний:
void interrupt (far *oldvect)(...);
Для установки своего обработчика прерываний используется функция _dos_setvect. Эта функция имеет два параметра - номер прерывания и указатель на новую функцию обработки прерывания:
_dos_setvect(0x16, my_key_intr);
В этом примере для прерывания номер 16h устанавливается новый обработчик прерывания my_key_intr.
Для того чтобы узнать адрес старого обработчика прерывания по его номеру используется функция _dos_getvect, которая принимает в качестве параметра номер прерывания и возвращает указатель на соответствующий номеру обработчик:
old_vector = _dos_getvector(0x16);
Следующая программа иллюстрирует применение перечисленных выше функций для создания цепочки обработчиков прерываний. Эта программа встраивает собственный обработчик прерываний от таймера, который будет вызываться 18,2 раза в секунду. Встраиваемый обработчик прерываний подсчитывает прерывания от таймера, и, если значение соответствующего счетчика кратно 20, громкоговоритель компьютера издает звуковой сигнал.
В конце работы новый обработчик прерываний вызывает старый обработчик прерываний.
После установки нового обработчика прерывания таймера основная программа ждет, когда пользователь нажмет любую клавишу, затем она восстанавливает старое содержимое вектора прерывания.
#include
#include
#include void main(void);
void interrupt far timer(...);
void interrupt (far *oldvect)(...);
// Переменная для подсчета прерываний таймера
volatile long ticks;
void main(void);
{
// Сбрасываем счетчик
ticks = 0;
// Запоминаем адрес старого обработчика прерываний
oldvect = dos_getvect (0x1c):
// Устанавливаем новый обработчик прерываний
dos_setvect (0x1c, timer);
printf ("\nТаймер установлен. Нажмите любую клавишу...\n");
getch();
// Восстанавливаем старый обработчик прерываний
dos_setvect (0x1c, oldvect);
}
void interrapt far timer (...)
{
// Увеличиваем счетчик прерываний таймера
ticks++;
// Если значение счетчика кратно 20, выдаем сигнал на громкоговоритель
// компьютера
if (ticks % 20) == 0 )
{
asm mov bx,0
asm mov ax,0E07h
asm int 10h
}
// Вызываем старый обработчик прерываний
_chain_intr (oldvect);
}
Порядок выполнения работы
1. Отладить программу, приведенную выше в описании лабораторной работы.
2. Составить и отладить программу, подсчитывающую число обращений к услугам операционной системы через прерывание INT 21h. Число обращений подсчитать для программы, составленной на лабораторной работе №1, №2 или №3. Содержание отчета
Цель работы. Список наиболее часто используемых векторов прерываний Результаты работы программы.
Контрольные вопросы
Принципы обработки прерываний в современных ОС. Особенности обработки программных прерываний.
Похожие работы
Тема: Операционная система |
Предмет/Тип: Информатика, ВТ, телекоммуникации (Реферат) |
Тема: Операционная система. |
Предмет/Тип: Информатика, ВТ, телекоммуникации (Реферат) |
Тема: Операционная система |
Предмет/Тип: Отсутствует (Контрольная работа) |
Тема: Making Utilities For MSDOS Essay Research Paper |
Предмет/Тип: Английский (Реферат) |
Тема: Операционная система Unix |
Предмет/Тип: Информатика, ВТ, телекоммуникации (Курсовая работа (п)) |
Интересная статья: Быстрое написание курсовой работы