Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная_работа_1-4(8086).doc
Скачиваний:
58
Добавлен:
21.03.2015
Размер:
217.09 Кб
Скачать

Теоретические сведения Прерывания и их переопределение

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

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

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

  • текущее значение регистра 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