- •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
- •Литература
Управление файловой системой
Начиная с MS-DOS 2.0, файловая система организована в виде каталогов, которые могут содержать файлы и другие каталоги (подкаталоги), образуя иерархическое дерево каталогов. В течение всей работы DOS один из каталогов является текущим, путь к этому каталогу не обязательно указывать для находящихся в нем (относящихся к нему) файлов. Дерево "произрастает" из корневого каталога, единственного для одного раздела и обозначаемого как "имя_раздела:\" (например, С:\) или просто как "\".
Как уже отмечалось, на самом низком уровне каталог представляет собой файл с атрибутом "каталог" (бит 4 байта атрибутов установлен в 1), содержащий список имен вложенных файлов, их атрибутов и физических адресов на диске. Несмотря на это, многие общие функции работы с файлами (открытия, создания, удаления, чтения, записи и др.) не обрабатывают каталоги. Для создания и удаления каталогов предназначены специальные функции DOS, а непосредственное чтение и запись в каталог документированными средствами DOS произвести нельзя; эти операции DOS выполняет сама при необходимости.
Функция DOS 39h — Создать каталог
Ввод: АН = 39h
DS:DX = адрес ASCIZ-строки с путем (именем каталога), в котором все каталоги, кроме последнего, существуют. Для версии DOS 3.3 и более ранних длина всей строки не должна превышать 64 байта
Вывод: CF = 0, если каталог создан
CF = 1 и АХ = 3, если путь не найден, 5, если доступ запрещен
Функция LFN 39h — Создать каталог с длинным именем
Ввод: AX = 7139h
DS:DX = адрес ASCIZ-строки с путем (именем каталога)
Вывод: CF = 0, если каталог создан; иначе:
CF = 1 и АХ = код ошибки (7100h, если функция не поддерживается)
Функция DOS 3Ah — Удалить каталог
Ввод: АН = 3Ah
DS:DX = адрес ASCIZ-строки с путем, последний каталог в котором будет удален (только если он пустой, не является текущим, не занят командой SUBST)
Вывод: CF = 0, если каталог удален; иначе:
CF = 1 и АХ = код ошибки (3, 5 или 10h)
Функция LFN 3Ah — Удалить каталог с длинным именем
Ввод: АХ = 713Ah
DS:DX = адрес ASCIZ-строки с путем
Вывод: CF = 0, если каталог удален; иначе:
CF = 1 и АХ = код ошибки
Функция DOS 47h — Определить текущий каталог
Ввод: АН = 47h
DL = номер диска (00h — текущий, 0lh — А: и т. д.)
DS:SI = адрес 64-байтного буфера для текущего пути (ASCIZ-строки без имени диска, первого и последнего символа «\»)
Вывод: CF = 0 и АХ = 0100h, если операция выполнена
CF = 1 и АХ = 0Fh, если указан несуществующий диск
Функция LFN 47h — Определить текущий каталог с длинным именем
Ввод: АХ = 7147h
DL = номер диска
DS:SI = буфер для пути (ASCIZ-строки без имени диска, первого и последнего символа «\». Может содержать не только длинные имена — возвращается тот путь, который использовался при последней смене текущего каталога)
Вывод: CF = 0, если операция выполнена; иначе:
CF = 1 и АХ = код ошибки
Функция DOS 3Bh — Сменить текущий каталог
Ввод: АН = 3Bh
DS:DX = адрес 64-байтного ASCIZ-буфера с именем нового текущего каталога
Вывод: CF = 0, если каталог установлен как текущий; иначе:
CF = 1 и АХ = 3 (путь не найден)
Функция LFN 3Вh — Сменить каталог с длинным именем
Ввод: АХ = 713Bh
DS:DX = адрес ASCIZ-буфера с путем к новому текущему каталогу
Вывод: CF = 0, если каталог установлен как текущий; иначе:
CF = 1 и АХ = код ошибки
Перед работой с любыми функциями LFN следует один раз вызвать подфункцию A0h, чтобы определить размеры буферов для имен файлов и путей.
Функция LFN A0h — Получить информацию о разделе файловой системы VFAT
Ввод: АХ = 71A0h
DS:DX = адрес ASCIZ-строки с именем раздела и символом "\" (например, "С:\")
ES:DI = адрес буфера для имени файловой системы (FAT, NTFS, CDFS)
СХ = размер буфера по адресу ES:DI (обычно достаточно 32 байта)
Вывод: СХ = 0, АХ = 0000h или 0200h
ВХ = флаги файловой системы:
бит 0: функции поиска учитывают регистр символов
бит 1: регистр символов сохраняется для имен директорий
бит 2: используются символы Unicode
бит 14: поддерживаются функции LFN
бит 15: включено сжатие раздела (DoubleSpace)
СХ = максимальная длина имени файла (обычно 255)
DX = максимальная длина пути (полного имени файла) (обычно 260)
CF = 1 и АХ = код ошибки, если произошла ошибка (7100h, если функция не поддерживается)
Кроме того, для проверки, поддерживается ли некоторая функция LFN, при ее вызове можно установить CF в 1. При работе программы в среде DOS старых версий CF останется установленным, а в среде DOS новых версий (в случае отсутствия какой-либо другой ошибки) — обнулится.