Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Запрет/разрешение отдельных аппаратных прерываний. ⇐ ПредыдущаяСтр 3 из 3
Программы на асемблере могут запретить аппаратные прерывания. Это маскируемые прерывания; другие аппаратные прерывания, возникающие при некоторых ошибках (таких как деление на ноль) не могут быть маскированы. Имеются две причины для запрета аппаратных прерываний.
Выполнение прерываний зависит от значения флага прерывания (бит 9) в регистре флагов. Когда этот бит равен 0, то разрешены все прерывания, которые разрешает маска. Когда он равен 1, то все аппаратные прерывания запрещены. Чтобы запретить прерывания, установив этот флаг в 1, используется инструкция CLI. Для очистки этого флага и восстановления прерываний - инструкция STI. Избегайте отключения прерываний на длительный период. Прерывание времени суток происходит 18.2 раза в секунду и если к этому прерыванию был более чем один запрос в то время, когда аппаратные прерывания были запрещены, то лишние запросы будут отброшены исистемное время будет определяться неправильно. Машина автоматически запрещает аппаратные прерывания при вызове программных прерываний и автоматически разрешает их при возврате. Когда Вы пишете свои программные прерывания, то Вы можете начать программу с инструкции STI, если Вы можете допустить аппаратные прерывания. Однако если за инструкцией CLI не следует STI, то это приведет к остановке машины, так как ввод с клавиатуры будет заморожен. Для маскирования определенных аппаратных прерываний нужно просто послать требуемую цепочку битов в порт с адресом 21H, который соответствует регистру маски прерываний (IMR). Регистр маски на второй микросхеме 8259 для AT (IRQ8-15) имеет адрес порта A1H. Необходимо установите те биты регистра, которые соответствуют номерам прерываний, которые Вы хотите маскировать. Нижеприведенный пример блокирует дисковое прерывание. Не забудьте очистить регистр в конце программы, иначе обращение к дискам будет запрещено и после завершения программы. ; ---маскирование 6-го бита регистра маски прерываний MOV AL, 01000000B; маскируем бит 6 OUT 21H, AL; посылаем в регистр маски прерываний . . MOV AL, 0; OUT 21H, AL; очищаем IMR в конце программы В конце кода каждого из Ваших аппаратных прерываний Вы должны включить следующие 2 строчки кода: MOV AL, 20H OUT 20H, AL Если аппаратное прерывание не заканчивается этими строками, то микросхема 8259 не очистит информацию регистра обслуживания, с тем чтобы была разрешена обработка прерываний с более низкими уровнями, чем только что обработанное. Отсутствие этих строк легко может привести к краху программы, так как прерывания от клавиатуры скорее всего окажутся замороженными и даже Ctrl-Alt-Del окажется бесполезным. Эта добавка не нужна для тех векторов прерываний, которые являются расширениями существующих прерываний.
|