Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

 

136

mov

bx,[FileNumber]

mov

cx,5

 

 

mov

dx,offset TextPlace

int

21h

 

 

jc

error

 

 

; Вывод прочитаных байт на экран

mov

dx,offset TextPlace

mov

ah,9

 

 

int

21h

 

 

; Закрытие файла

mov

bx,[FileNumber]

mov

ah,03Eh

 

 

int

21h

 

 

ret

 

 

 

error:

 

 

 

mov

dx,offset TextError

mov

ah,9

 

 

int

21h

 

 

ret

 

 

 

FileName

db

"skl.txt",0

FileNumber

dw

?

 

TextLine

db

"ABCDEFGHIJ",0Dh,0Ah

TextPlace

db

10 DUP (?),'$'

TextError

db

"Ошибка!",0Dh,0Ah,'$'

end

start

 

 

6.5. Прерывания

Мы в предыдущих примерах часто использовали команду INT и говорили, что она вызывает обработчик прерывания. Настала пора узнать, что конкретно делает команда INT, и что такое прерывания и их обработчики.

Представьте себе такую ситуацию. Домработница убирает квартиру, и в это время раздается звонок телефона, одновременно стук в дверь и начинает "свистеть" закипевший чайник на кухне. Домработнице надо решить, что сделать в первую очередь: открыть дверь, выключить чайник или ответить на звонок. Она может, например, совсем не ответить на телефонный звонок, потому что вы ей приказали не отвечать на телефонные звонки.

Эта ситуация является прямой аналогией работы процессора. Во время выполнения программы процессор, так же как и домработницу, постоянно отвлекают различные события (от внешних устройств или программ), требующие его реакции. Временное прекращение обработки программы процессором для выполнения затребованных действий называют прерыванием. Прерывания делят на аппаратные и программные.

Аппаратные прерывания возникают в результате подачи сигнала от какого-либо устройства компьютера (клавиатура, системный таймер, жесткий диск и т. д.). Так как аппаратные прерывания возникают в случайные моменты времени, то их иногда называют еще асинхронными.

Программные прерывания вызываются искусственно с помощью команды INT или ее аналогов (int3, into). Эти прерывания являются синхронными.

http://www.sklyaroff.ru

137

6.5.1. Внутренние и внешние аппаратные прерывания

Аппаратные прерывания делятся на внутренние и внешние.

Внутренние аппаратные прерывания возникают внутри самого процессора, а для приема внешних у процессора есть два физических контакта NMI (NonMaskable Interrupt — немаскируемые прерывания) и INTR (INTerrupt Request — запрос прерывания) (рис. 6.2).

Рис. 6.2. Подсистема прерываний компьютера на базе процессора Intel

В зависимости от двух входов процессора внешние аппаратные прерывания делятся на маскируемые и немаскируемые.

Маскируемые прерывания — это те, которые можно запретить, т. е. программист в своей программе может указать процессору, что прерывания этого типа обслуживать не нужно. Маскируемые прерывания поступают на вход INTR процессора и связаны с нормальной работой устройств.

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

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

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

Перед тем как вызывать процедуру обработки прерывания процессор автоматически сохраняет в стеке регистры CS, IP и FLAGS\EFLAGS, чтобы прерванная программа после обработки прерывания смогла безболезненно продолжить свое выполнение. Регистры CS:IP содержат адрес команды, с которой необходимо начать выполнение после возврата из процедуры обработки прерывания, а FLAGS\EFLAGS — состояние флагов до момента передачи управления процедуре обработке прерывания. Если

http://www.sklyaroff.ru

138

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

Помните, ранее отмечалось, что если exe-программа не использует стек, то его необходимо все равно задать. Теперь должно быть понятно, что стек используется при прерываниях, которые происходят при выполнении программы.

Разумеется, на разное прерывание нужно реагировать по-разному, т. е. для каждого типа прерывания должна быть своя процедура обработки прерывания.

В реальном режиме процессора допускается всего 256 источников прерываний, они нумеруются от 0 до 255. Для каждого прерывания существует уже готовая процедура обработки, и все эти процедуры включены в состав MS-DOS. Адреса этих процедур размещены в так называемой таблице векторов прерываний, соответственно вектором прерывания называют адрес процедуры обработки прерывания. Таблица векторов прерываний размещается в первом килобайте оперативной памяти и занимает адреса от 00000h до 00400h. Каждый адрес в таблице занимает двойное слово (4 байта): 1-е слово — это номер сегмента памяти, в котором находится соответствующая процедура обработки прерывания, а 2-е слово — смещение внутри этого сегмента. Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию с номером 1 – 0000:0004 и т. д.

Таким образом, смещение по которому находится вектор с номером N в таблице векторов прерываний, определяется как 4*N, а полный размер таблицы векторов прерываний составляет 4*256=1024 байт (1 Кбайт).

Как используется вектора и таблица векторов прерываний? Когда возникает прерывание, процессор по номеру источника прерывания путем умножения на 4 определяет смещение в таблице векторов прерываний. Затем сохраняет в стеке регистры CS, IP и FLAGS\EFLAGS, о чем мы говорили выше, и помещает первое слово вектора в регистр ip, а второе слово в регистр CS, и передает управление по адресу CS:IP, — так передается управление на процедуру обработки прерывания. Процедура обработки прерывания во время своего выполнения также может быть прервана, например, поступлением запроса от более приоритетного прерывания.

Когда процедура обработки прерывания закончит свою работу, она должна возобновить работу прерванной программы. Для этого ей надо восстановить из стека сохраненные там ранее значения IP, CS и FLAGS\EFLAGS. Делается это с помощью команды IRET, которая не имеет операндов. Команда IRET так и называется "возврат из обработчика прерываний", она самостоятельно загружает из стека значения IP, CS и FLAGS. Поэтому командой IRET все процедуры обработки прерываний завершают свою работу.

После возвращения из обработчика прерывания прерванная программа продолжит свою работу так, как будто и не было никакого прерывания.

Маскируемые прерывания делятся по уровням приоритетов. При одновременном поступлении нескольких запросов на прерывание, всегда обрабатывается прерывание с максимальным приоритетом. Если во время обработки прерывания приходит еще один запрос на прерывание с меньшим приоритетом, то он становится в очередь, а если с большим, то текущее прерывание само прерывается и ожидает, пока не будет обработано прерывание с более высоким уровнем приоритета.

Уровни приоритетов обозначаются сокращенно IRQ0-IRQ15. Аббревиатура IRQ происходит от английских слов Interrupt Request — запрос на прерывание. Самый высокий приоритет у IRQ 0, а самый низкий у IRQ 15. Физически, IRQ представляют собой отдельно проложенные линии (проводники) на материнской плате и соответствующие этим линиям контакты в интерфейсах устройств. Линии IRQ предназначены только для передачи запросов прерывания.

В табл. 6.2 приведены все аппаратные прерывания, расположенные в порядке убывания приоритета.

Таблица 6.2. Аппаратные прерывания, расположенные в порядке убывания приоритета

Преры-

Номер

Адрес

Источник сигнала прерывания

вание

вектора

вектора

 

 

 

 

 

IRQ0

INT 8h

0000:0020h

прерывание системного таймера, вызывается 18,2

 

 

 

раза в секунду

 

 

 

 

 

http://www.sklyaroff.ru

 

 

139

 

 

 

 

Таблица 6.2. (окончание)

 

 

 

 

 

 

IRQ1

INT 9h

0000:0024h

прерывание от клавиатуры, вызывается при каждом

 

 

 

 

нажатии и отпускании клавиши

 

 

 

 

 

 

IRQ2

INT 0Ah

0000:0028h

к этому выходу подключается ведомый контроллер

 

 

 

 

(прерывания IRQ8-IRQ15)

 

 

 

 

 

 

IRQ8

INT 70h

0000:01C0h

прерывание от часов реального времени

 

 

 

 

 

 

IRQ9

INT 0Ah

0000:01C4h

прерывание обратного хода луча, вызывается

 

 

или

 

некоторыми адаптерами при обратном ходе луча

 

 

INT 71h

 

 

 

 

 

 

 

 

 

IRQ10

INT 72h

0000:01C8h

используется дополнительными устройствами

 

 

 

 

 

 

IRQ11

INT 73h

0000:01CCh

используется дополнительными устройствами

 

 

 

 

 

 

IRQ12

INT 74h

0000:01D0h

прерывание от мыши PS/2-типа

 

 

 

 

 

 

IRQ13

INT 02h

0000:01D4h

прерывание от математического сопроцессора. По

 

 

или

 

умолчанию это прерывание отключено как на FPU,

 

 

 

так и на контроллере прерываний

 

 

 

 

 

 

INT 75h

 

 

 

 

 

 

 

 

 

IRQ14

INT 76h

0000:01D8h

прерывание от первого IDE-контроллера "операция

 

 

 

 

завершена"

 

 

 

 

 

 

IRQ15

INT 77h

0000:01DCh

прерывание от второго IDE-контроллера "операция

 

 

 

 

завершена"

 

 

 

 

 

 

IRQ3

INT 0Bh

0000:002Ch

прерывание от последовательного порта COM2,

 

 

 

 

вызывается, если порт COM2 получил данные

 

 

 

 

 

 

IRQ4

INT 0Ch

0000:0030h

прерывание от последовательного порта COM1,

 

 

 

 

вызывается, если порт COM1 получил данные

 

 

 

 

 

 

IRQ5

INT 0Dh

0000:0034h

прерывание от параллельного порта LPT2

 

 

 

 

 

 

IRQ6

INT 0Eh

0000:0038h

прерывание от дисковода "операция завершена"

 

 

 

 

 

 

IRQ7

INT 0Fh

0000:003Ch

прерывание от параллельного порта LPT1

 

 

 

 

 

 

Вы можете посмотреть прерывания своего компьютера. Выберите "Пуск – Выполнить", наберите "msinfo32". В появившимся окне "Сведения о системе", слева, выберите вкладку "Ресурсы аппаратуры – Прерывания IRQ". В современных компьютерах количество IRQ может быть больше 15.

Программист может в своей программе запретить (замаскировать) обработку всех или любого сочетания маскируемых прерываний, кроме того, программист может заменить обработчик прерывания на свой. Далее рассказано, как выполнить все эти действия.

6.5.2. Запрет всех маскируемых прерываний

Для запрета всех маскируемых прерываний в процессоре имеется инструкция CLI. На самом деле эта инструкция просто сбрасывает флаг IF в 0.

В процессоре также имеется команд STI, которая устанавливает флаг IF в 1, тем самым, отменяя действие команды CLI.

6.5.3. Запрет определенного маскируемого прерывания

Как ведущий, так и ведомый контроллеры i8259 содержат специальный внутренний регистр маски прерываний IMR.

Для того чтобы запретить определенное прерывание, необходимо соответствующий бит в регистре IMR установить в 1. Номера разрядов регистра IMR соответствуют номерам линий сигналов прерывания, например IRQ0 и IRQ8 соответствует самый младший разряд в регистре IMR, а IRQ7 и IRQ15 — самый старший.