- •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 3Ch — Создать файл
Ввод: АН = 3Ch
СХ = атрибут файла
DS:DX = адрес ASCIZ-строки с именем файла
Вывод: CF = 0 и АХ = идентификатор файла, если не произошла ошибка
CF = 1, если произошла ошибка, при этом АХ = код ошибки (03h, 04h или 05h)
Имена файлов при использовании функций DOS должны определяться в ASCIZ-формате, то есть представлять собой строку ASCII-символов, оканчивающуюся нулевым байтом (Zero). Имя может указываться полностью или частично, не включая текущий диск или путь к текущему каталогу. Пример описания имени файла в программе:
fname db 'C:\PROGRAM\TASM\HELLO.ASM', 0
При описании можно использовать также строчные символы. Две точки в начале имени могут указывать, что файл находится в родительском каталоге по отношении к текущему каталогу.
Каждому файлу на диске соответствуют определенные атрибуты — битовые признаки, придающие файлам определенные свойства. Несмотря на то, что при вызове функции атрибуты задаются в словном регистре СХ, используется лишь младший его байт в следующем формате:
-
n
a
d
v
s
h
r
( описаны установленные состояния битов)
бит 0: файл только для чтения (read only)
бит 1: скрытый файл (hidden)
бит 2: системный файл (system)
бит 3: метка тома (volume) (игнорируется функцией 3Ch)
бит 4: каталог (directory) (должен быть = 0 для функции 3Ch)
бит 5: архивный бит (archive) (1, если файл не архивировался)
бит 6: не используется
бит 7: файл можно открывать разным процессам в сетевой ОС Novell Netware
Разумеется, файл может иметь несколько атрибутов одновременно, хотя имеются недопустимые комбинации атрибутов (например, метка тома и каталог).
Если файл с указанным именем уже существует, функция 3Ch создает его повторно, присваивая ему нулевую длину. Чтобы этого не произошло, следует пользоваться функцией 5Bh.
Признаком безошибочной работы всех файловых функций DOS, использующих идентификаторы файлов, является сброшенный флаг CF. Если по окончании работы функции CF = 1, это свидетельствует о возникновении какой-либо ошибки. При этом в регистре АХ возвращается код ошибки. Коды ошибок стандартны для всех функций, их перечень приведен ниже в табл. 5.
Таблица 5. Коды и описания ошибок DOS
-
код
описание ошибки
код
описание ошибки
01h
Неверный номер функции
0Ah
Неверное окружение
02h
Файл не найден
0Bh
Неверный формат
03h
Путь не найден
0Ch
Неверный режим доступа
04h
Слишком много открытых файлов
0Dh
Неверная дата
05h
Доступ не разрешен
0Eh
(не используется)
06h
Неверный идентификатор
0Fh
Задан неверный диск
07h
Разрушены блоки управления памятью
10h
Нельзя удалить текущий каталог
08h
Недостаточно памяти
11h
Не то устройство
09h
Неверный адрес блока памяти
12h
Больше нет искомых файлов
Начиная с DOS версии 3 можно уточнить информацию об ошибке с помощью функции 59h.
В отличие от операции создания, операция открытия файла обеспечивает доступ к уже существующему файлу, причем доступ можно ограничивать.
Функция DOS 3Dh — Открыть существующий файл
Ввод: АН = 3Dh
AL = режим доступа
бит 0: открыть для чтения (0) или для записи (1)
бит 1: открыть для чтения и записи
биты 2-3: зарезервированы (0)
биты 6-4: режим доступа для других процессов
000: режим совместимости (остальные процессы также должны открывать этот файл в режиме совместимости)
001: все операции запрещены
010: запись запрещена
011: чтение запрещено
100: запрещений нет
бит 7: файл не наследуется порождаемыми процессами
DS:DX = адрес ASCIZ-строки с полным именем файла
CL = маска атрибутов файлов
Вывод: CF = 0 и АХ = идентификатор файла, если не произошла ошибка, иначе:
CF = 1 и АХ = код ошибки (02h, 03h, 04h, 05h или 0Ch)
Режим доступа к файлу регламентирует операции, выполняемые с открытым файлом. При работе в однозадачном однопользовательском режиме используются лишь младшие два бита байта атрибутов (то есть значения: 0 — чтение, 1 — запись, 2 — чтение и запись). Например, из файла, открытого в режиме доступа 0, можно только считывать данные, запись же в него будет блокироваться с кодом ошибки "Доступ не разрешен".
Если DOS функционирует в сетевой среде, то к одному и тому же файлу в произвольный момент времени могут пытаться обратиться несколько процессов. В соответствии с этим, начиная с DOS версии 3 список возможных режимов доступа значительно расширился (см. описание байта атрибутов выше).
Для предотвращения перезаписи существующего файла при создании файла с тем же именем вместо проверки существования файла можно использовать специальную функцию "Создать новый файл". В случае совпадения имен функция завершится с ошибкой 50h.
Функция DOS 5Bh — Создать новый файл
Ввод: АН = 5Bh
СХ = атрибут файла
DS:DX = адрес ASCIZ-строки с полным именем файла
Вывод: CF = 0 и АХ = идентификатор файла, открытого для чтения/записи в режиме совместимости, если не произошла ошибка; иначе:
CF = 1 и АХ = код ошибки (03h, 04h, 05h или 50h: файл уже существует)
В DOS имеется функция создания файла с произвольным уникальным именем, который можно использовать, например, для временного хранения данных.
Функция DOS 5Ah — Создать временный файл
Ввод: АН = 5Ah
СХ = атрибут файла
DS:DX = адрес ASCIZ-строки с путем, оканчивающимся символом «\», и тринадцатью нулевыми байтами в конце
Вывод: CF = 0 и АХ = идентификатор файла, открытого для чтения/записи в режиме совместимости, если не произошла ошибка (в строку по адресу DS:DX дописывается имя файла)
CF = 1 и АХ = код ошибки (03h, 04h или 05h)
Несмотря на то, что файл называется временным, DOS самостоятельно не удаляет его. Такой файл следует специально удалять, для чего его имя и записывается в строку по адресу DS:DX.
Для работы с длинными именами файлов (LFN) в DOS 7.0 (Windows 95) и старше используется еще один дополнительный набор функций, которые вызываются как подфункции функции DOS 71h.
Функция LFN 6Ch — Создать или открыть файл с длинным именем
Ввод: АХ = 716Ch
ВХ = режим доступа Windows 95
биты 2-0: режим доступа
000 — только для чтения
001 — только для записи
010 — для чтения и записи
100 — только для чтения, не изменять время последнего обращения к файлу
биты 6-4: доступ для других процессов (см. функцию 3Dh)
бит 7: файл не наследуется порождаемыми процессами
бит 8: данные не буферируются
бит 9: не архивировать файл, если используется архивирование файловой системы (DoubleSpace)
бит 10: использовать число в DI для записи в конец короткого имени файла
бит 13: не вызывать прерывание 24h при критических ошибках
бит 14: сбрасывать буфера на диск после каждой записи в файл
CX = атрибут файла
DX = действие
бит 0: открыть файл (ошибка, если файл существует)
бит 1: заменить файл (ошибка, если файл не существует)
бит 4: создать файл (ошибка, если файл существует)
DS:SI = адрес ASCIZ-строки с именем файла
DI = число, которое будет записано в конце короткого варианта имени файла
Вывод: CF = 0
АХ = идентификатор файла
CX = 1, если файл открыт
CX = 2, если файл создан
CX = 3, если файл заменен
CF = 1, если произошла ошибка
АХ = код ошибки (7100h, если функция не поддерживается)
Если функция открытия файлов возвращяет ошибку «слишком много открытых файлов» (AX = 4), следует увеличить число допустимых идентификаторов с помощью функции 67h) либо на этапе конфигурирования системы с помощью директивы FILES файла CONFIG.SYS.
Функция DOS 67h — Изменить максимальное число идентификаторов файлов
Ввод: AH = 67h
BX = новое максимальное число идентификаторов файлов (20 – 65535)
Вывод: CF = 0, если не произошла ошибка
CF = 1 и AX = код ошибки, если произошла ошибка (например, 04h, если заданное число меньше, чем количество уже открытых файлов, или 08h, если DOS не хватает памяти для новой таблицы идентификаторов)
Следует помнить, что все дочерние процессы будут наследовать только первые 20 идентификаторов и должны вызывать функцию 67h сами, если им требуется больше.