1.2.2 Запрет/разрешение отдельных аппаратных прерываний.

  Программы на аасемблере могут запретить аппаратные прерывания,
перечисленные в [1.2.1]. Это маскируемые прерывания; другие аппа-
ратные прерывания, возникающие  при  некоторых ошибках (таких как
деление  на ноль) не могут быть маскированы.  Имеются две причины
для запрета аппаратных прерываний. В первом случае все прерывания
блокируются  с  тем чтобы критическая часть кода  была  выполнена
целиком, прежде чем машина произведет какое-либо другое действие.
Например, прерывания запрещают при изменении вектора  аппаратного
прерывания, избегая  выполнения  прерывания  когда вектор изменен
только наполовину.
   Во  втором  случае маскируются только определенные  аппаратные
прерывания.  Это делается когда некоторые определенные прерывания
могут  взаимодействовать  с  операциями,  критичными к  временам.
Например, точно рассчитанная по времени процедура ввода/вывода не
может себе позволить быть прерванной длительным дисковым прерыва-
нием.

   Низкий уровень.

   Выполнение прерываний  зависит  от  значения  флага прерывания
(бит 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 в конце программы


 

Вы находитесь в разделе: 
Также вам будет интересно:

Добавить коментарий