- •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
- •Литература
1.9.Управление памятью
DOS, как и любая другая операционная система, имеет средства управления основной памятью компьютера. В состав основной памяти обычно входят оперативная память (RAM — память с произвольным доступом) и постоянная память (ROM — память только для чтения). Оперативная память предназначена для чтения/записи и хранения данных в процессе работы ЭВМ, в частности, для загрузки и хранения выполнимой програмы, а постоянная память — для долговременного хранения данных и чтения этих данных. Техническая реализация как оперативной, так и постоянной памяти может различаться. Многие из устройств расширения имеют собственную оперативную или постоянную память.
Процессор получает доступ ко всем видам оперативной и постоянной памяти с помощью адресной шины. Разрядность шины определяет величину адресного пространства компьютера, которое, в свою очередь, ограничивает объем используемой основной памяти. Процессор в реальном режиме работы использует для обращения к памяти 20-разрядную адресную шину (линии А0 – А19), что определяет максимальный объем используемой памяти, равный 220 = 1 048 576 байт = 1 Мб. Согласно спецификации IBM одна часть этого одномегабайтного пространства отводится для доступа к оперативной и постоянной памяти компьютера, а вторая часть — для видеопамяти, постоянной памяти компонентов компьютера и областей для специального использования (от 640 Кб до 1 Мб). Первая часть простанства располагается в диапазоне адресов от 0 до 640 Кб (не включительно); она получила название обычной или стандартной (conventional) памяти. Вторая часть в диапазоне адресов от 640 Кб до 1 Мб (не включительно) складывается из нескольких блоков, обеспечивающих доступ к различным видам памяти устройств и образующих т. н. верхние блоки памяти (UMB).
Обычная память
DOS использует обычную память для системных нужд, например, для загрузки программ для выполнения по команде пользователя, буферизации процессов ввода-вывода данных, хранения служебных таблиц, системных переменных и временных данных, а также может выделять память выполняющимся процессам по запросу. Выделение памяти производится участками произвольного размера, называемых блоками памяти. Размер блока задается в параграфах (по 16 байт). Каждому блоку памяти соответствует один блок управления памятью (MCB — Memory Control Block) — 16-байтовая структура, занимающий один параграф непосредственно перед соответствующим блоком памяти.
В DOS имеется 3 функции управления обычной памятью: выделение блока памяти, изменение размера блока памяти и освобождение блока памяти. Эти функции, так же, как и функции для работы с файлами, в случае ошибки устанавливают флаг CF и возвращают в АХ код ошибки (см. табл. 5).
Функция DOS 48h — Выделить память
Ввод: АН = 48h
ВХ = размер блока в 16-байтных параграфах
Вывод: CF = 0, если блок выделен, при этом:
АХ = сегментный адрес выделенного блока
CF = 1, если произошла ошибка, при этом АХ = код ошибки:
АХ = 7 — блоки управления памятью разрушены
АХ = 8 — недостаточно памяти, при этом:
ВХ = размер максимального доступного блока
Вызвав эту функцию со значением ВХ, равным FFFFh, можно определить размер самого большого доступного блока памяти (вернется в ВХ).
Если процесс запросил и получил память, он становится владельцем выделенного блока (адрес владельца блока хранится в MCB соответствущего блока).
Функция DOS 49h — Освободить память
Ввод: АН = 49h
ES = сегментный адрес освобождаемого блока
Вывод: CF = 0, если блок освобожден
CF = 1, АХ = код ошибки (7 или 9, если в ES содержится неверный адрес)
Процесс может освобождать только те блоки памяти, для которых он является владельцем.
Функция DOS 4Ah — Изменить размер блока памяти
Ввод: АН = 4Ah
ВХ = новый размер в 16-байтных параграфах
ES = сегментный адрес модифицируемого блока
Вывод: CF = 0, если размер блока изменен
CF = 1: AX = код ошибки (7, 8 или 9), причем при АХ = 8:
ВХ = максимальный размер, доступный для этого блока
Если для увеличения блока не хватило памяти, DOS увеличивает его до возможного предела, возвращая конечный размер в ВХ.
При запуске как СОМ-, так и ЕХЕ-программы загрузчик DOS выделяет этой программе самый большой доступный блок памяти. ЕХЕ-программа может организовывать в этом блоке сегменты и использовать память по своему усмотрению. DOS является однозадачной системой, поэтому выполняющаяся DOS-программа обычно «считает себя» единственным пользователем ресурсов компьютера, в том числе памяти, и использует функции управления памятью достаточно редко. Однако если после запуска программы предполагается функционирование каких-либо других программ, для них не окажется свободной памяти. В таких условиях запущенная программа должна сократить выделенный ей блок памяти до минимума, чтобы освободить память для работы других программ, а уже в дальнейшем запрашивать и освобождать память при необходимости.
В MS-DOS версии 5.0 и выше с помощью этих же трех функций можно управлять памятью в областях UMB. Однако для этого требуется сначала подключить области UMB к менеджеру памяти (например, EMM386) и изменить стратегию выделения памяти с помощью функции DOS 58h.