АбрамоваИванов0392_Лаб2
.pdf
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
