Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Написание процедуры обработки программных прерываний




    Сходством обработки аппаратных и программных прерываний является механизм вызова процедуры обработки прерывания с момента, когда МП становится известен номер прерывания. Процедуры обработки аппаратных и программных прерываний различаются лишь тем, что в конце процедуры обработки аппаратного прерывания в контроллер прерывания необходимо послать сигнал конца прерывания EOI.

    Различием аппаратных и программных прерываний являются ситуации их возникновения – аппаратные прерывания генерируются устройствами, а программные прерывания вызываются самой программой.

    С точки зрения функций, выполняемых обработчиками аппаратных и программных прерываний, обработчики аппаратных прерываний отличаются тем, что помимо контроллера прерываний они работают непосредственно с той аппаратурой, которая вызвала возникновение сигнала прерывания. Обработчики программных прерываний, как правило, с аппаратурой напрямую не работают, а выполняют какую-либо обработку информации.

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

 

Написание процедуры обработки программных прерываний

    Любая процедура обработки прерываний должна заканчиваться командой возврата из процедуры обработки прерывания IRET. Поскольку при возникновении прерывания выполнение текущей программы прерывается, при входе в процедуру обработки прерывания все регистры, кроме CS, IP и регистра флагов содержат те значения, которые были в них до возникновения прерывания. Чтобы прерванная программа могла работать корректно после завершения процедуры обработки прерывания, необходимо в начале процедуры обработки прерывания сохранить все используемые в ней регистры, а в конце, перед командой IRET, восстановить их значения. Значения регистров обычно сохраняются в стеке. Поскольку процедура обработки прерываний работает с тем стеком, который был у прерванной программы и его размер неизвестен, процедура обработки прерываний не должна записывать в стек большой объем данных и должна восстановить его первоначальное состояние к своему завершению. Сохранять значение регистров SS и SP в этом случае не требуется. Другой немаловажной проблемой является доступ программы к своим данным. Так как регистры DS и ES содержат значения сегментов, относящихся к прерванной программе, для доступа к данным можно либо использовать префикс замены сегмента “CS: ” (если данные расположены в том же сегменте, где и команды), либо настроить регистр DS или ES на необходимый сегмент данных.

    Еще одним аспектом написания процедуры обработки прерывания является переключение стека. Это значит, что процедура обработки прерывания будет использовать свой собственный стек. Для этого сначала необходимо сохранить старые значения регистров SS и SP. Но в стеке их сохранить нельзя, так как ставится задача использовать собственный стек, который еще не инициализирован. Значения регистров SS и SP сохраняются в ячейках памяти. Причем эти ячейки памяти должны находиться в сегменте команд, так как перед настройкой регистра DS на сегмент данных, его значение сначала нужно сохранить в стеке, который еще не инициализирован. Для обращения к ячейкам памяти, находящимся в сегменте команд, в этом случае требуется использовать префикс замены сегмента “CS: ”. После сохранения значений регистров SS и SP они инициализируются новыми значениями – регистр SS настраивается на сегмент стека, а в регистр SP заносится размер стека в байтах.

    Написание процедуры обработки аппаратных прерываний отличается от написания процедуры обработки программных прерываний лишь тем, что в конце процедуры контроллеру прерываний необходимо послать сигнал EOI, что демонстрируется в следующем примере.

MyProc PROC        ; процедура обработки прерывания

. . .

MOV AL, 20H; посылка сигнала EOI в

OUT 20H, AL; контроллер прерываний

. . .             ; восстановление AX

IRET             ; возврат из процедуры

MyProc ENDP

Необходимо отметить, что после посылки сигнала EOI значение регистра AX необходимо восстановить.

    Для установки вектора прерывания сначала необходимо вычислить смещение от начала таблицы векторов прерываний для заданного номера прерывания по формуле смещение = номер_прерывания * 4. После этого необходимо записать в таблицу векторов прерываний по этому смещению сегмент и смещение процедуры обработки прерываний. Следующий пример демонстрирует выполнение этих действий.

SHL BX, 1        ; вычисление смещения

SHL BX, 1

XOR AX, AX

MOV ES, AX         ; настройка ES на начало таблицы

CLI                          ; запрет маскируемых прерываний

MOV WORD PTR ES: [BX], OFFSET MyProc    ; запись смещения

MOV ES: [BX + 2], CS              ; запись сегмента

STI                          ; разрешение маскируемых прерываний

. . .

MyProc PROC        ; процедура обработки прерывания

. . .

IRET

MyProc ENDP

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

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

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

    Функции MS-DOS – это различные сервисные возможности, которые операционная система MS-DOS предоставляет пользовательским программам через прерывание DOS 21H и некоторые другие прерывания. Функции MS-DOS облегчают выполнение таких стандартных операций, как ввод с клавиатуры, вывод на экран, работа с файлами, операции с памятью и т. д. Каждая функция MS-DOS имеет свой номер и набор параметров. Для выполнения функции необходимо ее номер занести в регистр AH, в другие регистры занести необходимые параметры и вызвать прерывание DOS командой INT 21H. Некоторые функции возвращают результаты своего выполнения в различных регистрах или ячейках памяти. Некоторые функции имеют возможность возвращать состояние своего выполнения, т. е. выполнилась ли функция успешно или в процессе ее выполнения возникла какая-либо ошибка.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...