8.8 Написание процедуры обработки аппаратных прерываний
8. 8 Написание процедуры обработки аппаратных прерываний Написание процедуры обработки аппаратных прерываний отличается от написания процедуры обработки программных прерываний лишь тем, что в конце процедуры контроллеру прерываний необходимо послать сигнал EOI, что демонстрируется в следующем примере. MyProc PROC ; процедура обработки прерывания . . . MOV AL, 20H; посылка сигнала EOI в OUT 20H, AL ; контроллер прерываний . . . ; восстановление AX IRET ; возврат из процедуры MyProc ENDP
Необходимо отметить, что после посылки сигнала EOI значение регистра AX необходимо восстановить.
8. 9 Установка вектора прерывания Для установки вектора прерывания сначала необходимо вычислить смещение от начала таблицы векторов прерываний для заданного номера прерывания по формуле смещение = номер_прерывания * 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.
8. 10 Функции MS-DOS 25H и 35H Функции MS-DOS – это различные сервисные возможности, которые операционная система MS-DOS предоставляет пользовательским программам через прерывание DOS 21H и некоторые другие прерывания. Функции MS-DOS облегчают выполнение таких стандартных операций, как ввод с клавиатуры, вывод на экран, работа с файлами, операции с памятью и т. д. Каждая функция MS-DOS имеет свой номер и набор параметров. Для выполнения функции необходимо ее номер занести в регистр AH, в другие регистры занести необходимые параметры и вызвать прерывание DOS командой INT 21H. Некоторые функции возвращают результаты своего выполнения в различных регистрах или ячейках памяти. Некоторые функции имеют возможность возвращать состояние своего выполнения, т. е. выполнилась ли функция успешно или в процессе ее выполнения возникла какая-либо ошибка. Функция DOS 25H Назначение: установка значения вектора прерывания. Номер вектора прерывания заносится в регистр AL. Регистровая пара DS: DX определяет адрес (сегмент: смещение) процедуры обработки прерывания. При использовании функции 25H нет необходимости запрещать маскируемые прерывания командой CLI и разрешать их затем командой STI – это сделает DOS.
Пример использования функции 25H: Timer PROC; процедура обработки прерывания таймера . . . IRET Timer ENDP . . . MOV AH, 25H MOV AL, 1CH ; прерывание таймера MOV BX, SEG Timer MOV DS, BX ; настройка DS: DX MOV DX, OFFSET Timer; на процедуру Timer INT 21H Функция DOS 35H Назначение: получение значения вектора прерывания. Номер вектора прерывания заносится в регистр AL. После вызова функции регистровая пара ES: BX содержит адрес (сегмент: смещение) процедуры обработки прерывания. Пример использования функции 35H:
OLD_Timer DD? ; ячейка для хранения адреса старого ; обработчика прерывания таймера . . . MOV AH, 35H MOV AL, 1CH ; прерывание таймера INT 21H MOV WORD PTR OLD_Timer, BX MOV WORD PTR OLD_Timer + 2, ES
Контрольные вопросы 1. Объясните работу механизма вызова и обработки программных прерываний для МП 8086? 2. Объясните работу механизма вызова и обработки аппаратных прерываний для МП 8086? 3. Какова структура стека сразу после входа в процедуру обработки программного прерывания? 4. Какими способами можно установить значение вектора прерывания? 5. Какие действия выполняет команда INT? 6. Поясните использование функций DOS 25H и 35H. Задания 1. Написать программу, выполняющую подпрограмму через вызов пользовательского прерывания (например, INT 60h). Адрес подпрограммы должен быть занесен в таблицу векторов прерываний при помощи функций DOS 25h и 35h. Подпрограмма должна выполнять действия, указанные в конкретном задании, при этом подпрограмме должны передаваться параметры N и j. Подпрограмма также должна возвращать результаты работы в регистрах общего назначения. После вызова подпрограммы программа должна восстановить адрес старого обработчика прерывания при помощи тех же функций DOS. Параметры N и j могут передаваться в подпрограмму обработки прерывания через регистры общего назначения или через ячейки памяти. Значения параметров N и j не должны быть тривиальными (например, 1 или 0). а) Вычислить значение произведения: б) Вычислить значение суммы: в) Вычислить значение произведения: г) Вычислить значение суммы: д) Вычислить значение произведения: е) Вычислить значение суммы:
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|