Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
3
Добавлен:
10.06.2023
Размер:
1.15 Mб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра АПУ

отчет

по лабораторной работе №2

по дисциплине «Системное программирование»

Тема: Система прерываний ПЭВМ IBM PC/AT

Студент гр.8391

Гоглев А.А.

Студент гр.8391

Шушков Д.А.

Студент гр.8391

Маликов А.А.

Преподаватель

Кораблев Ю.А.

Санкт-Петербург

2021

Цель работы:

  1. Изучение принципов программирования контроллера прерываний.

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

Выполнение работы:

  1. Загрузить отладчик AFD;

  2. С помощью HELP <F4> изучить команды отладчика «i», «o»;

На рисунке 1 приведен скрин описания команд отладчика «i», «o».

Рисунок 1. Описание команд отладчика «i» и «o»

  1. Прочитать содержимое регистров маски: 21h - главный контроллер, A1h - подчиненный контроллер. Расшифровать содержимое регистров, результаты записать в отчет.

На рисунке 2 приведен скрин содержимого маски главного контроллера.

Рисунок 2. Отображение содержимого главного контроллера

Расшифровка содержимого:

В816 = 101110002 - маска 0 – прерывание разрешено;

1 – прерывание запрещено;

Прерывания по адресам Bh, Ch, Dh, Fh запрещено, а по адресам Eh, 8h, 9h и 2h разрешено.

Уровень 0 (INT 8) = 0 //прерывание разрешено от системных часов;

Уровень 1 (INT 9) = 0 //прерывание разрешено от клавиатуры;

Уровень 2 (INT 2) = 0 //прерывание разрешено от подчиненного контроллера;

Уровень 3 (INT B) = 1 //прерывание запрещено от последовательного интерфейса СОМ1;

Уровень 4 (INT C) = 1 //прерывание запрещено от последовательного интерфейса СОМ2;

Уровень 5 (INT D) = 1 //прерывание запрещено от параллельного интерфейса LPT2;

Уровень 6 (INT E) = 0 //прерывание разрешено от дискретных интерфейсов;

Уровень 7 (INT F) = 1 //прерывание запрещено от параллельного интерфейса LPT1.

На рисунке 3 приведен скрин содержимого маски подчиненного контроллера.

Рисунок 3. Отображение содержимого подчиненного контроллера

Расшифровка содержимого:

8F16 = 100011112 - маска

0 – прерывание разрешено;

1 – прерывание запрещено;

Прерывания по адресам 70h, 71h, 72h, 73h и 77h запрещено, а по адресам 74h, 75h и 76h разрешено.

Уровень 8 (INT 70) = 1 // прерывание запрещено CMOS;

Уровень 9 (INT 71) = 1 // прерывание запрещено;

Уровень 10 (INT 72) = 1 // прерывание запрещено;

Уровень 11 (INT 73) = 1 // прерывание запрещено;

Уровень 12 (INT 74) = 0 // прерывание разрешено;

Уровень 13 (INT 75) = 0 // прерывание разрешено от арифметического процессора 80287;

Уровень 14 (INT 76) = 0 // прерывание разрешено от контроллера жесткого диска;

Уровень 15 (INT 77) = 1 // прерывание запрещено.

  1. Установить маску на системный таймер, не изменяя маски остальных источников прерываний. Код новой маски записать в отчет. Выйти из AFD и убедится, что системные часы остановлены.

На рисунке 4 изображен скрин исходного состояния системы

Рисунок 4. Исходное состояние системы

Необходимо запретить прерывание на адресе, отвечающем за системные часы (INT 8). Получившееся маска – 101110012 = В916. Для остановки используем команду 0 21, В9.

На рисунке 5 изображен скрин после запрета прерывания системных часов.

Рисунок 5. Запрет прерывания системных часов.

На рисунке 6 изображен скрин возобновленных системных часов.

Рисунок 6. Возобновленные системные часы

  1. Вернуться в AFD.

  2. Набрать, начиная с адреса 100, текст программы:

Рисунок 7. Текст программы

  1. Изучить возможности АFD для установки контрольных точек программы (нажать клавиши F4, F5). Установить контрольную точку останова на метке L2.

На рисунке 8 приведен скрин установочного окна контрольных точек.

Рисунок 8. Окно для установки контрольных точек

  1. Многократно запуская программу по команде g100, фиксировать в отчете значения регистров IRR и ISR главного контроллера.

На рисунке 9 приведен скрин результата многократного запуска кода.

Рисунок 9. Результат многократного запуска кода.

ISR = 000016=000000002 - отсутствие обслуживаемых прерываний;

IRR = 000316=000000112 - запроса прерывания от системного таймера и клавиатуры.

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

  1. Запустить программу по команде g100, зафиксировать в отчете значения слова состояния и регистра ISR. При зависании машины выполнить перезагрузку и вернуться в AFD. Объяснить причину зависания. В отчете расшифровать содержимое регистров внутренних регистров IRR, ISR и слова состояния контроллера. Формат регистров IRR, ISR соответствует формату регистра маски.

На рисунке 10 приведен скрин результата запуска программы.

Рисунок 10.Результат запуска программы.

ISR = 008016=100000002 - замаскированное прерыванию от параллельного интерфейса;

Слово состояния: 000116=000000012 - отсутствию запроса с кодом 001.

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

АДРЕС = номер прерывания (см. рис. 1) * 4.

Записать в отчет адрес вектора и его содержимое. Запомнить текущее содержимое регистра CS, записать в CS значение из вектора. В окне дизассемблера найти точку входа в обработчик прерываний таймера и записать в отчет три первых команды обработчика прерываний системного таймера. Восстановить прежнее содержимое регистра CS.

АДРЕС = 8*4 = 20h

На рисунке 11 приведен скрин содержимого вектора 20h.

Рисунок 11. Данные в векторе 20h

CS = 12 CF IP = 00 D2

На рисунке 12 приведен скрин 3-х команд обработчика прерывания системного таймера.

Рисунок 12. Три первые команды обработчика прерывания системного таймера

  1. Рассчитать адрес вектора системного прерывания INT 1C. Записать в отчет адрес вектора и его содержимое. Запомнить текущее содержимое регистра CS; записать в CS значения из вектора. В окне дизассемблера найти точку входа в обработчик прерываний INT 1C и записать в отчет три первых команды обработчика. Восстановить прежнее значение регистра CS.

АДРЕС = 1С*4 = 70h

На рисунке 13 приведен данных из адреса 70h.

Рисунок 13.Данные из адреса 70h

CS: F000 IP = BA AA

  1. Начиная с адреса 100 набрать текст программы обработки прерываний таймера:

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

ADD CS:[30], 1 // увеличение содержимого ячейки CS:[30] на 1

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

OUT [20], AL // отправка управляющей команды 20h в порт 20 для фиксации обработки прерывания.

POP AX // извлечение из стека значения АХ

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

Начиная с адреса 120 набрать текст:

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

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

  1. Замаскировать прерывание системного таймера.

Для прерывания системного таймера была использована команда O21, B9

  1. Заменить вектор прерываний таймера на новый.

На рисунке 14 приведен скрин установки нового вектора прерывания таймера.

Рисунок 14. Установка нового вектора прерывания таймера

Исходное значение DS:0020 заменили на значение 0001.

  1. Сбросить маску прерываний таймера.

Была использована команда O21, B8

Рисунок 15. Запуск команды «O 21, B8».

  1. В пошаговом режиме выполнять программу начиная с адреса 120, контролировать содержимое ячейки CS: 0030.

На рисунках 16 и 17 приведен скрин содержимого ячейки CS:0030 после многократных запусков программы.

Рисунок 16. Значение cs:0030 после нескольких запусков команды.

Рисунок 17. Значение cs:0030 после еще нескольких запусков команды

  1. Замаскировать прерывания системного таймера.

Была использована команда O21, B9

  1. Восстановить прежний обработчик прерываний таймера.

На рисунке 18 приведен скриншот восстановленного обработчика прерываний таймера.

Рисунок 18. Восстановленный обработчик прерываний таймера

  1. Разрешить прерывания таймеру.

Была использована команда O21, B8.

Вывод.

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

Выполнение задания защиты лабораторной работы

Задание: показать в окне отладчика код обработчика прерывания 10.

Рассчитаем смещение адреса в таблице прерываний.

10 * 4 = 40

Рисунок 19. Таблица векторов прерываний

Исходя из этой таблицы найдем адрес и смещение.

Адрес: 12CF

Смещение: 01D1

Рисунок 20. Код обработчика прерывания.

Соседние файлы в папке УТС 7 семестр