Просто небольшая подборка справочной информации на тему прерываний. Мне подобные подборки помогают,
при необходимости, быстро вспомнить — что такое прерывания и что именно обозначает вызов того или иного прерывания в простых примерах 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:
|
||||||||||||||||||
| INT 12H |
Запрос размера физической памяти. Возвращает в регистре AX размер памяти в килобайтах, например, шест.200 соответствует памяти в 512 К. Данная операция полезна для выравнивания размера программы в соответствии с доступной памятью. |
||||||||||||||||||
| INT 13H |
Дисковые операции ввода — вывода. Обеспечивает операции ввода-вывода для дискет и винчестера. |
||||||||||||||||||
| INT 14H |
Управление коммуникационным адаптером. Обеспечивает последовательный ввод-вывод через коммуникационный порт RS232. Регистр DX должен содержать номер (0 или 1) адаптера стыка RS232. Четыре типа операции, определяемые регистром AH, |
||||||||||||||||||
| 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 соответствует следующим операциям:
Коды 02 и 06 управляют временем и датой для AT. |
||||||||||||||||||
| INT 1FH |
Адрес таблицы графических символов. В графическом режиме имеется доступ к символам с кодами 128-255 в 1К таблице, содержащей по восемь байт на каждый символ. Прямой доступ в графическом режиме обеспечивается только к первым 128 |
Прерывания 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, |
| INT 22H |
Адрес подпрограммы обработки завершения задачи. (см.INT 24H). |
| INT 23H |
Адрес подпрограммы реакции на Ctrl/Break. (см.INT 24H). |
| INT 24H |
Адрес подпрограммы реакции на фатальную ошибку. В этом элементе и в двух предыдущих содержатся адреса, которые инициализируются системой в префиксе |
| 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 | Вывод строки символов на экран. |
| 0А | Ввод с клавиатуры с буферизацией. |
| 0В | Проверка наличия ввода с клавиатуры. |
| 0С | Очистка буфера ввода с клавиатуры и запрос на ввод. |
| 0D | Сброс диска. |
| 0Е | Установка текущего дисковода. |
| 0F | Открытие файла через FCB. |
| 10 | Закрытие файла через FCB. |
| 11 | Начальный поиск файла по шаблону. |
| 12 | Поиск следующего файла по шаблону. |
| 13 | Удаление файла с диска. |
| 14 | Последовательное чтение файла. |
| 15 | Последовательная запись файла. |
| 16 | Создание файла. |
| 17 | Переименование файла. |
| 18 | Внутренняя операция DOS. |
| 19 | Определение текущего дисковода. |
| 1А | Установка области передачи данных (DTA). |
| 1В | Получение таблицы FAT для текущего дисковода. |
| 1С | Получение FAT для любого дисковода. |
| 21 | Чтение с диска с прямым доступом. |
| 22 | Запись на диск с прямым доступом. |
| 23 | Определение размера файла. |
| 24 | Установка номера записи для прямого доступа. |
| 25 | Установка вектора прерывания. |
| 26 | Создание программного сегмента. |
| 27 | Чтение блока записей с прямым доступом. |
| 28 | Запись блока с прямым доступом. |
| 29 | Преобразование имени файла во внутренние параметры. |
| 2А | Получение даты (CX-год,DН-месяц,DL-день). |
| 2В | Установка даты. |
| 2С | Получение времени (CH-час,CL-мин,DН-с,DL-1/100с). |
| 2D | Установка времени. |
| 2Е | Установка/отмена верификации записи на диск. |
Следующие расширенные функции возможны в DOS начиная с версии 2.0:
| 2F | Получение адреса DTA в регистровой паре ES:BX. |
| 30 | Получение номера версии DOS в регистре АХ. |
| 31 | Завершение программы, после которого она остается резидентной в памяти. |
| 33 | Проверка Ctrl/Break. |
| 35 | Получение вектора прерывания (адреса подпрограммы). |
| 36 | Получение размера свободного пространства на диске. |
| 38 | Получение государственно зависимых форматов. |
| 39 | Создание подкаталога (команда MKDIR). |
| ЗА | Удаление подкаталога (команда RMDIR). |
| 3В | Установка текущего каталога (команда CHDIR). |
| 3C | Создание файла без использования FCB. |
| 3D | Открытие файла без использования FCB. |
| 3E | Закрытие файла без использования FCB. |
| 3F | Чтение из файла или ввод с устройства. |
| 40 | Запись в файл или вывод на устройство. |
| 41 | Удаление файла из каталога. |
| 42 | Установка позиции для последовательного доступа. |
| 43 | Изменение атрибутов файла. |
| 44 | Управление вводом-выводом для различных устройств. |
| 45 | Дублирование файлового номера. |
| 46 | «Склеивание» дублированных файловых номеров. |
| 47 | Получение текущего каталога. |
| 48 | Выделение памяти из свободного пространства. |
| 49 | Освобождений выделенной памяти. |
| 4А | Изменение длины блока выделенной памяти. |
| 4В | Загрузка/выполнение программы (подпроцесса). |
| 4С | Завершение подпроцесса с возвратом управления. |
| 4D | Получение кода завершения подпроцесса. |
| 4Е | Начальный поиск файла по шаблону. |
| 4F | Поиск следующего файла по шаблону. |
| 54 | Получение состояния верификации. |
| 56 | Переименование файла. |
| 57 | Получение/установка даты и времени изменения файла. |
Следующие расширенные функции возможны в DOS начиная с версии 3.0:
| 59 | Получение расширенного кода ошибки. |
| 5А | Создание временного файла. |
| 5В | Создание нового файла. |
| 5С | Блокирование/разблокирование доступа к файлу. |
| 62 | Получение адреса префикса программного сегмента (PSP). |
В техническом руководстве по DOS представлены подробные описания каждой функции.
Пример вызова прерываний
|
1 2 3 |
mov ah,9h mov dx,offset Message int 21h |
Вызывается прерывание 21h. В регистр ah помещаем значение 9h. При вызове прерывания 21h будет
прочитано значение этого регистра (см. таблицы выше), и в зависимости от значения выбран тот или иной обработчик. Значение 9h — это вывод строки символов на экран, которая будет прочитана из регистра dx.
Очень похоже на вызов функции с передачей ей параметров, в более высокоуровневом языке.
|
1 |
int 20h |
Вызов прерывания 20h, т.е. инициируем выход из программы. В результате выполнения этого прерывания, программа завершится и вернет нас туда, откуда мы ее запустили, например, в DOS Navigator. Это похоже на оператор exit() в perl.
Символ «h» после числа, в строке «int 20h», означает, что используется шестнадцатиричная система исчисления.
Справочная информация для заметки получена из источников
Ассемблер для крэкера. Под редакцией Еpшова В.Г.
MS-DOS для программиста. Александр Фролов, Григорий Фролов. Том 4, М.: Диалог-МИФИ, 1993, 254 стр.