Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

[Назад] [Содеожание] [Дальше]

1.4. Обзор прерываний BIOS

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

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

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

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

Как программа пользовалась услугами монитора?

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

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

В первых персональных компьютерах Apple и IBM PC модули обслуживания стандартной периферии были записаны в постоянном запоминающем устройстве. Совокупность этих модулей (плюс программа начальной инициализации и тестирования) в компьютере IBM PC назвали базовой системой ввода/вывода BIOS.

Выпускаемые различными фирмами компьютеры, совместимые с IBM PC, могут немного отличаться по типу периферийного оборудования, но для достижения совместимости с IBM PC модули BIOS нивелируют эти различия, предоставляя в распоряжение программы пользователя стандартный набор модулей для работы с устройствами ввода/вывода.

Не будет преувеличением сказать, что одна из причин такого невиданного успеха IBM PC на рынке персональных компьютеров - наличие хорошо продуманного стандартного интерфейса модулей BIOS и прикладных программ. Именно благодаря этому интерфейсу достигается почти стопроцентная совместимость по программному обеспечению компьютеров этого типа, выпускаемых разными фирмами.

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

Напомним вам, что такое программное прерывание.

В начале оперативной памяти персонального компьютера (в пределах первого килобайта) находится так называемая векторная таблица прерываний. Она состоит из 256 ячеек, хранящих адреса программ-обработчиков прерывания. Мы будем подробно изучать эту таблицу, а сейчас вспомним машинную команду INT <n>.

По команде INT <n> содержимое ячейки векторной таблицы прерываний с номером n помещается в адресные регистры процессора, причем в стеке запоминается текущее содержимое адресных регистров. Управление передается по адресу, записанному в ячейке таблицы. Программа-обработчик прерывания должна заканчиваться командой IRET, по которой из стека извлекается старое значение адресных регистров и управление передается обратно в программу, вызвавшую прерывание командой INT <n>.

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

Для вызова модуля BIOS программа использует команду INT <n> с соответствующим номером n. Программа передает параметры модулям BIOS через регистры процессора, результат работы модуля возвращается также в регистрах.

BIOS использует не все возможные номера прерываний. Часть из них предназначена для аппаратных прерываний от периферийных устройств, часть зарезервирована для MS-DOS, часть - для программ пользователя.

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

Определение конфигурации компьютера

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

Для определения конфигурации компьютера программа может вызвать прерывание INT 11h. При этом она получает в регистре AX содержимое указанной выше ячейки памяти, имеющей размер в одно слово. Каждый бит в слове конфигурации отвечает за соответствующее устройство.

Анализируя слово конфигурации, программа может узнать, подключены ли к компьютеру накопители на гибких магнитных дисках (НГМД) и, если подключены, то сколько их имеется в наличии. Можно определить начальный режим видеоконтроллера, выяснить, присутствует ли арифметический сопроцессор, сколько в системе установлено параллельных и последовательных портов, подключен ли игровой адаптер (джойстик).

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

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

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

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

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

Если ваш компьютер оборудован расширенной памятью (адресное пространство расширенной памяти находится выше границы в 1 мегабайт), размер этой памяти в килобайтах можно узнать, вызвав прерывание INT 15h со значением регистра AX, равным 8800h.

Однако будьте осторожны - при использовании драйвера himem.sys операционная система MS-DOS резервирует для себя всю расширенную память. Несмотря на то что объем свободной расширенной оперативной памяти, определенный с помощью прерывания INT 15h, будет при этом равным нулю, программа все же сможет заказать себе блоки в такой памяти. Для этого следует воспользоваться программным интерфейсом драйвера himem.sys.

Работа с видеоконтроллером

Прерывание INT 10h выполняет все многочисленные операции по обслуживанию видеоконтроллера.

При вызове прерывания INT 10h, как и при вызове многих других прерываний, регистр AH содержит номер функции, которую требуется выполнить. Остальные регистры содержат дополнительные параметры.

Программирование видеоконтроллера - сложная задача. Функции, выполняемые прерыванием INT 10h слишком обширны даже для простого перечисления. Поэтому мы приведем краткий обзор только некоторых из этих функций.

Выбрать видеорежим (00h)

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

Что здесь имеется в виду?

Напомним, что видеоконтроллер может работать либо в текстовом, либо в графическом режиме. На самом деле существует много различных текстовых и графических режимов, различающихся размером изображения в пикселах (для графического режима), количеством строк и столбцов (для текстового режима), способом представления цвета и т. д.

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

Установить размеры и форму курсора (01h)

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

Установить курсор (02h)

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

Определить положение курсора (03h)

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

Получить положение светового пера (04h)

Световое перо используется исключительно редко, однако если оно есть, то функция 04h позволит вам с ним работать.

Выбрать активную страницу видеопамяти (05h)

Компьютер может хранить в видеопамяти не один образ экрана, а несколько. Для этого видеопамять (память для хранения видеоизображения, находится в видеоконтроллере) разбивается на блоки, которые называются страницами. Отображается только активная страница видеопамяти.

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

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

Свернуть окно (06h, 07h)

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

Прочитать/записать символ и атрибут (08h, 09h)

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

Запись и чтение символа начинается с текущего положения курсора.

Записать символ (0Ah)

Эта функция предназначена для записи символа в видеопамять без определения для него индивидуального значения атрибута. Используется текущий атрибут. Можно задавать кратность записи.

Выбрать цветовую палитру (0Bh)

Эта функция позволяет управлять цветом рамки вокруг изображения в текстовом режиме и цветом фона в графическом режиме (для видеоконтроллеров EGA, VGA и SVGA).

Записать/прочитать точку (0Ch, 0Dh)

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

Вывести символ на экран консоли (0Eh)

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

Определить текущий видеорежим (0Fh)

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

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

Обслуживание видеоконтроллера (10h, 11h, 12h)

Эти функции работают только при использовании видеоадаптеров EGA, VGA и SVGA. Они позволяют устанавливать цветовую палитру, загружать знакогенератор (например, шрифтом для русских букв) и выполнять некоторые другие функции.

Вывести строку на экран консоли (13h)

Для машин класса AT и выше при наличии дисплейных адаптеров EGA, VGA или SVGA эта функция позволяет вывести на экран произвольную строку символов заданной длины, с заданным атрибутом и в заданном месте экрана. Можно также указать номер страницы видеопамяти.

Если вы не можете использовать эту функцию (программа работает на компьютере типа XT или в компьютере установлен видеоконтроллер CGA), единственный способ вывести на экран строку символов с помощью прерывания INT 10h - вызов в цикле функций 09h, 0Ah или 0Eh для вывода строки по одному символу.

Работа с клавиатурой

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

Заметим, что коды нажатых клавиш помещаются в специальный буфер клавиатуры. Одна из функций прерывания INT 16h проверяет состояние буфера - есть в нем коды нажатых клавиш или нет. Если буфер не пуст, первый помещенный в буфер код клавиши возвращается программе. Этот код затем может быть считан другой функцией ввода (ввод с ожиданием). Такая функция приостанавливает работу программы до тех пор, пока пользователь не нажмет любую клавишу. Затем она возвращает программе код нажатой клавиши.

Пару описанных выше функций можно также использовать для очистки буфера клавиатуры: сначала программа проверяет, пуст ли буфер. Если он не пуст, считывает код клавиши. Этот код никуда не помещается (теряется). После считывания кода программа опять проверяет содержимое буфера и так до тех пор, пока клавиатурный буфер не окажется пустым.

Для машин класса не ниже AT обработчик прерывания INT 16h выполняет и другие функции: установку задержки, запись символов в буфер клавиатуры, обслуживание расширенной клавиатуры.

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

Прерывание INT 13h предназначено для обслуживания жестких дисков и НГМД. Многочисленные функции прерывания INT 13h выполняют все операции записи и чтения данных. Мы сделаем обзор только самых важных функций.

Сброс дисковой системы (00h)

Эта функция выполняет установку в исходное состояние всей дисковой системы или выбранного дискового устройства. Используется обычно перед началом работы с устройством.

Определение состояния дисковой системы (01h)

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

Чтение/запись секторов диска (02h/03h)

С помощью этих функций выполняется чтение секторов диска в оперативную память компьютера или запись информации из памяти в секторы диска.

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

Проверка секторов (04h)

Функция проверяет содержимое секторов диска с использованием циклической контрольной суммы CRC (Cyclic Redundancy Check).

Другие функции прерывания INT 13h

Среди других функций прерывания INT 13h - форматирование дорожки, позиционирование головки на заданную дорожку диска, тестирование и предварительная установка диска, запуск диагностики контроллера и многое другое.

Вывод данных в параллельный порт

BIOS содержит простейшую систему обслуживания параллельного порта, состоящую из трех функций прерывания INT 17h. Это функции 01h (инициализация параллельного порта), 02h (опрос состояния параллельного порта) и 00h (вывод байта в параллельный порт).

Поскольку к персональному компьютеру можно подключить несколько параллельных портов, при обращении к принтеру следует указывать номер порта.

Обслуживание порта последовательной передачи данных

Функции прерывания INT 14h обслуживают порт последовательной передачи данных. С помощью этих функций можно задавать формат и скорость передачи данных, определять состояние портов и, конечно, выполнять передачу данных.

Работа с системными часами

Функции прерывания INT 1Ah обслуживают часы, которые есть в каждом компьютере. С помощью этих функций вы можете установить время и дату, опросить текущее состояние часов. Заметим, что часы реального времени имеются на машинах класса не ниже AT.

Пользуясь часами реального времени, можно установить на заданное время "будильник". После этого в нужный момент будет вызвано прерывание "будильника" с номером 4Ah. Обработчик прерывания INT 4Ah может подать звуковой сигнал или вывести на экран предупреждающее сообщение.

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

Вызов прикладной программой прерывания INT 19h приведет к перезагрузке операционной системы.

Системный сервис для машин класса AT

Прерывание INT 15h использовалось в компьютерах IBM PC и IBM PC Jr для управления кассетным накопителем на магнитной ленте (функции 0-3). Для машин класса AT и более высокого класса прерывание INT 15h имеет и другое назначение. С его помощью обслуживается расширенная клавиатура, выполняется программная задержка, задаваемая в микросекундах, обслуживается расширенная память.

Кроме того, одна из функций прерывания INT 15h переводит процессор в защищенный режим. Заметим, что вернуть процессор обратно в реальный режим можно только сигналом начального сброса. Это же относится и к арифметическому сопроцессору.

Сигнал начального сброса появляется не только тогда, когда пользователь нажимает кнопку сброса, расположенную на корпусе компьютера. Программа может выдать такой сигнал при помощи контроллера клавиатуры. Подробности вы можете узнать из 6 тома "Библиотеки системного программиста", который называется "Защищенный режим процессоров Intel 80286/80386/80486".

Функция C0h прерывания INT 15h выдает дополнительные сведения о конфигурации аппаратных средств компьютера.

На этом мы завершим описание функций, предоставляемых BIOS, и перейдем к обзору функций MS-DOS.

[Назад] [Содеожание] [Дальше]