Assembler - язык неограниченных возможностей

         

Команды управления


OCW1:

биты 7 – 0: прерывание 7 – 0/15 – 8 запрещено

При помощи этой команды можно временно запретить или разрешить то или иное аппаратное прерывание. Например, команды

in al,21h or al,00000010b out 21h,al

приводят к отключению IRQ1, то есть клавиатуры.

Мы пользовались OCW1 в программе term2.asm, чтобы разрешить IRQ3 — прерывание от последовательного порта COM2.

OCW2: команды конца прерывания и сдвига приоритетов

биты 7 – 5: команда

000: запрещение сдвига приоритетов в режиме без EOI

001: неспецифичный EOI (конец прерывания в режиме с приоритетами)

010: нет операции

011: специфичный EOI (конец прерывания в режиме без приоритетов)

100: разрешение сдвига приоритетов в режиме без EOI

101: сдвиг приоритетов с неспецифичным EOI



110: сдвиг приоритетов

111: сдвиг приоритетов со специфичным EOI

биты 4 – 3: 00 (указывают, что это OCW2)

биты 2 – 0: номер IRQ для команд 011lb, 110 и 111

Как упоминалось в главе 5.8.2, если несколько прерываний происходят одновременно, обслуживается в первую очередь то, которое имеет высший приоритет. При инициализации контроллера высший приоритет имеет IRQ0 (прерывание от системного таймера), а низший — IRQ7. Все прерывания второго контроллера (IRQ8 – IRQ15) оказываются в этой последовательности между IRQ1 и IRQ3, так как именно IRQ2 используется для каскадирования этих двух контроллеров. Команды сдвига приоритетов позволяют изменить эту ситуацию, присвоив завершающемуся (команды 101 или 111) или обрабатывающемуся (110) прерыванию низший приоритет, причем следующее прерывание получит наивысший, и далее по кругу.

Более того, в тот момент, когда выполняется обработчик аппаратного прерывания, другие прерывания с низшими приоритетами не происходят, даже если обработчик выполнил команду sti. Чтобы разрешить выполнение других прерываний, каждый обработчик обязательно должен послать команду EOI — конец прерывания — в соответствующий контроллер. Именно поэтому обработчики аппаратных прерываний в программах term2.asm и wavdma.asm заканчивались командами

mov al,20h ; команда "неспецифичный конец прерывания" out 20h,al ; посылается в первый контроллер прерываний


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

OCW3: чтение состояния контроллера и режим специального маскирования

бит 7: 0

биты 6 – 5: режим специального маскирования

00 — не изменять

10 — выключить

11 — включить

биты 4 – 3: 01 — указывает, что это OCW3

бит 2: режим опроса

биты 1 – 0: чтение состояния контроллера

00 — не читать

10 — читать регистр запросов на прерывания

11 — читать регистр обслуживаемых прерываний

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

Чаще всего OCW3 используют для чтения состояния контроллера — младшие два бита выбирают, какой из регистров контроллера будет возвращаться при последующем чтении из порта 21h/A1h. Оба возвращаемых регистра имеют структуру, аналогичную OCW1, — каждый бит отвечает соответствующему IRQ.

Из регистра запросов на прерывания можно узнать, какие прерывания произошли, но пока не были обработаны, а из регистра обслуживаемых прерываний — какие прерывания обрабатываются в данный момент. Последнее — еще одна мера безопасности, которую применяют резидентные программы, — нельзя работать с дисководом (IRQ6), если в этот момент обслуживается прерывание от последовательного порта (IRQ3), и нельзя работать с диском (IRQ14/15), если обслуживается прерывание от системного таймера (IRQ0).


Содержание раздела