- •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
- •Литература
Интерфейс ems
Способ формирования адресов памяти в реальном режиме процессора ограничивает используемое адресное пространство величиной в 1 Мб (адреса от 0 до FFFFFh). Использование памяти большего объема представляет определенную сложность даже на компьютерах с расширенной адресной шиной, так как DOS, являясь системой реального режима, не предоставляет для этого базовых сервисных средств. Впрочем, начиная с версии 4, в DOS включена поддержка спецификации так называемой дополнительной памяти — EMS (Expanded Memory Specification), дополняющей обычную память. В компьютерах на базе процессора 8086 (PC, XT) модули дополнительной памяти изначально устанавливались на специальной плате расширения компьютера, а в последующих компьютерах стало возможным использовать для организации дополнительной памяти обычные модули памяти на материнской плате.
Доступ к дополнительной памяти осуществляется с помощью страничного преобразования, выполняемого драйвером EMS. В соответствии с этим преобразованием в области верхних адресов памяти (UMA), начинающийся обычно с адреса D0000h, резервируется область размером 64 Кб (сегмент), называемая окном EMS. В окне размещены 4 страницы памяти размером 16 Кб, на которые в дальнейшем отображаются фрагменты дополнительной памяти (также размером по 16 Кб). Если часть памяти обработана, и требуется доступ к новому участку дополнительной памяти, программа вызывает функцию отображения, и драйвер EMS выполняет новое отображение требуемого участка на те же адреса UMA.
Из программы обращение к дополнительной памяти выполняется при помощи функций EMS, вызываемых через прерывание 67h. Вызывать функции EMS можно, только если в системе присутствует драйвер с именем ЕММХХХХ0 (EMS Manager). По умолчанию драйвер в большинстве случаев не загружается автоматически — его необходимо устанавливать вручную. Для проверки присутствия драйвера в памяти можно, например, попытаться открыть с помощью функции 3Dh файл/устройство с именем ЕММХХХХ0. Если операция выполнилась успешно и в текущем каталоге нет файла с таким же именем именем, то драйвер EMS наверняка присутствует в системе (для более точного определения можно воспользоваться функцией 44h DOS управления устройствами ввода-вывода (IOCTL) и получить с ее помощью статус открытого устройства).
Основные функции EMS:
INT 67h, АН = 46h — Получить номер версии
Ввод: АН = 46h
Вывод: АН = 0 и AL = номер версии в упакованном BCD-коде (40h для 4.0) Во всех случаях, если АН не ноль, произошла ошибка
INT 67h, АН = 41h — Получить сегментный адрес окна
Ввод: АН = 41h
Вывод: АН = 0 и ВХ = сегментный адрес окна
INT 67h, АН = 42h — Получить объем памяти
Ввод: АН = 42h
Вывод: АН = 0
DX = объем EMS-памяти в 16-килобайтных страницах
ВХ = объем свободной EMS-памяти в 16-килобайтных страницах
INT 67h, АН = 43h — Выделить идентификатор и EMS-память
Ввод: АН = 43h
ВХ = требуемое число 16-килобайтных страниц
Вывод: АН = 0, DX = идентификатор
Теперь указанный в этой функции набор страниц в EMS-памяти описывается как занятый и другие программы не смогут выделить его для себя.
INT 67h, АН = 44h — Отобразить память
Ввод: АН = 44h
AL = номер 16-килобайтной страницы в 64-килобайтном окне EMS (0 ‑ 3)
ВХ = номер 16-килобайтной страницы в EMS-памяти
DX = идентификатор
Вывод: АН = 0
Теперь запись/чтение в указанную страницу в реальном адресном пространстве приведет к записи/чтению в указанную страницу в EMS-памяти.
INT 67h, АН = 45h — Освободить идентификатор и EMS-память
Ввод: АН = 45h
DX = идентификатор
Вывод: АН = 0