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

АбрамоваИванов0392_Лаб2

.pdf
Скачиваний:
4
Добавлен:
08.09.2024
Размер:
409.34 Кб
Скачать

IRR = 0005h (прерывание от таймера и мыши, рис. 3.4)

Рис. 3.2. IRR = 0001h.

Рис. 3.3. IRR = 0003h.

Рис. 3.4. IRR = 0005h.

11

3.9.

Установим в программе, в команде помеченной меткой М, режим опроса состояния

контроллера:

...

010C MOV AL, С0

...

В результате выполнения (рис. 3.5) делаем вывод, что полученное прерывание имеет наивысший приоритет от таймера. ISR = 8016 = 100000002 Слово состояния: 000116 = 000000012 - отсутствие запроса с кодом 001.

Рис. 3.5. Опрос состояния контроллера.

3.11.

Рассчитаем адрес вектора прерывания системного таймера следуя формуле

АДРЕС = номер прерывания · 4 = 8 · 4 = 20h

По этому адресу видим, что CS = 12 CF, IP = 00 D2.

12

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

Рис. 3.7. Первые три команды.

3.12.

Рассчитаем адрес вектора системного прерывания INT 1C:

АДРЕС = 1C · 4 = 70h

По адресу получаем CS:F000, IP = BA A. Тогда первые три команды на рис. 3.8.

Рис. 3.8. Первые три команды.

3.13.

Далее используется программа

 

0100

PUSH

AX

;

сохранение АХ в стек

 

 

0101

ADD

CS:[30], 1 ;

инкремент ячейки CS:[30] на 1

 

0104

MOV

AL, 20

;

помещение в регистр AL управл. команды 20h

 

0107

OUT

[20], AL

; фиксация обработки прерывания отправкой команды 20h в

 

порт 20

 

 

 

0109

POP

AX

; извлечение из стека значения АХ

 

010A

IRET

 

; программный выход из прерывания

 

 

 

 

 

 

13

0120

NOP

;

задержка времени

0122

120

;

безусловный переход на команду NOP

 

 

 

 

3.14.

Для маскировки системного таймера можно использовать команду

CMD>> O21, B9

3.15.

Установим новый вектор прерывания таймера (рис. 3.9). С учетом того, что програм-

ма написана по адресу CS:31CD и ID = 0100, необходимо установить соответсвующее значения в DS:0020.

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

3.16.

Для сброса таймера прерывания используем

CMD>> O21, B8

3.17.

Выполняя программу по адресу 120 в пошаговом режиме, следим за измерением ячейки CS:0030 (рис. 3.10 и 2.11).

14

Рис. 3.10. Начальное состояние CS:0030.

Рис. 3.11. Состояние CS:0030 после нескольких итераций программы.

3.19.

Восстановим обработчик прерываний по аналогии с измерением, замаскировав пре-

рывания, вернув прежнее значение (рис. 3.12) и разрешив прерывания.

Рис. 3.12. Восстановление обработчика.

15

4. Выводы

В ходе работы изучены принципы программирования контроллера прерываний, при-

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

16

5. Зачетное задание

Как мы делали векторов прерывания 8 и 1С, покажем код обработчика прерывания

1. По формуле получаем

АДРЕС = номер прерывания · 4 = 1 · 4 = 4h

По адресу DS:0004 находим адрес обработчика прерывания (Рис. 5.1).

Рис. 5.1. Опрос состояния контроллера.

Тогда CS:21BE, IP = 4008. Перейдем по полученному адресу

CMD>> CS = 21BE

CMD>> a 4008

Первые три команды обработчика показаны на Рис. 5.2.

Рис. 5.2. Опрос состояния контроллера.

17