Что такое прерывание

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

Прерывание (Interrupt) - это прерывание процесса выполнения текущей программы для выполнения какой-либо другой работы.

Прерывания могут быть программными и аппаратными. Аппаратные генерируются устройствами, а программные вызываются самой программой и являются фактически аналогами вызова подпрограмм, вызовами системных функций DOS, например.

Аппаратные прерывания прерывают выполнение программы в момент, когда происходит какое-то событие, например, при нажатие клавиши на клавиатуре, движение мыши и т.п.

Для того чтобы связать адрес обработчика прерывания с номером прерывания, используется таблица векторов прерываний (Interrupt Descriptor Table).

Первый этап инициализации таблицы векторов прерываний выполняется BIOS, перед загрузкой ОС. Второй - непосредственно самой операционной системой. Операционной системе доступно изменение некоторых адресов прерываний.

Таблицу можно представить, как таблицу с одним столбцом и множеством строк. Каждый элемент таблицы указывает на подпрограмму обработки указанного типа прерывания.

Первая строка будет указывать на обработчик для прерывания int 0, вторая - int 1 и т.п. Длина таблицы зависит от операционной системы и используемого оборудования.

Для вызова прерываний используется шестнадцатеричная система исчисления.

 

Назначение наиболее важных векторов прерываний MS-DOS.

Номер Описание
0

Ошибка деления.

Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0). Обычно при обработке этого прерывания MS-DOS выводит сообщение об ошибке и останавливает выполнение программы. При этом для процессора i8086 адрес возврата указывает на команду, следующую после команды деления, а для процессора i80286 и более старших моделей - на первый байт команды, вызвавшей прерывание

1

Прерывание пошагового режима.

Вырабатывается после выполнения каждой машинной команды, если в слове флагов установлен бит пошаговой трассировки TF. Используется для отладки программ. Это прерывание не вырабатывается после пересылки данных в сегментные регистры командами MOV и POP

2

Аппаратное немаскируемое прерывание.

Это прерывание может использоваться по-разному в разных машинах. Обычно оно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора

3

Прерывание для трассировки.

Генерируется при выполнении однобайтовой машинной команды с кодом CCh и обычно используется отладчиками для установки точки прерывания

4

Переполнение.

Генерируется машинной командой INTO , если установлен флаг переполнения OF. Если флаг не установлен, команда INTO выполняется как NOP. Это прерывание используется для обработки ошибок при выполнении арифметических операций

5

Печать копии экрана.

Генерируется, если пользователь нажал клавишу <PrtSc>. В программах MS-DOS обычно используется для печати образа экрана. Для процессора i80286 и более старших моделей генерируется при выполнении машинной команды BOUND, если проверяемое значение вышло за пределы заданного диапазона

6

Неопределенный код операции или длина команды больше 10 байт

7

Особый случай отсутствия арифметического сопроцессора

8

IRQ0 - прерывание интервального таймера, возникает 18,2 раза в секунду

9

IRQ1 - прерывание от клавиатуры. Генерируется, когда пользователь нажимает и отжимает клавиши. Используется для чтения данных из клавиатуры

A

IRQ2 - используется для каскадирования аппаратных прерываний

B

IRQ3 - прерывание асинхронного порта COM2

C

IRQ4 - прерывание асинхронного порта COM1

D

IRQ5 - прерывание от контроллера жесткого диска (только для компьютеров IBM PC/XT)

E

IRQ6 - прерывание генерируется контроллером НГМД после завершения операции ввода/вывода

F

IRQ7 - прерывание от параллельного адаптера. Генерируется, когда подключенный к адаптеру принтер готов к выполнению очередной операции. Обычно не используется

10

Обслуживание видеоадаптера

11

Определение конфигурации устройств в системе

12

Определение размера оперативной памяти

13

Обслуживание дисковой системы

14

Работа с асинхронным последовательным адаптером

15

Расширенный сервис

16

Обслуживание клавиатуры

17

Обслуживание принтера

18

Запуск BASIC в ПЗУ, если он есть

19

Перезагрузка операционной системы

1A

Обслуживание часов

1B

Обработчик прерывания, возникающего, если пользователь нажал комбинацию клавиш <Ctrl+Break>

1C

Программное прерывание, вызывается 18,2 раза в секунду обработчиком аппаратного прерывания таймера

1D

Адрес видеотаблицы для контроллера видеоадаптера 6845

1E

Указатель на таблицу параметров дискеты

1F

Указатель на графическую таблицу для символов с кодами ASCII 128-255

20-5F

Используется MS-DOS или зарезервировано для MS-DOS

60-67

Прерывания, зарезервированные для программ пользователя

68-6F

Не используются

70

IRQ8 - прерывание от часов реального времени

71

IRQ9 - прерывание от контроллера EGA

72

IRQ10 - зарезервировано

73

IRQ11 - зарезервировано

74

IRQ12 - зарезервировано

75

IRQ13 - прерывание от арифметического сопроцессора

76

IRQ14 - прерывание от контроллера жесткого диска

77

IRQ15 - зарезервировано

78-7F

Не используются

80-85

Зарезервировано для BASIC

86-F0

Используются интерпретатором BASIC

F1-FF

Не используются

Прерывания, обозначенные как IRQ0 - IRQ15 являются аппаратными прерываниями.

 

Прерывания BIOS

В данном разделе приведены основные прерывания BIOS.

INT 05H

Печать экрана.

Выполняет вывод содержимого экрана на печатающее устройство. Команда INT 05H выполняет данную операцию из программы, а нажатие клавишей Ctrl/PrtSc - с клавиатуры. Операция запрещает прерывания и сохраняет позицию курсора.

INT 10H

Управление дисплеем.

Обеспечивает экранные и клавиатурные операции.

INT 11H

Запрос списка присоединенного оборудования.

Определяет наличие различных устройств в системе, результирующее значение возвращает в регистре AX. При включении компьютера система выполняет эту операцию и сохраняет содержимое AX в памяти по адресу шест.410. Значения битов в регистре AX:

Бит Устройство
15,14 Число подключенных принтеров.
13 Последовательный принтер.
12 Игровой адаптер.
11-9 Число последовательных адаптеров стыка RS232.
7,6 Число дискетных дисководов, при бите 0=1: 00=1, 01=2, 10=3 и 11=4.
5,4 Начальный видео режим:
00 = не используется,
01 = 40х25 плюс цвет,
10 = 80х25 плюс цвет,
11 = 80х25 черно-белый режим.
1 Значение 1 говорит о наличии сопроцессора.
0 Значение 1 говорит о наличии одного или более дисковых устройств и загрузка операционной системы должна осуществляться с диска.
INT 12H

Запрос размера физической памяти.

Возвращает в регистре AX размер памяти в килобайтах, например, шест.200 соответствует памяти в 512 К. Данная операция полезна для выравнивания размера программы в соответствии с доступной памятью.

INT 13H

Дисковые операции ввода - вывода.

Обеспечивает операции ввода-вывода для дискет и винчестера.

INT 14H

Управление коммуникационным адаптером.

Обеспечивает последовательный ввод-вывод через коммуникационный порт RS232. Регистр DX должен содержать номер (0 или 1) адаптера стыка RS232. Четыре типа операции, определяемые регистром AH,
выполняют прием и передачу символов и возвращают в регистре AX байт состояния коммуникационного порта.

INT 15H

Кассетные операции ввода - вывода и специальные функции для компьютеров AT.

Обеспечивает операции ввода-вывода для кассетного магнитофона, а также расширенные операции для компьютеров AT.

INT 16H

Ввод с клавиатуры.

Обеспечивает три типа команд ввода с клавиатуры.

INT 17H

Вывод на принтер.

Обеспечивает вывод данных на печатающее устройство.

INT 18H

Обращение к BASIC, встроенному в ROM.

Вызывает BASIC-интерпретатор, находящийся в постоянной памяти ROM.

INT 19H

Перезапуск системы.

Данная операция при доступном диске считывает сектор 1 с дорожки 0 в область начальной загрузки в памяти (сегмент 0, смещение 7C00) и передает управление по этому адресу. Если дисковод не доступен, то операция передает управление через INT 18H в ROM BASIC. Данная операция не очищает экран и не инициализирует данные в ROM BASIC, поэтому ее можно использовать из программы.

INT 1AH

Запрос и установка текущего времени и даты.

Считывает и записывает показание часов в соответствии со значением в регистре AH. Для определения продолжительности выполнения программы можно перед началом выполнения установить часы в 0, а после считать текущее время. Отсчет времени идет примерно 18,2 раза в секунду. Значение в регистре AH соответствует следующим операциям:

AH=00 Запрос времени. В регистре CX устанавливается старшая часть значения, а в регистре DX - младшая. Если после последнего запроса прошло 24 часа, то в регистре AL будет не нулевое значение.
AH=01 Установка времени. Время устанавливается по регистрам CX (старшая часть значения) и DX (младшая часть значения).

Коды 02 и 06 управляют временем и датой для AT.

INT 1FH

Адрес таблицы графических символов.

В графическом режиме имеется доступ к символам с кодами 128-255 в 1К таблице, содержащей по восемь байт на каждый символ. Прямой доступ в графическом режиме обеспечивается только к первым 128
ASCII-символам (от 0 до 127).

 

Прерывания DOS

Во время своей работы BIOS использует два модуля DOS: IBMBIO.COM и IBMDOS.COM. Так как модули DOS обеспечивают большое количество разных дополнительных проверок, то операция DOS обычно проще в использовании и менее машиннозависимы, чем их BIOS аналоги.

Модуль IBMBIO.COM обеспечивает интерфейс с BIOS низкого уровня. Эта программа выполняет управление вводом-выводом при чтении данных из внешних устройств в память и записи из памяти на внешние устройства.

Модуль IBMDOS.COM содержит средства управления файлами и ряд сервисных функций, таких как блокирование и деблокирование записей. Когда пользовательская программа выдает запрос INT 21H, то в программу IBMDOS через регистры передается определенная информация. Затем программа IBMDOS транслирует эту информацию в один или несколько вызовов IBMBIO, которая в свою очередь вызывает BIOS. Указанные связи приведены на следующей схеме:

Пользовательский уровень Высший уровень Низший уровень ROM Внешний уровень
Программный запрос в/в DOS IBMDOS.COM DOS IBMBIO.COM BIOS Устройство

Как показано выше, прерывания от шест.20 до шест.62 зарезервированы для операций DOS. Ниже приведены наиболее основные из них:

INT 20H

Завершение программы.

Запрос завершает выполнение программы и передает управление в DOS. Данный запрос обычно находится в основной процедуре.

INT 21H

Запрос функций DOS.

Основная операция DOS,
вызывающая определенную функцию в соответствии с кодом в регистре AH. Назначение функций DOS описано в следующем разделе.

INT 22H

Адрес подпрограммы обработки завершения задачи. (см.INT 24H).

INT 23H

Адрес подпрограммы реакции на Ctrl/Break. (см.INT 24H).

INT 24H

Адрес подпрограммы реакции на фатальную ошибку.

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

INT 25H

Абсолютное чтение с диска.

INT 26H

Абсолютная запись на диск.

INT 27H

Завершение программы, оставляющее ее резедентной.

Позволяет сохранить COM-программу в памяти.

 

Функции прерывания DOS INT 21H

Ниже приведены базовые функции для прерывания DOS INT 21H. Код функции устанавливается в регистре AH:

00 Завершение программы (аналогично INT 20H).
01 Ввод символа с клавиатуры с эхом на экран.
02 Вывод символа на экран.
03 Ввод символа из асинхронного коммуникационного канала.
04 Вывод символа на асинхронный коммуникационный канал.
05 Вывод символа на печать.
06 Прямой ввод с клавиатуры и вывод на экран.
07 Ввод с клавиатуры без эха и без проверки Ctrl/Break.
08 Ввод с клавиатуры без эха с проверкой Ctrl/Break.
09 Вывод строки символов на экран.
Ввод с клавиатуры с буферизацией.
Проверка наличия ввода с клавиатуры.
Очистка буфера ввода с клавиатуры и запрос на ввод.
0D Сброс диска.
Установка текущего дисковода.
0F Открытие файла через FCB.
10 Закрытие файла через FCB.
11 Начальный поиск файла по шаблону.
12 Поиск следующего файла по шаблону.
13 Удаление файла с диска.
14 Последовательное чтение файла.
15 Последовательная запись файла.
16 Создание файла.
17 Переименование файла.
18 Внутренняя операция DOS.
19 Определение текущего дисковода.
Установка области передачи данных (DTA).
Получение таблицы FAT для текущего дисковода.
Получение FAT для любого дисковода.
21 Чтение с диска с прямым доступом.
22 Запись на диск с прямым доступом.
23 Определение размера файла.
24 Установка номера записи для прямого доступа.
25 Установка вектора прерывания.
26 Создание программного сегмента.
27 Чтение блока записей с прямым доступом.
28 Запись блока с прямым доступом.
29 Преобразование имени файла во внутренние параметры.
Получение даты (CX-год,DН-месяц,DL-день).
Установка даты.
Получение времени (CH-час,CL-мин,DН-с,DL-1/100с).
2D Установка времени.
Установка/отмена верификации записи на диск.

Следующие расширенные функции возможны в DOS начиная с версии 2.0:

2F Получение адреса DTA в регистровой паре ES:BX.
30 Получение номера версии DOS в регистре АХ.
31 Завершение программы, после которого она остается резидентной в памяти.
33 Проверка Ctrl/Break.
35 Получение вектора прерывания (адреса подпрограммы).
36 Получение размера свободного пространства на диске.
38 Получение государственно зависимых форматов.
39 Создание подкаталога (команда MKDIR).
ЗА Удаление подкаталога (команда RMDIR).
Установка текущего каталога (команда CHDIR).
3C Создание файла без использования FCB.
3D Открытие файла без использования FCB.
3E Закрытие файла без использования FCB.
3F Чтение из файла или ввод с устройства.
40 Запись в файл или вывод на устройство.
41 Удаление файла из каталога.
42 Установка позиции для последовательного доступа.
43 Изменение атрибутов файла.
44 Управление вводом-выводом для различных устройств.
45 Дублирование файлового номера.
46 "Склеивание" дублированных файловых номеров.
47 Получение текущего каталога.
48 Выделение памяти из свободного пространства.
49 Освобождений выделенной памяти.
Изменение длины блока выделенной памяти.
Загрузка/выполнение программы (подпроцесса).
Завершение подпроцесса с возвратом управления.
4D Получение кода завершения подпроцесса.
Начальный поиск файла по шаблону.
4F Поиск следующего файла по шаблону.
54 Получение состояния верификации.
56 Переименование файла.
57 Получение/установка даты и времени изменения файла.

Следующие расширенные функции возможны в DOS начиная с версии 3.0:

59 Получение расширенного кода ошибки.
Создание временного файла.
Создание нового файла.
Блокирование/разблокирование доступа к файлу.
62 Получение адреса префикса программного сегмента (PSP).

В техническом руководстве по DOS представлены подробные описания каждой функции.

 

Пример вызова прерываний

Вызывается прерывание 21h. В регистр ah помещаем значение 9h. При вызове прерывания 21h будет
прочитано значение этого регистра (см. таблицы выше), и в зависимости от значения выбран тот или иной обработчик. Значение 9h - это вывод строки символов на экран, которая будет прочитана из регистра dx.
Очень похоже на вызов функции с передачей ей параметров, в более высокоуровневом языке.

 

Вызов прерывания 20h, т.е. инициируем выход из программы. В результате выполнения этого прерывания, программа завершится и вернет нас туда, откуда мы ее запустили, например, в DOS Navigator. Это похоже на оператор exit() в perl.

Символ "h" после числа, в строке "int 20h", означает, что используется шестнадцатиричная система исчисления.

Справочная информация для заметки получена из источников

Ассемблер для крэкера. Под редакцией Еpшова В.Г.

MS-DOS для программиста. Александр Фролов, Григорий Фролов. Том 4, М.: Диалог-МИФИ, 1993, 254 стр.