- •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
- •Литература
Интерфейс xms
Спецификация доступа к расширенной памяти (XMS — eXtended Memory Specification) — еще один механизм, позволяющий программам, запускающимся под управлением DOS в реальном режиме (или в режиме V86), использовать память, расположенную выше границы первого мегабайта.
С появлением 80286 появилась возможность устанавливать больше одного мегабайта памяти на одной материнской плате, и для работы с этой памятью была введена новая спецификация — XMS. Тогда же появились менеджеры памяти, эмулировавшие EMS поверх XMS, для совместимости со старыми программами, причем работа через EMS оказывалась значительно медленнее. Позже, когда в процессорах Intel появился механизм страничной адресации, оказалось, что теперь уже EMS можно реализовать значительно быстрее XMS. Тем не менее стандарт EMS со временем стал использоваться все реже. Некоторые же DOS-программы, которым требуется дополнительная память, поддерживают обе спецификации.
Для доступа к расширенной памяти в соответствии со стандартом XMS необходим XMS-драйвер (например, HIMEM.SYS), предоставляющий набор сервисных функций. В отличие от обычного способа вызова командой INT, эти функции вызываются с помощью команды CALL по определенному дальнему адресу, который является точкой входа XMS-сервисов. Точку входа необходимо получить с помощью функции 43h мультиплексного прерывания 2Fh:
INT 2Fh, AH=43h — XMS- и DPMS-сервисы
Ввод: AX = 4300h: проверить наличие XMS
Вывод: АН = 80h, если HIMEM.SYS или совместимый драйвер загружен
Ввод: АХ = 4310h: получить точку входа XMS
Вывод: ES:BX = дальний адрес точки входа XMS
Функция XMS 00h — Определить номер версии
Ввод: АН = 00h
Вывод: AX = номер версии в неупакованном BCD-коде (0300h для 3.0)
BХ = внутренний номер модификации
DX = 1, если область НМА существует, 0, если нет
Функция XMS 08h — Определить объем памяти
Ввод: АН = 08h
BL = 00h
Вывод: АХ = размер максимального доступного блока в килобайтах
DX = размер XMS-памяти всего в килобайтах
BL = код ошибки (A0h, если вся XMS-память занята, 00, если нет ошибок)
Так как возвращаемый размер памяти оказывается ограниченным размером слова (65 535 Кб), начиная с версии XMS 3.0, введена более точная функция 88h.
Функция XMS 88h — Определить объем памяти
Ввод: АН = 88h
Вывод: ЕАХ = размер максимального доступного блока в килобайтах
BL = код ошибки (A0h, если вся XMS-память занята, 00, если нет ошибок)
ЕСХ = физический адрес последнего байта памяти (верный для ошибки А0)
EDX = размер XMS-памяти всего в килобайтах (0 для ошибки А0)
Функция XMS 09h — Выделить память
Ввод: АН = 09h
DX = размер запрашиваемого блока (в килобайтах)
Вывод: АХ = 1, если функция выполнена
ВХ = идентификатор блока
АХ =0: BL = код ошибки (A0h, если не хватило памяти)
Функция XMS 0Ah — Освободить память
Ввод: АН = 0Ah
DX = идентификатор блока
Вывод: AX = 1, если функция выполнена
Иначе — АХ = 0 и BL = код ошибки (A2h — неправильный идентификатор, ABh — участок заблокирован)
Функция XMS 0Bh — Пересылка данных
Ввод: АН = 0Bh
DS:SI = адрес структуры для пересылки памяти
Вывод: АХ = 1, если функция выполнена
Иначе — АХ = 0 и BL = код ошибки
Структура данных, адрес которой передается в DS:SI:
+00h: 4 байта — число байт для пересылки
+04h: слово — идентификатор источника (0 для обычной памяти)
+06h: 4 байта — смещение в блоке-источнике или адрес в памяти
+0Ah: слово — идентификатор приемника (0 для обычной памяти)
+0Ch: 4 байта — смещение в блоке-приемнике или адрес в памяти
Адреса в обычной памяти записываются в соответствующие двойные слова в обычном виде — сегмент:смещение. Копирование происходит быстрее, если данные выровнены на границы слова или двойного слова; если области данных перекрываются, адрес начала источника должен быть меньше адреса начала приемника.
Функция XMS 0Fh — Изменить размер XMS-блока
Ввод: АН = 0Fh
ВХ = новый размер
DX = идентификатор блока
Вывод: АХ = 1, если функция выполнена
Иначе — АХ = 0 и BL = код ошибки
Кроме того, XMS позволяет программам использовать область НМА и блоки UMB, если они не заняты DOS при запуске (в CONFIG.SYS отсутствуют строки DOS = HIGH или DOS = UMB).