Еще одна важная составная часть микропроцессора 8088 - механизм  прерываний. Эта компонента системы встроена в микропроцессор, и  обеспечивает эффективные методы обработки прерываний.

Когда микропроцессор 8088 получает сигнал о необходимости  прерывания, он определяет, какое из устройств требует обслуживания  посредством аппаратной процедуры, известной как цикл подтверждения  прерывания. В IBM PC для обслуживания внешних прерываний  используется контроллер прерываний 8259 фирмы Intel. Контроллер  прерываний программируется так, чтобы выдавать однобайтовое число в  ответ на цикл подтверждения прерывания микропроцессора 8088. Это  число, находящееся в диапазоне от 0 до 255, - номер прерывания  внешнего устройства, вызвавшего прерывание. В персональной ЭВМ  контроллер прерываний обслуживает восемь внешних прерываний,  которым соответствуют номера от 8 до 15.

Как только микропроцессор 8088 получает номер прерывания, он  должен передать управление соответствующей программе обработки  прерывания. Первые 1024 байт памяти микропроцессора 8088  зарезервированы для векторов прерываний. Каждому из 256 возможных  прерываний отводится четырехбайтовая область. Прерывание 0 имеет  четыре байта по адресам от 0 до 3, прерывание 1 - от 4 до 7, и т.д.  Каждая четырехбайтовая ячейка содержит указатель на соответствующий  обработчик конкретного прерывания. Первые два байта содержат  смещение адреса программы обработки прерывания, а последние два  байта - сегмент. Для задания значения этого поля может  использоваться оператор определения двойного слова DD.

Так же, как и вызов подпрограммы, прерывание должно сохранить в  стеке адрес возврата. Поскольку обработчик прерывания может  находиться в любом месте адресного пространства микропроцессора, он  должен обслужить прерывание, как вызов типа FAR, т.е. перед тем,  как микропроцессор передаст управление обработчику прерывания, он  сохранит сегмент и смещение текущей команды в программе. Кроме того  возврат из программы обработки прерывания должен вернуть машину в  точности в то состояние, в котором она была в момент возникновения  прерывания. Чтобы помочь в этом, микропроцессор 8088 также  сохраняет регистр флагов в стеке. Это означает, что эти действия уже не придется выполнять каждой программе обработки прерываний.

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

Когда возникает прерывание, микропроцессор помещает в стек  регистр флагов, за которым следуют регистры CS и IP. 8088 использует  номер прерывания, чтобы считать указатель на программу обработки  прерывания, и передать ей управление. Теперь уже эта программа  отвечает за сохранение регистров, которые она использует, и  восстановление их перед возвратом управления в прерванную  процедуру. Для возврата из прерывания используется специальная  команда IRET. Она извлекает верхние три слова из стека и помещает  их в регистры IP, CS и регистр флагов. В следующих главах мы  приведем несколько примеров, использующих механизм прерываний.

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

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