Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практические занятия / Практическая работа 5

.doc
Скачиваний:
17
Добавлен:
01.05.2014
Размер:
30.21 Кб
Скачать

Практическая работа №5

Тема: Работа с прерываниями: перехват и восстановление.

Цель работы: Изучить алгоритм переопределения и восстановления прерываний.

Задание: Разработать программу переопределения прерывания 05h (клавиша PrintScreen).

Замечания:

  1. Перед загрузкой нового вектора прерывания необходимо сохранить старый вектор (функция 35h прерывания 21h)

  2. Новый обработчик прерывания должен быть FAR-процедурой.

  3. Для проверки, новая процедура обработки прерывания 05h должна выводить в динамик сигнал (прерывание 21H). В основной программе необходимо организовать большой цикл, например, выводящий на экран символы (прерывание 21h использовать нельзя, можно использовать, например, прерывание 10h). Таким образом, при нажатии на PrintScreen во время этого цикла компьютер должен издавать сигнал.

Прерывания и их переопределение. Иногда необходимо выполнить одну из набора специальных процедур, если в системе или в программе возникают определенные условия, например, нажата клавиша на клавиатуре. Действие, стимулирующее выполнение одной из таких процедур, называется прерыванием. Существует два общих класса прерываний: внутренние и внешние. Первые инициируются состоянием ЦП или командой, а вторые - сигналом, подаваемым от других компонентов системы.

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

Последовательность прерывания состоит в следующем:

  • текущее значение регистра Flags включается в стек;

  • текущее значение регистра CS включается в стек;

  • текущее значение регистра IP включается в стек;

  • сбрасываются флаги IF и TF.

Новое содержимое IP и CS определяет начальный адрес выполняемой процедуры прерывания (обслуживание прерывания). Возврат в прерванную программу осуществляется командой, которая извлекает из стека содержимое для IP, CS и регистра флагов (обычно это команда IRET).

Адреса подпрограмм обслуживания прерываний (вектора прерываний) хранятся в таблице векторов прерываний. Таблица векторов прерываний располагается по адресу 0000:0000 и представляет собой массив из 256 элементов, каждый элемент которого занимает 4 байта и представляет собой начальный адрес процедуры обработки прерывания.

Иногда в программе возникает необходимость переопределения (перехвата) прерываний (например, выполнение дополнительных действий при нажатии определенной клавиши клавиатуры). Процесс перехвата прерываний состоит в следующем:

  • подготавливается FAR-процедура – новый обработчик прерываний (должна заканчиваться командой IRET);

  • сохраняется старый вектор прерывания (функция 35h прерывания 21h)

  • адрес нового обработчика заносится в таблицу векторов прерываний (функция 25h прерывания 21h);

  • в конце программы происходит восстановление первоначального обработчика прерываний.

Функция 35h

Вход: AH=35H

AL=номер прерывания (00H до 0ffH)

Выход: ES:BX=адрес обработчика прерывания

Описание: Возвращает значение вектора прерывания для INT (AL), то есть загружает в BX 0000:[AL*4], а в ES - 0000:[(AL*4)+2].

Функция 25h

Вход: AH=25H

AL=номер прерывания (00H до 0ffH)

DS:DX=вектор прерывания (адрес подпрограммы)

Выход: нет

Описание: Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, в момент записи прерывания будут заблокированы.

Ниже приведен фрагмент программы, иллюстрирующий установку нового вектора прерывания вместо обработчика PrintScreen (05h).

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

;Процедура – новый обработчик прерывания

PRNSCR PROC FAR

. . .

IRET

PRNSCR ENDP

START:

XOR AX,AX ;Обычное начало для EXE-программы

MOV BX,DATA

MOV DS,BX

. . .

;Установка нового вектора

LEA DX,CS:PRNSCR ;В DX – смещения нового обработчика

PUSH DS ;Сохранение сегментного регистра DS

PUSH CS ;Следующие две строки: загрузка регистра DS

POP DS ;значением из CS через стек

MOV AH,25H ;номер функции

MOV AL,5 ;номер прерывания

INT 21H ;установка нового прерывания

POP DS ;восстановление DS

. . .

CODE ENDS