
- •Цель работы:
- •Общие сведения:
- •Порядок выполнения работы:
- •Загрузить отладчик afd;
- •Прочитать содержимое регистров маски: 21h - главный контроллер, a1h - подчиненный контроллер.
- •Установить маску на системный таймер, не изменяя маски остальных источников прерываний. Код новой маски записать в отчет. Выйти из afd и убедится, что системные часы остановлены.
- •Вернуться в afd.
- •Набрать, начиная с адреса 100, текст программы:
- •Изучить возможности аfd для установки контрольных точек программы (нажать клавиши f4, f5 ). Установить контрольную точку останова на метке l2.
- •Многократно запуская программу по команде g100, фиксировать в отчете значения регистров irr и isr главного контроллера.
- •Установить в программе, в команде помеченной меткой м, режим опроса состояния контроллера.
- •Запустить программу по команде g100, зафиксировать в отчете значения слова состояния и регистра isr. При зависании машины выполнить перезагрузку и вернуться в afd. Объяснить причину зависания.
- •Рассчитать адрес вектора прерывания системного таймера следуя формуле :
- •Начиная с адреса 100 набрать текст пр-мы обработки прерываний таймера:
Рассчитать адрес вектора прерывания системного таймера следуя формуле :
АДРЕС = номер прерывания ( см. рис. 1 ) * 4.
Записать в отчет адрес вектора и его содержимое.
Адрес = 8*4 = 20h
Содержимое вектора прерываний:
75 18 69 07
Запомнить текущее содержимое регистра CS, записать в CS значение из вектора. В окне дизассемблера найти точку входа в обработчик прерываний таймера и записать в отчет три первых команды обработчика прерываний системного таймера. Восстановить прежнее содержимое регистра CS.
CS = 0769
Команда a1875
Первые три команды обработчика прерываний системного таймера.
PUSHF
CLI
CALL Far CS:[23C0]
Рассчитать адрес вектора системного прерывания INT 1C. Записать в отчет адрес вектора и его содержимое. Запомнить текущее содержимое регистра CS; Записать в CS значения из вектора. В окне дизассемблера найти точку входа в обработчик прерываний INT 1C и записать в отчет три первых команды обработчика. Восстановить прежнее значение регистра CS.
Адрес = 1C *4 = 70h
Содержимое вектора прерываний:
53 FF 00 F0
CS = F000
Команда aFF53
Первые три команды обработчика прерываний системного таймера.
IRET
JMP ED04
JMP DI
1C - Программное прерывание, вызывается 18,2 раза в секунду обработчиком аппаратного прерывания таймера
INT9 (IRQ1) - прерывание от клавиатуры. Генерируется, когда пользователь нажимает и отжимает клавиши. Используется для чтения данных из клавиатуры.
Адрес = 9*4 = 24h
Содержимое вектора прерываний:
6F 4B EE 13
CS=13EE
Смещение обработчика клавиатуры: 4B6Fh
Начиная с адреса 100 набрать текст пр-мы обработки прерываний таймера:
PUSH AX; Помещение в стек содержимого AX
ADD CS:[30] , 1 ; Увеличение на 1 содержимого CS:[30]
MOV AL , 20; Помещение в регистр AL управляющей команды 20h
OUT [20] , AL;
;Отправка в порт 20 управляющей команды 20h для фиксации обработки прерывания. В противном случае обработчик программных прерываний таймера будет вызываться постоянно, что приведет к зависанию программы (В ISR остается 1)
20h = 00100000
EOI = 1, сброс бита ISR с максимальным приоритетом
POP AX; Извлечение AX из стека
IRET
Начиная с адреса 120 набрать текст :
NOP
JMP 120
В отчете привести функциональный комментарий к каждой из команд.
Замаскировать прерывание системного таймера.
Вводим o21,B8
Переходим на es0070 и записываем начало адреса главного кода (0001 (т.е. 0100)) и адрес cs2405 (0524).
Заменить вектор прерываний таймера на новый. Показать преподавателю.
Сбросить маску прерываний таймера.
В пошаговом режиме выполнять программу, начиная с адреса 120, контролировать содержимое ячейки CS: 0030.
При пошаговом выполнении программы наблюдается увеличение ячейки CS:0030.
Восстановить прежний обработчик прерываний таймера.
Разрешить прерывания таймеру.