Assembler для начинающих


Прерывания



Прерывания


    Механизм прерываний - существенная часть любой вычислительной сис-
    темы.  Как мы увидим, он важен и для IBM PC.  Структура прерываний
    предоставляет эффективное средство для связи устройств вводоа-выво-
    да с процессором.  Нам прерывания интересны потому, что управление
    прерываниями - прерогатива программирования на языке ассемблера.  В
    языках высокого уровня отсутствуют средства для работы с
    прерываниями на машинном уровне.
 
      Прерывания обычно вызываются внешними устройствами.  Прерывание
    сигнализирует процесору о необходимости прервать текущие действия и
    ответить внешнему устройству.  В IBM PC клавиатура посылает сигнал
    прерывания всякий раз при нажатии любой клавиши.  Прерывание


    клавиатуры заставляет процессор прекратить текущую деятельность и
    считать набранный на клавиатуре символ.
 
      Легко понять, за что прерывания получили свое название.  Преры-
    вание сигнализирует о необходимости "прервать" текущее действие
    процессора.  Прерывания хороши тем, что избавляют процессор
    постоянного контроля за внешними устройствами.  Если бы, например,
    клавиатура пользователя не вызывала прерываний, то процессор был бы
    вынужден непрерывно проверять клавиатуру, чтобы обнаружить нажатие
    клавиши.  Каждая написанная для компьютера программа была бы
    вынуждена делать одно и то же, и им пришлось бы очень часто
    тестировать клавиатуру.  Но наличие прерываний снимают это
    требование, и программа может выполняться без постоянного
    тестирования клавиатуры.  Каждый раз, как клавиатура получает
    какую-либо информацию, она сигнализирует об этом процессору.  После
    того, как микропроцессор удовлетворит запрос клавиатуры, он может
    возобновить нормальный ход выполнения программы.
 
      Работа 8088 с прерываниями во многом напоминает его обращение с
    процедурами.  Прерывание не может прекратить работу процессора во
    время выполнения команды.  Сначала 8088 закончит выполнение текущей
    команды, но следующую уже проигнорирует.  Вместо ее выполнения про-
    цессор действует так, как будто следующая команда была вызовом про-
    цедуры.  Он сохраняет адрес очередной команды в стеке и переходит в
    специальную процедуру, которую называют программой обработки
    прерываний.  Эта процедура содержит команды для работы с вызвавшим
    прерывание устройством.  В случае с клавиатурой программа обработки
    прерывания считывает символ и сохраняет его для дальнейшего
    использования.  После того как она закончит работу с устройством,
    происходит возврат в точку прерывания.  Процессор извлекает из
    стека адрес возврата и продолжает выполнение программы как будто
    ничего не случилось.
 
      Поскольку прерывание вызывается внешним устройством, оно может
    произойти в любой момент выполнения программы.  Программа не может
    предпринять каких-либо действий чтобы подготовиться к прерыванию,
    так как не может предвидеть, когда пользователь нажмет на клавишу
    клавиатуры.  Отсюда следует, что прерывание не должно изменять
    данные в прерываемой программе.  Если прерывание иозменит
    какое-либо значение в программе, то она не сможет нормально
    работать когда к ней вернется управление.
 
      В ходе прерывания 8088 автоматически сохраняет некоторые уста-
    новленные программой значения в стек.  В свою очередь, программа
    обработки прерываний отвечает за сохранение любых других данных,
    которые она может изменить во время своего выполнения.  Эти данные
    обычно сохраняются в стеке.  Затем, перед возвращением управления в
    прерванную программу, программа обработки прерывания должна вернуть
    измененным данным те значения, которые они имели в момент
    прерывания.  Факт возникновения прерывания должен остаться
    "невидимым" для выполняемой программы.
 
      Поскольку сигнал прерывания могут посылать процессору многие
    устройстваэ, 8088 имеет механизм ориентации прерываний.  Это озна-
    чет, что 8088 определяет, какое устройство вызвало прерывание и пе-
    редает управление программе обработки прерывания, соответствующей
    этому устройству.  Процессор атоматически управляет веторизацией
    зап росов на прерывания.  Программе обработки прерывания не
    требуется перед обработкой прерывания определять, какое устройство
    его вызвало.  Это сокращает время реакции на прерывание и упрощает
    программирование прерываний.
 
      В программамах встречаются такие участки, выполнение которых не
    может быть прервано.  Например, это может быть кусок программы,
    который должен выполняться очень быстро, чтобы закончить выполнение
    специфической задачи, или момент работы с данными, которые могут
    быть изменены программой обработки прерывания.  В обоих случаях
    программа должна иметь возможность задержать или предотвратить
    прерывания, т.е.  программа должна уметь не допускать возникновения
    прерываний во время выполнения таких критических участков.    После
    прохождения этих участков программа должна восстановить способность
    системы прерываний вызывать прерывания.  Программа не может
    отключать прерывания на слишком долгое время, иначе с устройством,
    запросившим прерывание, может произойти какая-нибудь неприятность.
    Если прерывание клавиатуры не считает символ до того как оператор
    нажмет другую клавишу, второй симол может быть потерян.  В 8088
    имеется возможность блокировать все внешние прерывания.  IBM PC
    имеет более развитую возможность выбирать, каким из устройств можно
    вызывать прерывание, а каким нет.  Программа может использовать эту
    возможность для выбора наиболее важных устройств, которым можно
    разрешить прерывания, а менее критическим запретить.  Способы
    отключения прерываний мы обсудим в следующих главах.




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