Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Работа с векторами прерываний.






Система прерываний.

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

Адреса подпрограмм обслуживания прерываний находятся в специальной таблице и называются векторами прерывания. В реальном режиме таблица вектров распологается в начале физической памяти; вектор имеет длину четыре байта и храниться в форме CS: IP. В защищенном режиме таблица векторов может быть расположена в любом месте и содержит более сложные дескрипторы (в режиме V86 имеется подобие таблицы реального режима).

Работа с системой прерываний может рассматриваться с двух точек зрения:

1. Работа с векторами прерываний;

2. Работа с микросхемами контроллеров прерываний (современные рашины могут не иметь отдельной микросхемы контроллера прерываний, но их регистры сохранены в адресном пространстве).

ПРИМЕЧАНИЕ: Еще раз подчеркивается, что речь идет прежде всего о реальном режиме. Попытка " попробовать" в любом другом может иметь непредсказуемые последствия.

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

При работе в режиме V86 возможно изменение образа таблицы прерываний, но последствия определяются возможностями виртуального монитора!

Работа с векторами прерываний.

Необходимость работать с таблицей прерываний может возникнуть в следующих случаях:

1. Как прерывание можно вызывать одну из ваших подпрограмм. Хотя вызов подпрограммы как прерывания требует больше процессорного времени, такой подход оправдан если необходимо нарушить принцип иерархичности программного обеспечения внутри одного модуля или если эта процедура используется многими Вашими программами (ее можно оставить резидентной после завершения программы настройки Вашей системы).

2. Второй причиной написания прерывания может быть использование какого-либо отдельного аппаратного прерывания. Это прерывание автоматически вызывается при возникновении определенных условий.
Обычно BIOS инициализирует неиспользуемые ею вектора прерываний так, что они указывают на процедуру, которая вообще ничего не делает (она содержит один оператор IRET). Вы можете написать свою процедуру и изменить вектор прерываний, чтобы он указывал на нее. Тогда при возникновении аппаратного прерывания будет выполняться Ваша процедура.

3. Возможна подмена существующего прерывания на ваше собственное. Одно из таких прерываний это прерывание времени суток, которое автоматически вызывается 18.2 раза в секунду. Обычно это прерывание только обновляет показание часов, но Вы можете использовать его для синхронизации событий внутри Вашей программы. Другие возможности - это написание процедуры обработки Ctrl-Break если Ваша программа должна выполнять некие специфические действия перед своим завершением.

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

Таблица векторов прерываний занимает 1Кбайт памяти в диапазоне 00000h - 00400h. Каждому вектору отводится четыре байта в таблице и присваивается номер от 00h до FFh. При инициализации системы вектора настраиваются на подпрограммы, расположенные в ROM BIOS или DOS.

За пользователем сохраняется возможность перенастраивать вектора по своему усмотрению. Это можно сделать записав по соответствующему физическому адресу необходимое программисту значение, или обратившись к службам DOS. В любом случае необходимо позаботиться о сохранении старого вектора и восстановлении его значения перед завершением программы.

Функция 25H прерывания 21H устанавливает вектор прерывания на указанный адрес. Адреса имеют размер два слова. Старшее слово содержит значение сегмента (CS), младшее содержит смещение (IP). Чтобы установить вектор, указывающим на одну из Ваших процедур, нужно поместить сегмент процедуры в DS, а смещение в DX Затем поместите номер прерывания в AL и вызовите функцию. Функция 25H автоматически запрещает аппаратные прерывания в процессе изменения вектора, поэтому не существует опасности, что посреди дороги произойдет аппаратное прерывание, использующее данный вектор.

; ---установка прерывания

PUSH DS; сохраняем DS

MOV DX, OFFSET ROUT; смещение для процедуры в DX

MOV AX, SEG ROUT; сегмент процедуры

MOV DS, AX; помещаем в DS

MOV AH, 25H; функция установки вектора

MOV AL, 60H; номер вектора

INT 21H; меняем прерывание

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

; ---процедура прерывания

ROUT PROC FAR

.

.

IRET

ROUT ENDP

Функция 35 прерывания 21H возвращает текущее значение вектора прерывания, помещая значение сегмента в ES, а смещение в BX. Перед установкой своего прерывания получите текущее значение вектора, используя эту функцию, сохраните эти значения, и затем восстановите их с помощью функции 25H (как выше) перед завершением своей программы.
Например:

; ---в сегменте данных:

KEEP_CS DW 0; хранит сегмент заменяемого прерывания

KEEP_IP DW 0; хранит смещение прерывания

; ---в начале программы

MOV AH, 35H; функция получения вектора

MOV AL, 1CH; номер вектора

INT 21H; теперь сегмент в ES, смещение в BX

MOV KEEP_IP, BX; запоминаем смещение

MOV KEEP_CS, ES; запоминаем сегмент

; ---далее можно изменять вектор по своему усмотрению...

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

Другая неприятность может заключаться в том, что при завершении программы по Ctrl-Break вектор прерывания не будет восстановлен, если только Вы не предусмотрите, чтобы программа реакции на Ctrl-Break выполняла эту процедуру.

ПРИМЕЧАНИЕ: Не рекомендуется прямо устанавливать вектор прерываний, обходя функцию DOS. В частности в многозадачной среде операционная система может поддерживать несколько таблиц векторов прерываний и реальный физический адрес таблицы может быть известен только DOS.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал