Мегаобучалка Главная | О нас | Обратная связь


ПОДРОБНОЕ ОПИСАНИЕ ВИДЕОСЕРВИСА



2015-11-27 537 Обсуждений (0)
ПОДРОБНОЕ ОПИСАНИЕ ВИДЕОСЕРВИСА 0.00 из 5.00 0 оценок




А. В. Рощин

 

 

ОСНОВЫ СИСТЕМНОГО ПРОГРАММИРОВАНИЯ

Часть 2

ИСПОЛЬЗОВАНИЕ РЕСУРСОВ MS-DOS

 

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

для студентов высших учебных заведений, обучающихся по специальности “Вычислительные машины, комплексы, системы и сети”

 

 

Москва 1999


 

АННОТАЦИЯ

 

Настоящее учебное пособие предназначено для подготовки студентов различных вычислительных специальностей, изучающих работу в среде MS-DOS. Для специальности 2201 эта работа может использоваться в курсах "Системное программное обеспечение", "Проектирование микропроцессорных систем", "Организация ввода-вывода".

В пособии рассмотрены основные функции DOS и BIOS, позволяющие использовать ресурсы ЭВМ в программах, написанных на ассемблере. Рассмотрены специфика и способы использования резидентных программ и драйверов MS-DOS.

 

 

Автор: проф., к.т.н. Рощин А.В.

 

Рецензент: проф., к.т.н. Зеленко Г.В.

 

Научный редактор: проф., д.т.н. Михайлов Б.М.

 

Работа рассмотрена и одобрена на заседании кафедры ИТ-4


 

ОГЛАВЛЕНИЕ

 

ГЛАВА 1. Функции DOS и BIOS 4

1.1. Функции BIOS 4

1.2. Подробное описание видеосервиса 5

1.3. Прочие функции BIOS 8

1.4. Функции DOS 10

1.5. Коды ошибок DOS 34

ГЛАВА 2. Примеры программ 38

2.1. Работа с экраном 38

2.2. Работа с дисками 55

ГЛАВА 3. Резидентные программы в MS-DOS 70

3.1. Специфика резидентных программ 71

3.2. Структура резидентной программы 73

3.3. Обращение к резидентной программе 75

3.4. Защита от повторной загрузки 76

3.5. Использование командной строки 77

3.6. Проверка флага активности DOS 78

3.7. Примеры резидентных программ 85

ГЛАВА 4. Драйверы устройств в среде MS-DOS 85

4.1. Введение в драйверы 85

4.2. Драйвер устройства DOS 86

4.3. Описание команд драйвера 88

4.4. Создание драйверов блочных устройств 90

4.5. Драйвер RAM-диска 94

4.6. Драйвер консоли 103

4.7. Заключительные замечания 108


ГЛАВА 1.

ФУНКЦИИ DOS И BIOS

 

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

 

ФУНКЦИИ BIOS

 

int 05h: Печать экрана

Прерывание int 5 используется в PC для вызова программы ROM BIOS, печатающей экран. Это прерывание вызывается обработчиком прерывания int 9 при распознавании клавиши PrtSc.

Оно может также вызываться из прикладной программы. Команда DOS "Graphics" заменяет эту программу своей, которая выдает графический экран (в точечном представлении) на IBM-совместимый графический принтер.

int 08h: Прерывание от таймера

Это аппаратно генерируемое прерывание (IRQ 0) вызывается по каждому тику часов реального времени PC. Часы тикают каждые 55мс, или около 18.2 раз в секунду. Подпрограмма обработки этого прерывания обновляет значение часов на 0:046 сек. Эта же подпрограмма выключает двигатели гибких дисков по истечении примерно двух секунд без операций ввода/вывода.

int 09h: Прерывание от клавиатуры

Это аппаратно генерируемое прерывание (IRQ 1) выполняется при каждом нажатии и отпускании клавиши. Подпрограмма BIOS интерпретирует это событие, сохраняя значения в буфере клавиатуры по адресу 0:041e. Она обрабатывает также специальные случаи клавиш PrtSc и SysReq, и отслеживает состояние клавиш Shift и различных Lock.

int 10H: Видео сервис

Ниже приведен перечень функций видеосервиса, предоставляемых подпрограммами BIOS. Номер функции определяется значением регистра ah при вызове int 10.


 

ah Функция
00h Установить видеорежим
01h Установить размер и форму курсора
02h Установить позицию курсора
03h Читать позицию курсора
04h Читать световое перо
05h Выбрать активную страницу дисплея
06h Скроллинг окна вверх (или очистка его)
07h Скроллинг окна вниз (или очистка его)
08h Читать символ/атрибут
09h Вывести символ/атрибут
0ah Вывести символ
0bh Выбрать палитру/цвет рамки
0ch Вывести графическую точку
0dh Читать графическую точку
0fh Вывести символ в режиме TTY
10h Читать видео режим
11h EGA установить палитру
12h EGA специальные функции
13h Писать строку (только AT + EGA)

 

ПОДРОБНОЕ ОПИСАНИЕ ВИДЕОСЕРВИСА

 

Здесь детализированы функции INT 10H стандартного видеосервиса ROM-BIOS.

AH = 00H Установка видеорежима.

Вход: AL = видеорежим

 

AL Тип Формат Цветов Адаптер Адрес
текст 40 х 25 16/8 CGA,EGA b800
текст 40 х 25 16/8 CGA,EGA b800
текст 80 х 25 16/8 CGA,EGA b800
текст 80 х 25 16/8 CGA,EGA b800
графика 320 х 200 CGA,EGA b800
графика 320 х 200 CGA,EGA b800
графика 640 х 200 CGA,EGA b800
текст 80 х 25 MA,EGA b000
0dh графика 320 х 200 EGA a000
0eh графика 640 х 200 EGA a000
0fh графика 640 х 350 EGA a000
10h графика 640 х 350 4/16 EGA a000
0bh,0ch (резервируется для EGA BIOS)

 


Замечание: для "EGA" и "Jr" можно добавить 80H к AL, чтобы инициализировать видео режим без очистки экрана.

AH = 01H Установка размера/формы курсора (текст). Курсор, если он видим, всегда мерцает.

Вход: CH = начальная строка (0-1fH; 20H=подавить курсор)

CL = конечная строка (0-1fH)

AH = 02H Установка позиции курсора. Установка на строку 25 делает курсор невидимым.

Вход: BH = видеостраница

DH,DL = строка, колонка (считая от 0)

AH = 03H читать позицию и размер курсора

Вход: BH = видеостраница

Выход: DH,DL = текущие строка, колонка курсора

CH,CL = текущие начальная, конечная строки курсора (см. функцию 01H)

AH = 05H выбрать активную страницу дисплея

Вход: AL = номер страницы (большинство программ использует нулевую страницу)

AH = 06H прокрутить окно вверх (или очистить). Прокрутка на 1 или более строк вверх.

Вход: CH,CL = строка, колонка верхнего левого угла окна (считая от 0)

DH,DL = строка, колонка нижнего правого угла окна (считая от 0)

AL = число пустых строк, вдвигаемых снизу (0 = очистить все окно)

BH = видео атрибут, используемый для пустых строк

AH = 07H прокрутить окно вниз (вдвинуть пустые строки в верхнюю часть окна)

Вход: (аналогично функции 06H)

AH = 08H читать символ/атрибут в текущей позиции курсора

Вход: BH = номер видеостраницы

Выход: AL = прочитанный символ

AH = прочитанный атрибут (только для текстовых режимов)

AH = 09H писать символ/атрибут в текущей позиции курсора

Вход: BH = номер видеостраницы

AL = записываемый символ

CX = счетчик (количество выводимых символов)

BL = атрибут (текст) или цвет (графика) (в графических режимах +80H означает XOR с символом на экране)


AH = 0aH писать символ в текущей позиции курсора

Вход: BH = номер видеостраницы

AL = записываемый символ

CX = счетчик (количество выводимых символов)

AH = 0bH выбрать цвет палитры/рамка (CGA-совместимые режимы)

Вход: BH = 0: (текст) выбрать цвет рамки

BL = цвет рамки (0-1fH; 10H - 1fH - интенсивные)

BH = 1: (графика) выбрать палитру

BL = 0: палитра green/red/brown

BL = 1: палитра cyan/magenta/white

AH = 0cH писать графическую точку (слишком медленно для большинства приложений!)

Вход: BH = номер видеостраницы

DX,CX = строка, колонка

AL = значение цвета (+80H означает XOR с точкой на экране)

AH = 0dH читать графическую точку (очень медленная функция!)

Вход: BH = номер видеостраницы

DX,CX = строка, колонка

Выход: AL = прочитанное значение цвета

AH = 0eH писать символ на активную страницу (в режиме телетайпа)

Вход: AL = записываемый символ (использует существующий атрибут)

BL = цвет переднего плана (для графических режимов)

AH = 0fH читать текущий видеорежим

Вход: нет

Выход: AL = текущий режим (см. функцию 00H)

AH = число текстовых колонок на экране

BH = текущий номер активной страницы дисплея

AH = 13H писать строку. Выдает строку в позиции курсора. Символы 0dH (Возврат каретки), 0aH (перевод строки), 08H (backspace) и 07H (гудок) трактуются как команды управления и не выводятся на экран.

Вход: ES:BP адрес строки вывода (специальный формат для AL=2 и AL=3)

CX = длина строки (подсчитываются только символы)

DH,DL = строка, колонка начала вывода

BH = номер страницы

AL = код подфункции:

0 = использовать атрибут в BL; не трогать курсор

1 = использовать атрибут в BL; курсор - в конец строки

2 = формат строки: char,attr, char,attr...; не трогать курсор

3 = формат строки: char,attr, char,attr...; передвинуть курсор

ПРОЧИЕ ФУНКЦИИ BIOS

 

int 13H: Дисковый ввод-вывод

Это программное прерывание предоставляет прямой доступ к дискетам и жесткому диску. Там, где это возможно, рекомендуется использовать программные прерывания int 25H и int 26H, чтобы предоставить драйверам устройств DOS выполнять всю низкоуровневую обработку. Разумеется, для таких операций, как форматирование диска или установка защиты от копирования, int 13H может оказаться единственной альтернативой. Ниже дано описание некоторых функций этого прерывания.

AH = 00H Сброс устройства. Выполняется полный сброс контроллера. Если значение DL равно 80H или 81H, выполняется сброс контроллера жесткого диска, иначе сбрасывается контроллер гибких дисков.

AH = 02H Читать секторы

Вход: DL = номер диска (0=диск A...; 80H = жесткий диск С, 81H = жесткий диск D и т.д.)

DH = номер головки чтения/записи

CH = номер дорожки (цилиндра)

CL = номер сектора

AL = число секторов (в сумме не больше чем один цилиндр)

ES:BX => адрес буфера вызывающей программы

0:0078 => таблица параметров гибкого диска

0:0104 => таблица параметров жесткого диска

Выход: Флаг переноса = 1 при ошибке и код ошибки в AH.

ES:BX буфер содержит данные, прочитанные с диска

Замечание: на сектор и цилиндр отводится соответственно 6 и 10 бит:

· биты 0 - 5 CX - номер сектора

· биты 6, 7 CX - старшие биты номера цилиндра

· биты 8 - 15 CX - младшие биты номера цилиндра

AH = 03H Писать секторы

Вход: (аналогично функции 02H)

ES:BX => данные, записываемые на диск.

Выход: Флаг переноса = 1 при ошибке и код ошибки в AH.

AH = 04H Проверить секторы. Проверяет контрольные суммы для указанных секторов.

Вход: (аналогично функции 02H. ES:BX также желательно указать)

Выход: Флаг переноса = 1 при ошибке и код ошибки в AH.

AH = 05H Форматировать дорожку. Данные на дорожке, если они есть, разрушаются.

Вход: DL,DH,CH = диск, головка, дорожка (см. функцию 02H)

ES:BX => дескрипторы секторов (необходим 512-байтовый буфер)

Выход: Флаг переноса = 1 при ошибке и код ошибки в AH.

AH = 17H установить тип дискеты (используется перед операцией форматирования)

Вход: DL = номер устройства диска (0 или 1)

AL = тип носителя диска:

· 0 = не используется

· 1 = 360K дискета в 360K устройстве

· 2 = 360K дискета в 1.2M устройстве

· 3 = 1.2M дискета в 1.2M устройстве

 

int 16H: Сервис клавиатуры

Это программное прерывание предоставляет интерфейс прикладного уровня с клавиатурой. Нажатия клавиш на самом деле обрабатываются асинхронно на заднем плане. Когда клавиша получена от клавиатуры, она обрабатывается прерыванием int 09H и помещается в циклическую очередь.

AH = 00H читать (ожидать) следующую нажатую клавишу

Выход: AL = ASCII символ (если AL=0, AH содержит Расширенный код ASCII )

AH = Сканкод или Расширенный код ASCII

AH = 01H Проверить готовность символа (и показать его, если он есть)

Выход: ZF = 1 если символ не готов.

ZF = 0 если символ готов.

AX = как для функции 00H (но символ здесь не удаляется из очереди).

AH = 02H Читать состояние shift-клавиш. Определить, какие shift-клавиши нажаты.

 

int 1cH: Пользовательское прерывание по таймеру

Это прерывание возникает по каждому тику аппаратных часов (каждые 55 миллисекунд; приблизительно 18.2 раз в секунду). Первоначально этот вектор указывает на IRET, но может быть изменен прикладной программой, чтобы адресовать фоновую программу пользователя, использующую прерывание по таймеру. Поскольку программа int 1cH выполняется во время низкоуровневого аппаратного прерывания, вы должны помнить, что система еще не сбросила контроллер прерываний и потому другие аппаратные прерывания, в том числе прерывание от клавиатуры, не будут происходить при работе INT 1cH (т.е. вы не сможете обработать ввод пользователя).

 

ФУНКЦИИ DOS

 

Функции DOS - это функции, выполняемые при вызове прерывания int 21h с обозначением функции в регистре AH и подфункции (если это необходимо) в регистре AL.

Функция 00h: Завершить программу

Вход AH = 00h

CS = сегмент PSP завершаемого процесса

Описание: Передает управление на вектор завершения в PSP (выходит в родительский процесс). Идентична функции int 20h Terminate. Регистр CS должен указывать на PSP. Восстанавливает векторы прерываний DOS 22h-24h (Завершение, Ctrl-Break и Критическая ошибка), устанавливая значения, сохраненные в родительском PSP. Выполняет сброс файловых буферов. Должны быть закрыты файлы с измененной длиной).

Замечание: Проще и корректнее использовать функцию 4ch Exit.

Функция 01h: Ввод с клавиатуры

Вход AH = 01h

Выход AL = символ, полученный из устройства стандартного ввода

Описание: Считывает (ожидает) символ со стандартного устройства ввода. Отображает этот символ на стандартное устройство вывода (эхо). При распознавании Ctrl-Break выполняется int 23h.

Замечание: Ввод расширенных клавиш ASCII (F1-F12, PgUp, курсор и т. п.) требует двух обращений к этой функции. Первый вызов возвращает AL = 0. Второй вызов возвращает в AL расширенный код ASCII.

Функция 02h: Вывод на дисплей

Вход AH = 02h

DL = символ, выводимый на устройство стандартного вывода

Описание: Посылает символ из DL на устройство стандартного вывода. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции. При обнаружении Ctrl-Break выполняется int 23h.


Функция 06h: Консольный ввод/вывод

Вход AH = 06h

DL = символ (от 0 до 0feh), посылаемый на устройство стандартного вывода, DL = 0ffh запрос ввода с устройства стандартного ввода

Выход При запросе ввода (т.е. при DL=0ffh):

ZF сброшен (NZ), если символ готов

AL = Считанный символ, если ZF сброшен

Описание: При DL = 0ffh выполняет ввод с консоли "без ожидания", возвращая взведенный флаг нуля (ZF), если на консоли нет готового символа. Если символ готов, сбрасывает флаг ZF (NZ) и возвращает считанный символ в AL. Если DL не равен 0ffh, то DL направляется на стандартный вывод.

Замечание: Не проверяет Ctrl-Break. Для расширенного ASCII функцию следует вызывать дважды.

Функция 07h: Нефильтрованный консольный ввод без эха

Вход AH = 07h

Выход AL = символ, полученный из устройства стандартного ввода

Описание: Считывает (ожидает) символ из стандартного устройства ввода и возвращает этот символ в AL. Не фильтрует, т.е. не проверяет на Ctrl-Break, backspace и т. п.

Замечания: Вызывайте дважды для ввода расширенного символа ASCII. Используйте функцию 0bh для проверки статуса (если не хотите ожидать нажатия клавиши).



2015-11-27 537 Обсуждений (0)
ПОДРОБНОЕ ОПИСАНИЕ ВИДЕОСЕРВИСА 0.00 из 5.00 0 оценок









Обсуждение в статье: ПОДРОБНОЕ ОПИСАНИЕ ВИДЕОСЕРВИСА

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...



©2015-2020 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (537)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.011 сек.)