- •1. Основы программирования для dos 9
- •1.1.7. Средства bios 21
- •2. Приемы системного программирования 57
- •Введение
- •1.Основы программирования для dos
- •1.1. Структура и выполнение программ в dos
- •Программа типа сом
- •Программа типа ехе
- •1.2.Использование служебных функций dos и bios
- •1.3.Вывод на экран в текстовом режиме
- •Средства dos
- •Средства bios
- •Выбор видеорежима
- •Управление положением курсора
- •Вывод символов на экран
- •Прямая работа с видеопамятью
- •1.4.Ввод с клавиатуры
- •Средства dos
- •Средства bios
- •1.5.Графические видеорежимы
- •Работа со стандартными графическими режимами
- •Работа с svga-режимами
- •(Продолжение таблицы 4)
- •(Окончание таблицы 4)
- •1.6.Работа с мышью
- •1.7.Другие устройства
- •Системный таймер
- •Последовательный порт
- •Параллельный порт
- •1.8.Работа с файлами
- •Создание и открытие файлов
- •Чтение из файла и запись в файл
- •Закрытие и удаление файла
- •Поиск файлов
- •Управление файловой системой
- •1.9.Управление памятью
- •Обычная память
- •Область памяти umв
- •Область памяти нма
- •Интерфейс ems
- •Интерфейс xms
- •1.10.Организация процессов
- •Запуск программ на выполнение
- •Переменные окружения
- •Командные параметры
- •2.Приемы системного программирования
- •2.1.Управляющие структуры
- •Структуры if... Then... Else
- •Структуры case
- •Конечные автоматы
- •2.2.Процедуры и функции
- •Передача параметров
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Передача параметров по возвращаемому значению
- •Передача параметров по результату
- •Передача параметров по имени
- •Передача параметров отложенным вычислением
- •Передача параметров в регистрах
- •Передача параметров в глобальных переменных
- •Передача параметров в стеке
- •Передача параметров в потоке кода
- •Передача параметров в блоке параметров
- •Локальные переменные
- •2.3.Обработка прерываний
- •Обработчики прерываний
- •Прерывания от внешних устройств
- •Взаимодействие прикладных и системных обработчиков прерываний
- •2.4.Резидентные программы
- •Системные средства организации резидентных программ
- •Взаимодействие с резидентной программой
- •2.5.Драйверы устройств в dos
- •Литература
2.3.Обработка прерываний
В архитектуре процессоров 80х86 предусмотрены особые ситуации, когда процессор прекращает (прерывает) выполнение текущей программы и немедленно передает управление программе-обработчику, специально написанной для обработки этой конкретной ситуации. Программы обработки прерываний иногда называются ISR (Interrupt Service Routine).
Прерывания могут возникать по разным причинам:
аппаратные прерывания вызываются внешними устройствами, подключенными к контроллеру прерываний;
внутренние прерывания (исключения) вызываются процессором в случае выполнения неверной команды либо возникновении ошибки выполнения команды (например, при делении на 0);
программные прерывания возникают при выполнении процессором команды INT.
Ниже рассматривается обработка прерываний при работе процессора в реальном режиме. Структура обработчиков аппаратных, внутренних и программных прерываний существенно различается, однако механизм обработки процессором сигнала любого прерывания одинаков. Объекты вычислительной системы, принимающие участие в процедуре прерывания, и их взаимодействие показаны на рис. 6.
Адреса обработчиков прерываний хранятся в специальной таблице — таблице векторов прерываний. Эта таблица хранится в начале оперативной памяти (по адресам 0000 – 03FFh). Каждый вектор (ячейка таблицы) занимает два слова: младшее содержит смещение, а старшее — сегментный адрес соответствующего обработчика (или нули, если обработчик не установлен). Векторы, как и соответствующие им прерывания, имеют номера (0 – 255). Вектор 0 располагается в начале, а вектор 255 — в конце таблицы. Часть векторов не используется системой, они зарезервированы для будущих применений или для пользовательских обработчиков (например, векторы с номерами 60h – 66h). Иногда векторами прерываний называют сами адреса обработчиков прерываний.
-
Адреса памяти
таблица векторов
0
IP ISR 0
вектор прерывания 0
2
CS ISR 0
4
IP ISR 1
вектор прерывания 1
6
CS ISR 1
n4
IP ISR n
вектор прерывания n
n4+2
CS ISR n
Процессор
IP
IP
Вектор прерванного процесса
CS
CS
Флаги
Флаги
SP на момент прерывания
Рис. 6. Процедура обслуживания прерывания
Получив сигнал прерывания с определенным номером, процессор сохраняет в стеке выполняемой программы текущее содержимое регистров Flags, CS и IP. Затем процессор загружает CS и IP из соответствующего вектора прерывания, осуществляя, тем самым, переход на обработчик прерывания. Обработчик всегда заканчивается командой IRET, выполняющей обратные действия — извлечение из стека сохраненных там слов и помещение их назад в регистры IP, CS и Flags, что приводит к возврату в прерванную программу.
Команда INT (а также INTO и INT3) используется в программах для вызова обработчиков программных прерываний. Аппаратные прерывания вызываются устройствами в произвольные моменты времени (асинхронный вызов прерывания). Командой INT можно также передавать управление на обработчики аппаратных прерываний (синхронный вызов).
Программные прерывания, то есть передача управления при помощи команды INT, являются основным средством вызова процедур DOS и BIOS. В отличие от вызова с помощью команды CALL здесь нужно знать не адрес вызываемой процедуры, а ее номер. С другой стороны интерфейса рассмотрим, как строится обработчик программного прерывания.