Шаг 10.
Прерывания

    На этом шаге мы начнем знакомиться с прерываниями.

    Для организации ввода или вывода информации используются прерывания, вызываемые при выполнении команды INT, общий вид которых следующий:

    INT <номер прерывания>                   .

    Свое название прерывания получили из-за того, что при их выполнении программа передает управление в DOS или BIOS для совершения определенного действия и затем возвращает управление в прерванную программу. Необходимость прерываний обусловлена двумя основными причинами:

  1. преднамеренный запрос таких действий, как операции ввода-вывода на различные устройства и
  2. непредвиденные программные ошибки (например, переполнение при делении).

    Система BIOS (Basic Input/Output System - базовая система ввода/вывода) находится в ROM (ПЗУ) и управляет всеми прерываниями в системе. Начальный адрес ROM - FFFF0H. Напомним, что ее основное назначение (помимо размещения BIOS) - поддержка процедур начальной загрузки: выполнение различных проверок, загрузка данных с системной дискеты и т.д.

    Остановимся более подробно на порядке загрузки компьютера.

    При включении компьютера процессор устанавливает в регистре CS значение FFFFH, а в регистре IP - 0000H. Таким образом, первая выполняемая команда находится по адресу FFFFH:0000H или FFFF0H, что является точкой входа в BIOS. BIOS проверяет различные порты компьютера для определения и инициализации подключенных устройств. Затем он создает в начале памяти по адресу 00000H таблицу векторов прерываний, которая содержит адреса обработчиков прерываний, и выполняет две операции INT 11H (запрос списка присоединенного оборудования) и INT 12H (запрос размера физической памяти).

    Следующим шагом BIOS определяет, имеется ли на диске или дискете операционная система DOS. Если обнаружена системная дискета, то BIOS выполняет прерывание INT 19H для доступа к первому сектору диска, содержащему блок начальной загрузки. Этот блок представляет собой программу, которая считывает системные файлы IO.SYS (или IBMBIO.COM), MSDOS.SYS (или IBMDOS.COM) и COMMAND.COM с диска в память, после чего компьютер готов к работе (загружена операционная система).

    Заметим, что одним из пунктов процесса загрузки компьютера является построение таблицы векторов прерываний. Рассмотрим порядок использования прерываний.

    Операнд в команде прерывания, например, 10H в команде INT 10H, содержит тип прерывания, являющийся идентификатором запроса. Для каждого прерывания система содержит адрес в таблице векторов прерываний. Так как в таблице имеется 256 четырехбайтовых элементов, то она занимает первые 1024 байта памяти (256*4=1024, от 00000H до 003FFH). Каждый элемент таблицы определяет адрес подпрограммы обработки указанного типа прерывания и содержит значения кодового сегмента и смещение, которые при прерывании устанавливаются в регистры CS и IP соответственно.


Рис.1. Общая схема выполнения прерывания

    Порядок выполнения прерывания следующий (рисунок 1).

  1. Прерывание заносит в стек содержимое флагового регистра, регистра CS и регистра IP. Например, для прерывания 10H адрес элемента таблицы равен 0040H (0010H*0004H = 0040H).
  2. Операция выделяет четырехбайтовый элемент по адресу 0040H и заносит два байта в регистр IP и два байта в регистр СS.
  3. Адрес, который получается в регистровой паре CS:IP, представляет собой адрес начала подпрограммы в области BIOS, которая получает управление.
  4. Возврат из этой подпрограммы осуществляется командой IRET (Interrupt Return), которая восстанавливает флаги и регистры CS и IP из стека и передает управление на команду, следующую за выполненной командой прерывания.

    На следующем шаге мы продолжим разговор о прерываниях, в частности поговорим о типах прерываний.


Предыдущий шаг Содержание Следующий шаг