- •Глава 3. Директивы и операторы ассемблера
- •3.1. Структура программы
- •3.2. Директивы распределения памяти
- •3.2.1. Псевдокоманды определения переменных
- •3.2. Директивы распределения памяти
- •3.2.1. Псевдокоманды определения переменных
- •3.2.2. Структуры
- •3.3. Организация программы
- •3.3.1. Сегменты
- •3.2. Директивы распределения памяти
- •3.2.1. Псевдокоманды определения переменных
- •3.2.2. Структуры
- •3.3. Организация программы
- •3.3.1. Сегменты
- •3.3.2. Модели памяти и упрощенные директивы определения сегментов
- •3.3.3. Порядок загрузки сегментов
- •3.3.4. Процедуры
- •3.3.5. Конец программы
- •3.3.6. Директивы задания набора допустимых команд
- •3.3.7. Директивы управления программным счетчиком
- •3.3.8. Глобальные объявления
- •3.3.9. Условное ассемблирование
- •3.4. Выражения
- •3.5. Макроопределения
- •3.6. Другие директивы
- •3.6.1. Управление файлами
- •4. Основы программирования для ms-dos
- •4.1. Программа типа сом
- •4.2. Программа типа ехе
- •4.3. Вывод на экран в текстовом режиме
- •4.3.1. Средства dos
- •4.4. Ввод с клавиатуры
- •4.4.1. Средства dos
- •4.5. Графические видеорежимы
- •4.5.1. Работа с vga-режимами
- •4.6. Работа с мышью
- •4.7. Другие устройства
- •4.7.1. Системный таймер
- •4.8. Работа с файлами
- •4.9. Управление памятью
- •4.9.1. Обычная память
- •4.10. Загрузка и выполнение программ
- •4.11. Командные параметры и переменные среды
4.8. Работа с файлами
Возможно, основная функция DOS как операционной системы — организация доступа к дискам как к набору файлов и каталогов. DOS поддерживает только один тип файловой системы — FAT и, начиная с версии 7.0 (Windows 95), его модификацию VFAT с длинными именами файлов. Первоначальный набор функций для работы с файлами, предложенный в MS-DOS 1.0, оказался очень неудобным: каждый открытый файл описывался 37-байтной структурой FCB (блок управления файлом), адрес которой требовался для всех файловых операций, а передача данных осуществлялась через структуру данных DTA (область передачи данных). Уже в MS-DOS 2.0, вместе с усовершенствованием FAT (например, появлением вложенных каталогов), появился набор UNIX-подобных функций работы с файлами, использующих для описания файла всего одно 16-битное число, идентификатор файла или устройства. Все остальные функции работы с файлами используют затем только это число. Первые пять идентификаторов инициализируются системой следующим образом:
0: STDIN — стандартное устройство ввода (обычно клавиатура),
1: STDOUT — стандартное устройство вывода (обычно экран),
2: STDERR — устройство вывода сообщений об ошибках (всегда экран),
3: AUX — последовательный порт (обычно СОМ1),
4: PRN — параллельный порт (обычно LPT1),
так что функции чтения/записи (а также сброс буферов на диск) файлов можно точно так же применять и к устройствам.
4.9. Управление памятью
4.9.1. Обычная память
До сих пор, если требовалось создать массив данных в памяти, мы просто обращались к памяти за концом программы, считая, что там есть еще хотя бы 64 килобайта свободной памяти. Разумеется, как и во всех операционных системах, в DOS есть средства управления распределением памяти — выделение блока (аналог стандартной функции языка С malloc), изменение его размеров (аналог realloc) и освобождение (free).
Функция DOS 48h— Выделить память
Ввод: |
АН = 48h ВХ = размер блока в 16-байтных параграфах |
Вывод: |
CF = 0, если блок выделен АХ = сегментный адрес выделенного блока CF = 1, если произошла ошибка: АХ = 7 — блоки управления памятью разрушены АХ = 8 — недостаточно памяти: ВХ = размер максимального доступного блока |
Эта функция с большим значением в ВХ (обычно FFFFh) используется для определения размера самого большого доступного блока памяти.
Функция DOS 49h— Освободить память
Ввод: |
АН = 49h ES = сегментный адрес освобождаемого блока |
Вывод: |
CF = 0, если блок освобожден CF = 1: АХ = 7, если блоки управления памятью разрушены, АХ = 9, если в ES содержится неверный адрес |
Эта функция не позволит освободить блок памяти, которым текущая программа не владеет, но с помощью функции DOS 50h (AX = 50h, ВХ = сегментный адрес PSP процесса) программа может «притвориться» любым другим процессом.
Функция DOS 4Ah— Изменить размер блока памяти
Ввод: |
АН = 4Ah ВХ = новый размер в 16-байтных параграфах ES = сегментный адрес модифицируемого блока |
Вывод: |
CF = 0, если размер блока изменен CF = 1: АХ = 7, если блоки управления памятью разрушены, АХ = 8, если не хватает памяти (при увеличении), АХ = 9, если ES содержит неверный адрес ВХ = максимальный размер, доступный для этого блока |
Если для увеличения блока не хватило памяти, DOS увеличивает его до возможного предела.
При запуске СОМ-программы загрузчик DOS выделяет самый большой доступный блок памяти для этой программы, так что при работе с основной памятью эти функции требуются редко (в основном для того, чтобы сократить выделенный программе блок памяти до минимума перед загрузкой другой программы), но уже в MS-DOS 5.0 и далее с помощью этих же функций можно выделять память в областях UMB — неиспользуемых участках памяти выше 640 Кб и ниже 1 Мб, для этого требуется сначала подключить UMB к менеджеру памяти и изменить стратегию выделения памяти с помощью функции DOS 58h.