- •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
- •Литература
Область памяти umв
Участок адресного пространства процессора по адресам A0000h – FFFFFh носит наименование UMA (Upper Memore Area — верхняя область памяти). Как говорилось выше, на этот участок пространства отображаются видеопамять и постоянная память материнской платы и некоторых устройств, а часть его зарезервирована и не используется. С помощью менеджера памяти на неиспользуемые участки UMА можно отображать реальную оперативную память компьютера и создавать таким образом верхние блоки памяти (UMB — Upper Memory Blocks), которые затем могут использовать DOS-программы. (Отображение памяти на адресный участок означает, по сути, установление соответствия определенных аппаратных ячеек оперативной памяти с некоторыми адресами адресного пространства процессора).
Использование областей памяти UMB целесообразно для резидентных программ, постоянно находящихся в памяти, так как обычная память используется другими процессами более активно.
Функция DOS 58h — Считать/изменить стратегию выделения памяти
Ввод: АН = 58h
AL = 00h — считать стратегию
AL = 01h — изменить стратегию
ВХ = новая стратегия
биты 2-0: 00 — первый подходящий блок; 01 — наиболее подходящий блок; 11 — последний подходящий блок
биты 4-3: 00 — обычная память; 01 — UMB (DOS 5.0+); 10 — UMB, затем обычная память (DOS 5.0+)
AL = 02h — считать состояние UMB
AL = 03h — установить состояние UMB
ВХ = новое состояние: 00 — блоки UMB не используются, 01 — используются
Вывод: CF = 0, АХ = текущая стратегия для AL = 0, состояние UMB для AL = 2
CF = 1, AX = 01h, если функция не поддерживается (если не запущен менеджер памяти или нет строки "DOS = UMB" в файле CONFIG.SYS)
Если программа изменяла стратегию выделения памяти или состояние UMB, она обязательно должна их восстановить перед окончанием работы.
Область памяти нма
HMA представляет собой область памяти по адресам от FFFFh:0010h (конец первого мегабайта адресного простанства) до FFFFh:FFFFh (конец адресного пространства в реальном режиме) размером 65520 байт. Эта область может использоваться на компьютерах, оснащенных процессором 80286 или более поздним, так как они имеют расширенную адресную шину (линии А20 и выше). Доступ к области НМА осуществляется с помощью спецификации XMS, причем вся она выделяется целиком одной программе. Если при загрузке системы в память был загружен драйвер HIMEM.SYS и в файле CONFIG.SYS присутствует строка DOS = HIGH, область НМА занимает DOS, освобождая почти 64 Кб в основной памяти. При этом DOS может оставить небольшой участок НМА (16 Кб или меньше) для пользовательских программ, которые могут обращаться к нему с помощью недокументированной функции 4Ah мультиплексного прерывания 2Fh.
INТ 2Fh, AX = 4A01h — Определить размер доступной части НМА (DOS 5.0+)
Ввод: АХ = 4A01h
Вывод: ВХ = размер доступной части НМА в байтах, 0000h, если DOS нe в НМА
ES:DI = адрес начала доступной части НМА (FFFFh:FFFFh, если DOS не в НМА)
INT 2Fh, AX = 4A02h — Выделить часть НМА (DOS 5.0+)
Ввод: АХ = 4A02h
ВХ = размер в байтах
Вывод: ES:DI = адрес начала выделенного блока
ВХ = размер выделенного блока в байтах
В версиях DOS 5.0 и 6.0 нет функций освобождения выделенных таким образом блоков НМА. В DOS 7.0 (Windows 95) выделение памяти НМА было организовано аналогично выделению памяти в обычной памяти и UMB, с функциями изменения размера и освобождения блока.
INT 2Fh, АХ = 4A03h — Управление распределением памяти в НМА (DOS 7.0+)
Ввод: АХ = 4A03h
DL = 0 — выделить блок (ВХ = размер в байтах)
DL = 1 — изменить размер блока (ES:DI = адрес, ВХ = размер)
DL = 2 — освободить блок (ES:DI = адрес)
СХ = сегментный адрес владельца блока
Вывод: DI = FFFFh, если не хватило памяти,
ES:DI = адрес блока (при выделении)
Следует помнить, что область НМА доступна для программ только в том случае, если адресная линия процессора А20 разблокирована. Если DOS не занимает НМА, она почти всегда заблокирована для совместимости с программами, написанными для процессора 8086/8088, которые считают, что адреса FFFFh:0010h — FFFFh:FFFFh всегда совпадают с 0000h:0000h – 0000h:FFEFh. Возможность управления состоянием этой адресной линии предоставляют функции XMS 01-07.