- •2.4. Машинный язык и язык Ассемблера
- •2.5. Синаксис языка Ассемблера
- •2.6. Принципы работы Ассемблера
- •2.7. Биты, байты и слова
- •2.8. Нумерация бит
- •2.9. Набор символов
- •2.10. Принципы работы компьютера
- •2.11. Процедуры
- •2.12. Стек
- •2.13. Прерывания
- •3.1. Модель программирования 8088
- •3.2. Регистры общего назначения
- •3.3. Регистры адресации
- •3.4. Прямая адресация
- •3.5. Вычисление адресов
- •3.6. Адресация через базу и смещение
- •3.8. Байт mod r-m
- •3.9 Физическая адресация
- •3.10. Сегментные регистры
- •3.11. Предназначение сегментов
- •3.12. Оператор Segment
- •3.13. Оператор Assume
- •3.14. Управляющие рагистры
- •3.14.1. Указатель инструкций (ip)
- •3.14.2. Указатель стека
- •3.14.3. Регистр флагов
- •3.14.4. Флаг знака
- •3.14.5. Флаг нуля
- •3.14.6. Флаг четности
- •3.14.7. Флаг переноса
- •3.14.8. Дополнительный флаг переноса
- •3.14.9. Флаг переполнения
- •3.14.10. Флаг захвата
- •3.15. Векторы прерываний
- •Глава 4 - Набор команд микропроцессора 8088
- •4.1. Пересылка данных
- •4.1.1. Команда пересылки
- •4.1.2. Команда замены
- •4.1.3. Команды ввода и вывода
- •4.1.4. Загрузка исполнительного адреса
- •4.1.5. Загрузка указателя
- •4.1.6. Пересылка флагов
- •4.1.7. Перекодировка
- •4.2. Операции со стеком
- •4.3. Передача параметров
2.13. Прерывания
Механизм прерываний - существенная часть любой вычислительной системы. Как мы увидим, он важен и для IBM PC. Структура прерываний предоставляет эффективное средство для связи устройств вводоа-вывода с процессором. Нам прерывания интересны потому, что управление прерываниями - прерогатива программирования на языке ассемблера. В языках высокого уровня отсутствуют средства для работы с прерываниями на машинном уровне.
Прерывания обычно вызываются внешними устройствами. Прерывание сигнализирует процесору о необходимости прервать текущие действия и ответить внешнему устройству. В IBM PC клавиатура посылает сигнал прерывания всякий раз при нажатии любой клавиши. Прерывание клавиатуры заставляет процессор прекратить текущую деятельность и считать набранный на клавиатуре символ.
Легко понять, за что прерывания получили свое название. Прерывание сигнализирует о необходимости "прервать" текущее действие процессора. Прерывания хороши тем, что избавляют процессор постоянного контроля за внешними устройствами. Если бы, например, клавиатура пользователя не вызывала прерываний, то процессор был бы вынужден непрерывно проверять клавиатуру, чтобы обнаружить нажатие клавиши. Каждая написанная для компьютера программа была бы вынуждена делать одно и то же, и им пришлось бы очень часто тестировать клавиатуру. Но наличие прерываний снимают это требование, и программа может выполняться без постоянного тестирования клавиатуры. Каждый раз, как клавиатура получает какую-либо информацию, она сигнализирует об этом процессору. После того, как микропроцессор удовлетворит запрос клавиатуры, он может возобновить нормальный ход выполнения программы.
Работа 8088 с прерываниями во многом напоминает его обращение с процедурами. Прерывание не может прекратить работу процессора во время выполнения команды. Сначала 8088 закончит выполнение текущей команды, но следующую уже проигнорирует. Вместо ее выполнения процессор действует так, как будто следующая команда была вызовом процедуры. Он сохраняет адрес очередной команды в стеке и переходит в специальную процедуру, которую называют программой обработки прерываний. Эта процедура содержит команды для работы с вызвавшим прерывание устройством. В случае с клавиатурой программа обработки прерывания считывает символ и сохраняет его для дальнейшего использования. После того как она закончит работу с устройством, происходит возврат в точку прерывания. Процессор извлекает из стека адрес возврата и продолжает выполнение программы как будто ничего не случилось.
Поскольку прерывание вызывается внешним устройством, оно может произойти в любой момент выполнения программы. Программа не может предпринять каких-либо действий чтобы подготовиться к прерыванию, так как не может предвидеть, когда пользователь нажмет на клавишу клавиатуры. Отсюда следует, что прерывание не должно изменять данные в прерываемой программе. Если прерывание иозменит какое-либо значение в программе, то она не сможет нормально работать когда к ней вернется управление.
В ходе прерывания 8088 автоматически сохраняет некоторые установленные программой значения в стек. В свою очередь, программа обработки прерываний отвечает за сохранение любых других данных, которые она может изменить во время своего выполнения. Эти данные обычно сохраняются в стеке. Затем, перед возвращением управления в прерванную программу, программа обработки прерывания должна вернуть измененным данным те значения, которые они имели в момент прерывания. Факт возникновения прерывания должен остаться "невидимым" для выполняемой программы.
Поскольку сигнал прерывания могут посылать процессору многие устройстваэ, 8088 имеет механизм ориентации прерываний. Это означет, что 8088 определяет, какое устройство вызвало прерывание и передает управление программе обработки прерывания, соответствующей этому устройству. Процессор атоматически управляет веторизацией зап росов на прерывания. Программе обработки прерывания не требуется перед обработкой прерывания определять, какое устройство его вызвало. Это сокращает время реакции на прерывание и упрощает программирование прерываний.
В программамах встречаются такие участки, выполнение которых не может быть прервано. Например, это может быть кусок программы, который должен выполняться очень быстро, чтобы закончить выполнение специфической задачи, или момент работы с данными, которые могут быть изменены программой обработки прерывания. В обоих случаях программа должна иметь возможность задержать или предотвратить прерывания, т.е. программа должна уметь не допускать возникновения прерываний во время выполнения таких критических участков. После прохождения этих участков программа должна восстановить способность системы прерываний вызывать прерывания. Программа не может отключать прерывания на слишком долгое время, иначе с устройством, запросившим прерывание, может произойти какая-нибудь неприятность.
Если прерывание клавиатуры не считает символ до того как оператор нажмет другую клавишу, второй симол может быть потерян. В 8088 имеется возможность блокировать все внешние прерывания. IBM PC имеет более развитую возможность выбирать, каким из устройств можно вызывать прерывание, а каким нет. Программа может использовать эту возможность для выбора наиболее важных устройств, которым можно разрешить прерывания, а менее критическим запретить. Способы отключения прерываний мы обсудим в следующих главах.