Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
45
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 3

Действия, которые должны инициироваться нажатием левой или пра­вой.клавиш мыши (например, включение или выключение некоторого оборудования), в программе заменены выводом на экран коротких диаг­ностических сообщений. Вывод осуществляется прямой записью в видео­буфер, поскольку, как уже говорилось ранее, в обработчике аппаратных прерываний нельзя использовать функции DOS и рискованно — функ­ции BIOS. Вывод на экран с помощью команд обработки строк lodsb и stosw требует настройки большого количества регистров — в DS:SI дол­жен находиться адрес строки-источника, в ES:DI адрес позиции в видео­буфере, в СХ число выводимых символов. Кроме этого, в обработчике прерываний используются регистры АХ, ВХ и DX. Для сохранения всех регистров общего назначения используется команда pusha, а для их вос­становления команда рора. Однако эти команды не принимают в расчет сегментные регистры, и их приходится сохранять и восстанавливать от­дельными командами.

С восстановлением регистров может возникнуть некоторая сложность. Обработчик прерывания должен завершаться посылкой в контроллер пре­рываний команды EOI, а для этого необходим регистр AL. Поэтому восста­новление регистров, во всяком случае, регистра АХ, необходимо выпол­нять после команды EOI. С другой стороны, команда EOI разблокирует нижележащие уровни прерываний в контроллере прерываний (см. гл. 3), что может привести к прохождению через контроллер очередного (вло­женного в наше) прерывания, которое прервет наш обработчик в точке, где еще не восстаношгсны регистры. Это неминуемо приведет к краху си­стемы. Однако в процессоре предусмотрены меры устранения этого не­приятного явления. Остановимся на них более подробно.

Процессор, приняв любой сигнал прерывания, сбрасывает флаг IF в своем регистре флагов, запрещая тем самым все аппаратные прерывания. Поэтому вход в обработчик прерываний всегда осуществляется при зап­рещенных прерываниях. Блокировка нижележащих уровней в контролле­ре прерываний просто накладывается на этот общий запрет и новых огра­ничений не вносит.

Если в тексте обработчике прерываний нет команды разрешения пре­рываний sti, то прерывания будут запрещены до самого его конца, до завершающей команды iret. Эта команда извлекает из стека и восстанав­ливает исходное содержимое регистров CS:IP, а также регистра флагов. В момент прерывания в регистре флагов был безусловно установлен флаг IF, иначе прерывание не могло бы возникнуть. Восстановление регистра флагов приводит к установке этого флага и разрешению всех аппаратных прерываний, но уже после завершения обработчика прерываний. Таким образом, снятие аппаратной блокировки прерываний командой EOI в действительности не приводит к разрешению прерываний, и любые стро­ки, стоящие после этой команды, выполняются при запрещенных пре­рываниях. В результате никаких проблем с восстановлением регистров после команды EOI не возникает.

Команды и алгоритмы

159

Обычно, однако, используется другой вариант построения обработ­чика прерываний. В этом варианте в начале программы обработчика вы­полняется команда sti, устанавливающая флаг IF и разрешающая все ап­паратные прерывания, кроме тех, которые заблокированы в контроллере прерываний. В результате программа обработчика может быть прервана любым прерыванием более высокого уровня IRQ (т.е. уровня с меньшим номером), но не прерывается сигналами прерываний этого же и более низких уровней. Такое построение обработчиков прерываний удобно тем, что «более важные» прерывания, например, от таймера или клавиатуры, могут быть обработаны без задержки. Для того, чтобы исключить возмож­ные неприятности с восстановлением регистра АХ после команды EOI, перед ней прерывания запрещаются командой cli и структура обработчи-;ка прерываний приобретает приблизительно такой вид:

sti

pusha ;Сохранение регистров

;Тело обработчика

cli Запрещение всех прерываний

mov AL,20h ;Команда EOI

out 20h,AL ;контроллсру прерываний

рора ;Восстановление регистров

irct ;Возврат из обработчика

Команды рора и irct выполняются в этому случае при запрещенных [Прерываниях, но после отработки команды iret в регистре флагов восста->;навливастся его исходное содержимое (в котором IF = 1), и прерывания, Iтаким образом, снова разрешаются.