- •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
- •Литература
Поиск файлов
Поиск группы файлов, имена которых удовлетворяют определенному шаблону, выполняется в два этапа, в случае поиска файлов с короткими именами, и в три — в случае поиска файлов с длинными именами.
На первом этапе используется функция "Найти первый файл", при этом указывается шаблон, который может содержать путь к обрабатываемому каталогу и шаблонные символы "*" (последовательность допустимых символов произвольной длины) и "?" (любой допустимый символ в данной позиции). Как и ранее, если путь не указан, подразумевается текущий каталог.
Функция DOS 4Eh — Найти первый файл (с коротким именем)
Ввод: АН = 4Eh
AL используется при обращении к функции APPEND
СХ = атрибуты, которые должен иметь файл (биты 0 (только для чтения) и 5 (архивный бит) игнорируются, если бит 3 (метка тома) установлен, все остальные биты игнорируются)
DS:DX = адрес ASCIZ-строки с именем файла, которое может включать путь и шаблонные символы для поиска (символы «*» и «?»)
Вывод: CF = 0 и область DTA заполняется данными, если файл найден; иначе:
CF = 1 и АХ = код ошибки (02h, 03h или 12h (0Сh?))
Если файл не найден, устанавливается флаг CF, а в АХ возвращается код 2, иначе информация о найденном файле записывается в область передачи данных (DTA).
Наряду со служебной информацией, обеспечивающей возможность поиска очередного файла, в DTA записываются сведения об атрибутах, дате и времени модификации, размере найденного файла, а также имя файла (без пути) в формате ASCIIZ. Если длина имени с расширением составляет менее 12 байт, остаток поля заполняется нулями.
По умолчанию область DTA располагается в префиксе программного сегмента (PSP) выполняющейся программы по смещению 80h. Так как при запуске EXE-программы операционная система помещает адрес PSP в сегментные регистры DS и ES, доступ к области DTA удобно производить с помощью регистра ES (DS обычно используется для обращения к сегменту данных). Таким образом, запись ES:[0] укажет на первый байт PSP, а ES:[80h] — на первый байт DTA.
Область DTA может быть переопределена с помощью функции DOS lAh.
Функция DOS 1Ah — Установить область DTA
Ввод: АН = 1Ah
DS:DX = адрес начала DTA (128-байтный буфер)
Функции поиска файлов заполняют DTA следующим образом:
+00h: байт — биты 0-6: ASCII-код буквы диска; бит 7: диск сетевой
+01h: 11 байт — маска поиска (без пути)
+0Ch: байт — атрибуты для поиска
+0Dh: слово — порядковый номер файла в директории
+0Fh: слово — номер кластера начала внешней директории
+11h: 4 байта — зарезервировано
+15h: байт — атрибут найденного файла
+16h: слово — время создания файла в формате DOS:
биты 15-11: час (0 - 23)
биты 10-5: минута
биты 4-0: номер секунды, деленный на 2 (0 - 30)
+18h: слово — дата создания файла в формате DOS:
биты 15-9: год, начиная с 1980
биты 8-5: месяц
биты 4-0: день
+1Ah: 4 байта — размер файла
+1Eh: 13 байт — ASCIZ-имя найденного файла с расширением
На втором этапе поиска вызывается функция "Найти следующий файл", которая использует информацию из DTA после предыдущего поиска. Эта функция при каждом новом вызове находит следующий файл, удовлетворяющий первоначальному шаблону. Файлы находятся в порядке их следования в записи каталога. Подкаталоги не обрабатываются. Для поиска всех файлов, удовлетворяющих указанному ранее шаблону, следует вызывать функцию 4Fh, пока не будет возвращена ошибка с кодом 2 (в неответственных случаях код ошибки можно не проверять).
Функция DOS 4Fh — Найти следующий файл
Ввод: АН = 4Fh
DTA — содержит данные от предыдущего вызова функции 4Еh или 4Fh
Вывод: CF = 0 и DTA содержит данные о следующем найденном файле, если не произошла ошибка; иначе:
CF = 1 и АХ = код ошибки
Для случая длинных имен файлов (LFN) употребляется набор из трех подфункций функции DOS 71h, которые можно использовать, только если активна подсистема IFSmgr Windows (всегда активна при нормальной работе Windows). Это функции "Найти первый файл", "Найти следующий файл" и "Закончить поиск файла". Последняя функция используется для освобождения системных ресурсов Windows, которые были заняты в результате выполнения поиска.
Функция LFN 4Eh — Найти первый файл с длинным именем
Ввод: АХ = 714Eh
CL = атрибуты, которые файл может иметь (биты 0 и 5 игнорируются)
СН — атрибуты, которые файл должен иметь
SI = 0: использовать Windows-формат даты/времени
SI = 1: использовать DOS-формат даты/времени
DS:DX = адрес ASCIZ-строки с шаблоном для поиска (может включать «*» и «?»)
ES:DI = адрес 318-байтного буфера для информации о файле
Вывод: CF = 0
АХ = поисковый идентификатор
СХ = Unicode-флаг
бит 0: длинное имя содержит подчеркивания вместо непреобразуемых Unicode-символов
бит 1: короткое имя содержит подчеркивания вместо непреобразуемых Unicode-символов
CF = 1, АХ = код ошибки, если произошла ошибка (7100h -функция не поддерживается)
Длинные имена файлов, в отличие от коротких имен, не обязаны включать в себя точку, разделяющую имя и расширение файла. Поэтому для совместимости с функцией 4Fh данная функция при указании шаблона «*.*» ищет все файлы в каталоге, а не только файлы с точкой в имени. Если файл, удовлетворяющий указанному шаблону и атрибутам поиска, найден, область данных по адресу ES:DI заполняется следующим образом:
+00h: 4 байта — атрибуты файла
биты 0-6: атрибуты файла DOS
бит 8: временный файл
+04h: 8 байт — время создания файла
+0Ch: 8 байт — время последнего доступа к файлу
+14h: 8 байт — время последней модификации файла
+lCh: 4 байта — старшее двойное слово длины файла
+20h: 4 байта — младшее двойное слово длины файла
+24h: 8 байт — зарезервировано
+2Сh: 260 байт — ASCIZ-имя файла длинное
+130h: 14 байт — ASCIZ-имя файла короткое
Причем даты создания/доступа/модификации записываются в одном из двух форматов, в соответствии со значением SI при вызове функции. Windows-формат — 64-битное число 100-наносекундных интервалов с 1 января 1601 года, а если используется DOS-формат — в старшее двойное слово записывается DOS-дата, а в младшее — DOS-время (см. описание струтуры данных, возвращаемых функциями 4Еh и 4Fh).
Функция LFN 4Fh — Найти следующий файл
Ввод: АХ = 714Fh
ВХ = поисковый идентификатор (от функции 4Eh)
SI = формат даты/времени
ES:DI = адрес буфера для информации о файле
Вывод: CF = 0 и СХ = Unicode-флаг, если следующий файл найден
CF = 1, AX = код ошибки, если произошла ошибка (7100h — функция не поддерживается)
Функция LFN A1h — Закончить поиск файла
Ввод: AX = 71Alh
ВХ = поисковый идентификатор
Вывод: CF = 0, если операция выполнена
CF = 1 и АХ = код ошибки, если произошла ошибка (7100h — функция не поддерживается)