Dos fn 11h найти 1 й совпадающий файл через fcb

Содержание

Вопрос 78. Файловая система MS DOS, функции с использованием FCB и дескриптора

Прежде чем рассмотреть структуру томов в ОС DOS, необходимо пояснить ряд понятий, описывающих структуру диска на физическом уровне.

o Ряд концентрических колец, называемых дорожками;

o Дорожки делятся радиально на сектора;

o Диск состоящий из нескольких пластин и все дорожки расположенные на одинаковом расстоянии от центра называются цилиндром.

Дисковый том в MS DOS

Все типы дисков используют размер сектора 512 байт в MS DOS.

Группы цилиндров могут относиться к различным операционным системам. Программа DOS FDISK может разбивать фиксированный диск на несколько разделов (до четырех) разного размера.

Дисковые сектора определяются магнитной информацией, которую записывает утилита форматизации диска. Информация включает идентификационный номер каждого сектора. BIOS нумерует сектора 1-8, 1-9 или 1-15, в зависимости от емкости диска. Дорожки не маркируются, вместо этого они определяются механически по смещению головки чтения/записи от внешнего края диска. Дорожки нумеруются от 0 до 39 для дискет диаметром 5 1/4 дюйма, а для дисков большей емкости их может быть больше. Дисковые функции BIOS обращаются к определенному сектору, указывая номера дорожки и сектора. Однако функции DOS рассматривают все сектора диска, как одну цепь, которая нумеруется подряд, начиная от 0, поэтому каждый сектор имеет свой логический номер сектора.

Для дискет первый сектор (дорожка 0, сектор 1) содержит запись начальной загрузки, которая является небольшой программой, позволяющей компьютеру считать с дискового накопителя остальные части MS DOS. Затем идут две копии таблицы размещения файлов, которые содержат информацию о распределении дискового пространства (вторая копия хранится из соображений безопасности). Затем идет корневой каталог, который содержит список файлов и ссылок на подкаталоги, а также указывает в каком месте диска они начинаются.

Hаконец, далее идут две небольшие программы DOS IBMBIO.COM и IBMDOS.COM, которые считываются при старте и обеспечивают компьютер возможностями необходимыми для нахождения и загрузки файла COMMAND.COM.

Фиксированные диски имеют главную запись загрузки, которая содержит таблицу разделов, позволяющую разделить диск между несколькими операционными системами. Таблица разделов содержит информацию о том, где на диске начинается раздел DOS, а также первый сектор какого раздела содержит запись начальной загрузки. В остальном, раздел организован так же, как и дискета.

Файловая система

Диск использует таблицу размещения файлов (FAT) для отведения дискового пространства файлам и хранения информации о свободных секторах. Из соображений безопасности на всех дисках хранятся две копии FAT. Они хранятся последовательно, в секторах с самыми младшими доступными логическими номерами, начиная со стороны 0, дорожки 0, сектора 2 (сектор 1 также занят записью начальной загрузки). Число секторов, занимаемых FAT определяется размером и типом диска

Таблица размещения файлов хранит информацию о каждом кластере секторов на диске. Kластер это группа стандартных секторов размером 512 байт (независимо от типа диска MS DOS всегда работает с 512-байтными секторами). Группа секторов используется, чтобы уменьшить размер FAT.

Kаждая позиция в таблице размещения файлов соответствует определенной позиции кластера на диске. Обычно файл занимает несколько кластеров и запись в каталоге файлов содержит номер стартового кластера, в котором записано начало файла. Просмотрев позицию FAT, соответствующую первому кластеру, DOS находит номер кластера, в котором хранится следующая порция этого файла. Этому кластеру соответствует своя запись в FAT, которая в свою очередь содержит номер следующего кластера в цепочке. Для последнего кластера, занятого файлом FAT содержит значения от FF816 до FFF16.

Hеиспользуемым (или освобожденным) кластерам записывается значение 000, а плохим секторам — FF716. Hаконец, значения от FF016 до FF716 приписываются резервным кластерам.

Hомер кластера содержит 3 шестнадцатеричные цифры, для хранения которых требуется 1 1/2 байта. Для уменьшения размеров FAT числа для двух соседних кластеров хранятся в трех последовательных байтах таблицы. MS DOS автоматически производит все необходимые вычисления.

Первые три байта FAT не используются для номеров кластеров.

Первый байт содержит код, определяющий тип диска, а следующие 2 байта оба равны FF16. Поскольку эти позиции таблицы заняты, то кластеры нумеруются, начиная с 2, причем кластеры 2 и 3 занимают вторую тройку байт таблицы.

MS DOS 3.0 может создавать FAT с записями размером 16 бит. Такие записи необходимы для фиксированных дисков размером более 10M, которые имеют больше, чем 4086 кластеров.

Для нахождения следующего кластера файла:

1. Умножить номер кластера на 1.5.

2. Прочитать 2 байта с полученным смещением (округляя вниз).

3. Если номер кластера четный, то взять младшие 12 бит, иначе взять старшие 12 бит.

Для преобразования номера кластера в логический номер сектора:

1. Вычесть 2 из номера кластера.

2. Умножить результат на число секторов в кластере.

Kаждый диск имеет один корневой каталог, с которого начинается поиск всех остальных каталогов. Kорневой каталог может содержать элементы, указывающие на подкаталоги, которые в свою очередь могут содержать ссылки на другие подкаталоги, образуя древовидную структуру каталогов. Kорневой каталог всегда расположен в определенных секторах диска; подкаталоги хранятся как обычные дисковые файлы, поэтому они могут быть расположены в любом месте диска.

Фиксированный диск может содержать до четырех корневых каталогов, если он разбит на разделы, хотя MS DOS «видит» только один корневой каталог. Kаталоги могут иметь различные размеры, в зависимости от размера диска и его разбиения на разделы. В следующей таблице приведены размеры и позиции корневых каталогов для разных типов дисков:

Тип диска Размер каталога Число элементов Hачальный сектор
дискета 160K 4 сектора
дискета 180K 4 сектора
дискета 320K 7 секторов
дискета 1.2M 14 секторов
жесткий 10M переменные
жесткий 20M переменные

В зависимости от разбиения на разделы фиксированный диск может иметь различные размеры каталога и номер начального сектора. Если весь диск отведен для MS DOS, то на XT и AT под корневой каталог отводится 32 сектора, что позволяет иметь в нем 512 элементов.

Kак корневой каталог, так и подкаталоги, используют 32 байта для хранения информации об одном файле, независимо от типа диска.

Таким образом в каждом секторе может храниться информация о 16-ти элементах каталога. Kаждое 32-байтное поле разбито следующим образом:

Биты 0-7 8-10 12-21 22-23 24-25 26-27 28-31
Значение Имя файла Расширение файла Атрибут файла Зарезервировано Время последнего доступа к файлу Дата последнего доступа к файлу Hачальный кластер Размер файла

Точка между именем файла и его 3-байтным расширением не хранится. Все поля выровнены на левую границу, а пустые байты заполняются пробелами (код ASCII 32). Атрибут файла определяет является ли файл скрытым, защищенным от записи и т.д. Он определяет также специальные элементы каталога, такие как подкаталоги или метка тома. Информация о времени и дате упакована, поэтому для чтения этих значений требуются битовые операции.

Начальный кластер указывает на позицию в таблице размещения файлов (FAT). FAT хранит информацию о свободном пространстве на диске, а также отводит сектора при записи файла. FAT отводит дисковое пространство порциями, большими чем 1 сектор, которые называются кластерами. Файл расположен в цепочке кластеров и FAT содержит соответствующую цепочку элементов, указывающих, где эти кластеры расположены на диске.

Каталог должен указывать на начальное звено цепочки элементов файла в FAT, и эта информация содержится в поле начальный номер кластера. Поскольку файл обычно занимает последний отведенный ему кластер не целиком, то поле размер файла хранит точную длину файла в байтах.

Дескриптор файла – 16 битовое беззнаковое целое, используемое DOS и программами для обращения к файлам.

FCB —структура данных (файловые управляющие блоки), в которой содержится информация о позициях, в которых выполняются последовательно операции чтения или записи, о размерах записей в файле и прочие данные, которые, в основном, использует ОС.

Понятие дескрипторов файлов было введено в DOS версии 2.0.

Метод FCB:

Функция: 1116 прерывания 2116 — ищет первое появление файла.

Порядок вызовов: в DS:DX имя файла или путь на неоткрытый FCB.

При возврате AL будет содержать 0, если файл найден, и FF — если нет. DTA заполняется информацией из каталога. Для обычных FCB первый байт DTA содержит номер накопителя (1 = A и т.д.), а следующие 32 байта содержат элемент каталога. Для расширенного FCB первые 7 байтов файла копируются в первые 7 байтов расширенного FCB, восьмой байт указывает на накопитель, а следующие 32 байта – элемент каталога.

;—в сегменте данных

FCB DB 1,’NEWDATABAK’,25DUP(0)

MOV AH,11H ;функция поиска в каталоге

LEA DX,FCB ;указываем на FCB

CMP AL,0 ;успешно?

JNE NO_FILE ;если нет, то процедура обработки ошибки

LEA BX,DTA ;теперь DS:BX указывает на элемент каталога

После использования функции 1116 можно использовать функцию 1216 для поиска следующих подходящих элементов, когда имя файла содержит джокеры. В данном случае в имени файла допустим только символ «?», но не «*». Эта функция работает в точности так же, как и первая, и если найден второй файл, то информация о первом файле в DTA будет уничтожена повторной записью.

Метод дескриптора файлов:

Функция: 4E16 прерывания 2116 ищет файл с данным именем.

Порядок вызова: DS:DX должны указывать на строку, дающую путь файла. Hапример, B:\EUROPE\FRANCE\PARIS указывает на файл PARIS. Строка может содержать до 63 символов и завершаться символом ASCII 0. Имя файла может содержать джокеры, включая как «?», так и «*». Поместите атрибут файла в CX; если он обычный то 0, следует произвести анализ ошибки.

При возврате устанавливается флаг переноса, если файл не найден. Если файл найден, то функция заполняет DTA информацией о файле. Отметим частный случай использования DTA методом дескриптора файлов — обычно, DTA используется функциями MS DOS для работы через FCB. Первые 21 байт DTA зарезервированы DOS для поиска следующих совпадающих файлов. Двадцать второй байт дает атрибут файла, за ним следуют два байта, содержащие время и еще два байта содержащие дату. Следующие 4 байта содержат размер файла (младшее слово сначала). И, наконец, дается имя файла в виде строки переменной длины, заканчивающейся байтом ASCII 0. Точка (ASCII 46) разделяет имя и расширение и не один из этих элементов не заполнен пробелами.

;—в сегменте данных

PATH DB ‘B:FRANCE\PARIS\4EME’,0

MOV AH,4EH ;номер функции

LEA DX,PATH ;DS:DX указывают на путь

MOV CX,0 ;обычный атрибут файла

INT 21H ;ищем файл

JC NO_FILE ;уход, если не найден

LEA BX,DTA ;DS:BX указывают на DTA

MOV AL,[BX]+21 ;теперь атрибут файла в AL

Следующее появление имени файла (когда используются джокеры) ищется с помощью функции 4FH прерывания 2116. Она готовится в точности так же, как и функция 4EH, при этом указатель DTA не должен меняться. Kогда других совпадений не найдено, то устанавливается флаг переноса, а в AX появляется 18.

Папиллярные узоры пальцев рук — маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни.

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰).

DOS Fn 40H: писать в файл через описатель

Читайте также:

  1. DOS Fn 28H: писать произвольный блок файла
  2. DOS Fn 45H: Дублировать описатель файла — DUP
  3. IV этап (через 18-24 час от начала исследования)
  4. V этап (через 24-36 час от начала исследования)
  5. Аминокислоты надо переносить через мембраны
  6. Анализ эффективности использования материальных ресурсов через материалоемкость
  7. Безопасный спуск скребка в скважину через лубрикатор
  8. Большая пятерка». Свойства индивидуальности бренда. Черты свойств индивидуальности брендов и их описательные названия (признаки).
  9. В 1905 г. указы, ограничивающие автономию, отменяются, в 1906 г. вводятся всеобщие выборы. Но через несколько лет они все равно уходят от империи.
  10. В мир книг через книгу
  11. В. Розрахунки через Інтернет

Выход

Вход

DOS Fn 3fH: читать файл через описатель

Выход

Вход

DOS Fn 3eH: Закрыть описатель файла

Выход

Вход

DOS Fn 3dH: открыть описатель файла

Выход

Вход

  • AH = 3cH
  • DS:DX = адрес строки ASCIIZ с именем файла
  • CX = атрибут файла
  • AX = код ошибки если CF установлен и описатель файла если ошибки нет

Описание:

DS:DX указывает на строку ASCIIZ в формате: «d:путьимяфайла»,0. если диск и/или путь опущены, они принимаются по умолчанию.

  • файл создается в указанном (или умалчиваемом) оглавлении
  • файл открывается в режиме доступа чтение/запись
  • вы должны созранить описатель (handle) для последующих операций
  • если файл уже существует:
  • при открытии файл усекается до нулевой длины
  • если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут)
  • CONFIG.SYS специфицирует число доступных описателей в системе
  • используйте функцию 5bH создать Новый файл, если вы не хотите перекрывать (усекать) существующий файл.
  • AH = 3dH
  • DS:DX = адрес строки ASCIIZ с именем файла
  • AL = режим открытия
  • AX = код ошибки если CF установлен и описатель файла если нет ошибки.

Описание:

DS:DX указывает на строку ASCIIZ в формате: «d:путьимяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию.

  • файл должен существовать. См. функцию 3cH (создать файл).
  • файл открывается в выбранном режиме доступа / режиме открытия для совместимости с DOS 2.x и избежания сетевых режимов, задавайте:
    • AL = 0 чтобы открыть для чтения
    • AL = 1 чтобы открыть для записи
    • AL = 2 чтобы открыть для чтения и записи
  • указатель чтения/записи устанавливается в 0. См. 42H (LSEEK)
  • вы должны сохранить описатель (handle) для последующих операций
  • разделение файлов должно быть активизировано (команда DOS SHARE), если запрашивается открытие в одном из режимов разделения.
  • CONFIG.SYS специфицирует число доступных описателей файлов.
  • AH = 3eH
  • BX = описатель файла
  • AX = код ошибки если CF установлен

Описание:

BX содержит описатель файла (handle), возвращенный при открытии. файл, представленный этим описателем, закрывается, его буфера сбрасываются, и оглавление обновляется корректными размером, временем и датой.

Из-за нехватки описателей файлов (максимум 20, по умолчанию 8), вам может понадобиться закрыть часть умалчиваемых описателей, как, например, описатель 3 (стандартный AUX).

  • AH = 3fH
  • BX = описатель файла
  • DS:DX = адрес буфера для чтения данных
  • CX = число считываемых байт
  • AX = код ошибки если CF установлен или число действительно прочитанных байт

Описание:

CX байт данных считываются из файла или устройства с описателем, указанным в BX. данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX.

Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла, подготавливая его к последующим операциям чтения или записи.

Вы должны всегда сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):

  • если AX = CX, (и CF сброшен) — чтение было корректным без ошибок
  • если AX = 0, достигнут конец файла (EOF)
  • если AX

Дата добавления: 2014-01-20 ; Просмотров: 477 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

MS-DOSMS-DOSMS-DOS Microsoft Disk Operating System (дисковая ОС от Microsoft) коммерческая операционная система для персональных компьютеров фирмы Microsoft. — презентация

Презентация была опубликована 6 лет назад пользователемimg0.liveinternet.ru

Похожие презентации

Презентация на тему: » MS-DOSMS-DOSMS-DOS Microsoft Disk Operating System (дисковая ОС от Microsoft) коммерческая операционная система для персональных компьютеров фирмы Microsoft.» — Транскрипт:

2 MS-DOS Microsoft Disk Operating System (дисковая ОС от Microsoft) коммерческая операционная система для персональных компьютеров фирмы Microsoft. MS-DOS самая известная ОС из семейства DOS, установленная на большинстве PC-совместимых компьютеров. Со временем она была заменена различными вариантами операционной системы Windows.

3 История* 1975, январь. Журнал «Popular Electronic» объявляет о выпуске набора для сборки микрокомпьютера Altair компании MITS на чипе i , февраль. Пол Аллен приезжает в MITS и представляет разработанный Биллом Гейтсом BASIC-интерпретатор для Altair. 1975, март. Стив Джобс и Стив Возняк организуют компьютерный клуб в г.Менло-Парк, штат Калифорния. 1975, август. Билл Гейтс и Пол Аллен организуют товарищество Micro- Soft. 1979, декабрь. Годовой объём продаж Microsoft: $. Количество служащих: 25. Продукция: трансляторы языков BASIC, FORTRAN и Cobol. 1980, апрель. Тим Паттерсон (Seattle Computer Products) начинает разрабатывать операционную систему для чипа i8086. __________ * Источник: Дениэл Ичбиа, Сьюзен Кнепер, «Билл Гейтс и сотворение Microsoft», Р-н-Д: Феникс, 1997

4 История 1980, август. Представители IBM приезжают в Microsoft. Гейтс подписывает контракт на разработку BASIC-интерпретатора и даёт рекомендации в отношении спецификаций микрокомпьютера. 1980, сентябрь. IBM предлагает написать трансляторы языков BASIC, FORTRAN, Cobol и Pascal для планируемого компьютера IBM. Тим Паттерсон демонстрирует в Microsoft свою 86-DOS, написанную для чипа i8086. Microsoft принимает решение о разработке на её базе ОС для микрокомпьютера IBM. 1980, октябрь. Microsoft покупает права на 86-DOS. Microsoft представляет IBM предложение о разработке трансляторов и операционной системы. 1980, ноябрь. Micorsoft подписывает контракт с IBM и получает первый опытный образец IBM PC. 1980, декабрь. Годовой объём продаж Microsoft: $. Количество служащих: 40.

5 История 1981, февраль. Первый запуск MS-DOS на опытном образце IBM PC. 1981, апрель. Тим Паттерсон поступает на работу в Microsoft. 1981, август. Объявление о создании IBM PC. Microsoft выпускает MS- DOS версии 1.0. Главой отдела по IBM PC назначается Дон Эстридж. 1981, декабрь. Годовой объём продаж Microsoft: $. Количество служащих: , март. IBM объявляет о создании PC XT с жёстким диском 10 Мбайт. Microsoft публикует MS-DOS 2.0 для PC XT. 1983, ноябрь. Microsoft представляет Windows. Этот графический интерфейс поддержан 23 производителями микрокомпьютеров, но – не IBM. 1984, август. IBM внедряет в производство PC AT с жёстким диском 20 Мбайт. Microsoft выпускает поддерживающую его MS-DOS , ноябрь. Выпуск MS-DOS 3.1 с поддержкой сети. 1991, июнь. Выпуск MS-DOS , апрель. В модернизированной версии Windows 3.1 усовершенствовано управление файлами и улучшен внешний вид.

6 Поздние версии 4.01 – первая полностью и официально русифицированная версия (май 1988г) – последняя (до повсеместного перехода на Windows 95) широко применявшаяся версия DOS (1994г).

7 Подсистемы MS-DOS Файловая система Система управления памятью Система управления программами Система связи с драйверами устройств Система обработки ошибок Служба времени Система ввода/вывода консоли оператора …

8 Состав MS-DOS BIOS (Basic Input-Output System) Блок начальной загрузки Файл io.sys (ibm.com, drbios.sys)– модуль взаимодействия с BIOS Файл msdos.sys (ibmdos.com, drdos.sys) – модуль обработки прерываний Файл command.com – командный процессор Утилиты (внешние команды) Драйверы устройств Файл config.sys – файл конфигурации системы Файл autoexec.bat – файл автозапуска программ при загрузке ОС

9 Файловая система Логические диски: A,B,C,D…Z Файловая структура на дисках: –Boot-сектор (сектор 0) –FAT (секторы 1-18, основная и дублирующая таблицы) –Root Directory (секторы 19, 20) –Io.sys, msdos.sys (секторы 33,…) –Область данных

10 Загрузка MS-DOS BIOS: –POST, Power On Self Testing –Поиск и загрузка Блока начальной загрузки (БНЗ) БНЗ загружает io.sys Io.sys: –Загружает и настраивает msdos.sys –Определяет состояние подключённых устройств –Инициализирует подключённые устройства –Загружает необходимые драйверы устройств –Передаёт управление msdos.sys Msdos.sys: –Настраивает рабочие таблицы –Загружает драйверы, указанные в config.sys –Загружает командный процессор command.com Command.com: –Выполняет команды, содержащиеся в autoexec.bat –Выдаёт на экран системную подсказку (system prompt) –Ожидает команд пользователя

11 Запуск вычислительного процесса — путём ввода спецификаций программного (.EXE,.COM,.BIN) или пакетного (.BAT) файла, расположенного в текущем каталоге текущего устройства

12 Команды работы с каталогом DIR – просмотреть содержимое MKDIR (MD) – создать каталог CHDIR (CD) – перейти в каталог RMDIR (RD) – удалить каталог

13 Команды работы с файлами TYPE – вывести содержимое на экран DELETE — удалить COPY — копировать RENAME — переименовать

14 Команды для работы с дисками FORMAT — форматировать DISKCOPY – дублировать дискету VOL – вывести метку диска LABEL – создать/заменить метку диска CHKDSK – проверить диск SYS – создать загрузочную (системную) дискету

15 Команды конфигурирования системы и управления устройствами CLS – очистить экран DATE – показать/установить дату PATH – указать пути поиска PROMPT – изменить формат приглашения TIME – показать/установить время VER – вывести версию ОС

16 Файловый менеджер Norton Commander

17 Прерывания BIOS 00h: Деление на ноль. 01h: Пошаговое. 02h: Немаскируемое. 03h: Точка прерыв. 04h: Переполнение. 05h: Печать экрана. 06h: (резерв) 07h: (резерв) 08h: Таймер. 09h: Клавиатура. 0Ah-0dh: (hdwr ints) 0Eh: Дискета. 0Fh: (hdwr int) 10h: Видео сервис. 11h: Список оборудования. 12h: Размер исп.памяти. 13h: Дисковый в/в. 14h: В/в через последовательный порт 15h: Расшир.сервис AT. 16h: В/в клавиатуры. 17h: В/в принтера. 18h: ROM-BASIC. 19h: Загрузка. 1Ah: В/в таймера. 1Bh: Прерывание клавиатуры. 1Ch: Пользовательское прерывание по таймеру 1Dh: Видео параметры 1Eh: Параметры дискет 1Fh: Символы графики

18 Прерывания DOS 20h: Завершить программу 21h: Сервис DOS 25h/26h: Абсолютные чтение/запись диска 27h: Завершиться, но остаться резидентным 28h: Квант времени DOS (НЕТ В ДОКУМЕНТАЦИИ)28h: Квант времени DOS (НЕТ В ДОКУМЕНТАЦИИ) 2eh: Выполнить команду DOS (НЕТ В ДОКУМЕНТАЦИИ)2eh: Выполнить команду DOS (НЕТ В ДОКУМЕНТАЦИИ) 2fh: Мультиплексное прерывание (спулинг печати)2fh: Мультиплексное прерывание (спулинг печати)

19 INT 21H: сервис DOS Это прерывание служит главным входом большинства функций DOS. Программа, запрашивающая сервис DOS, должна подготовить всю необходимую информацию в регистрах и управляющих блоках, указать в регистре AH номер желаемой функции DOS и затем вызвать прерывание INT 21H. Функция DOS 00H: завершить программу Функция DOS 01H: ввод с клавиатуры Функция DOS 02H: вывод на дисплей Функция DOS 03H: ввод AUX Функция DOS 04H: вывод AUX Функция DOS 05H: вывод на принтер Функция DOS 06H: Обмен с консолью Функция DOS 07H: Нефильтрующий консольный ввод без эхаФункция DOS 07H: Нефильтрующий консольный ввод без эха Функция DOS 08H: Консольный ввод без эха Функция DOS 09H: Выдать строку Функция DOS 0aH: буферизованный ввод строки Функция DOS 0bH: проверить статус ввода Функция DOS 0cH: ввод с очисткой Функция DOS 0dH: Сбросить диск Функция DOS 0eH: Выбрать умалчиваемый диск DOS Функция DOS 0fH: открыть файл через FCB Функция DOS 10H: Закрыть файл через FCB Функция DOS 11H: Найти 1-й совпадающий файл через FCBФункция DOS 11H: Найти 1-й совпадающий файл через FCB Функция DOS 12H: Найти следующий совпадающий файл через FCBФункция DOS 12H: Найти следующий совпадающий файл через FCB Функция DOS 13H: Удалить файл через FCB Функция DOS 14H: читать последовательный файл через FCBФункция DOS 14H: читать последовательный файл через FCB Функция DOS 15H: писать последовательный файл через FCBФункция DOS 15H: писать последовательный файл через FCB (недокументировано) Функция DOS 16H: создать файл через FCB Функция DOS 17H: Переименовать файл через FCB Функция DOS 19H: дать умалчиваемый диск DOS Функция DOS 1aH: установить адрес DTA Функция DOS 1bH: дать информацию FAT (текущий диск) Функция DOS 1cH: дать информацию FAT (любой диск) Функция DOS 21H: читать запись произвольного файла Функция DOS 22H: писать запись произвольного файла Функция DOS 23H: дать размер файла через FCB Функция DOS 24H: установить адрес блока произвольного файлаФункция DOS 24H: установить адрес блока произвольного файла Функция DOS 25H: установить вектор прерывания Функция DOS 26H: создать префикс программного сегментаФункция DOS 26H: создать префикс программного сегмента Функция DOS 27H: читать блок произвольного файла Функция DOS 28H: писать блок произвольного файла Функция DOS 29H: Разобрать имя файла Функция DOS 2aH: дать дату DOS Функция DOS 2bH: установить дату DOS Функция DOS 2cH: дать время DOS Функция DOS 2dH: установить время DOS Функция DOS 2eH: установить/сбросить переключатель верификацииФункция DOS 2eH: установить/сбросить переключатель верификации Функция DOS 2fH: дать текущий DTA Функция DOS 30H: дать номер версии DOS Функция DOS 31H: завершиться и остаться резидентным — — KEEPФункция DOS 31H: завершиться и остаться резидентным — — KEEP Функция DOS 32H: дать дисковую информацию DOS (недокументировано)Функция DOS 32H: дать дисковую информацию DOS (недокументировано) Функция DOS 33H: установить/опросить уровень контроля прерывания DOSФункция DOS 33H: установить/опросить уровень контроля прерывания DOS Функция DOS 34H: адрес статуса реентерабельности DOS Функция DOS 35H: дать вектор прерывания Функция DOS 36H: дать свободную память диска …

20 Расчёт сложных процентов Дано: капитал Q вкладывается в предприятие с ежегодным приростом D%. Определить: текущую величину капитала в течение первых N лет.

21 Расчёт сложных процентов: BASIC-программа 10 PRINT Расчёт сложных процентов 20 INPUT Введите Q, D, N, Q, D, N 30 D1=1+D/ J=1 50 Q=Q*D1 60 PRINT J,Q 70 J=J+1 80 IF J

22 Расчёт сложных процентов: ASM-программа TITLERASCHET.ASM; Расчёт сложных процентов STACKSGSEGMENTSTACK DW64 DUP (?) STACKSGENDS DATASGSEGMENTDATA ; объявление переменных VVQDBВведите величину начального капитала (до ) VVDDB10,13,Введите процент годового прироста DB10,13,% VVNDB10,13,Введите количество расчётных лет DB10,13,% Q0DW? D ? D1DW? N ? J 1 Q ? BUFDB5,0,0,0,0,0,0,0 VIV1DB год капитал DB10,13,%

23 SRBDB14 DUP(0), $ SRDB6 DUP(0), $ SRKDB10, 13, $ FT10DW1 TENDW10 STODW100 DATASEGENDS CODESGSEGMENTCODE MAINPROCFAR ; главная процедура ASSUMECS:CODESG, DS:DATASG, SS:STACKSG ; назначение ;сегментных регистров в сегменте кодов PUSHDS ; запись адреса SUBAX, AX ; префикса программного PUSHAX ; сегмента в стек MOVAX, DATASG ; инициализация содержимого MOVDS, AX ; регистра сегмента данных. ДАЛЕЕ – ;СОБСТВЕННО ТЕКСТ ПРОГРАММЫ MOVAH, 9 ; запрос на ввод Q MOVDX, offset VVQ INT21H MOVAH, 0Ah ; ввод Q MOVDX, offset BUF INT21H CALLSTR2BIN MOVQ0, D1 MOVAH, 9 ; запрос на ввод D MOVDX, offset VVD

24 INT21H MOVAH, 0AH ; ввод D MOVDX, offset BUF INT21H CALLSTR2BIN MOVD, D1 MOVAH, 9 ; запрос на ввод N MOVDX, offset VVN INT21H MOVAH, 0AH ; ввод N MOVDX, offset BUF INT21H x3850CALLSRT2BIN MOVN, D1 MOVAX, D MOVD1, AH ADDD1, 100 ; расчёт D1 = (1 + D/100) * 100 MOVAX, Q0 MOVQ, AX MOVAH, 9 MOVDX, offset VIV1 INT21H RST:MOVAX, Q ; расчёт Q = Q * D1 MULD1 4235DIVSTO MOVQ, AX MOVAX, J

25 CALLBIN2STR MOVAH, 9 ; вывод года MOVDX, offset SR INT21H MOVAH, 9 ; вывод пробела MOVDX, offset SRB INT21H MOVAX, Q ; вывод прибыли CALLBIN2STR MOVAH, 9 MOVDX, offset SR INT21H MOVAH, 9 ; перевод строки MOVDX, offset SRK INT21H INCJ ; j =j + 1 MOVAX, J CMPAX, N ; сравнение J с N JLERST ; условный переход по I

Программирование в среде однозадачной операционной системы

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«ПЕНЗЕНСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ

Е.В. Грачева

Системное программное обеспечение

Персональных ЭВМ

доктор технических наук, пофессор

зав.кафедрой «Вычислительные машины и системы»

доктор технических наук, пофессор

кафедры «Информационно-вычислительные системы»

Пензенского государственного университета

Грачева Е.В.

Системное программное обеспечение персональных ЭВМ:

Учебнле пособие /Е.В. Грачева – Пенза

Учебное пособие подготовлено на кафедре «Вычислительные машины и системы»

Пензенской государственной технологической академиии и предназначено для студентов высших учебных заведений,обучающихся поспециальности 230101.

Программирование в операционной среде

Операционной средой называется набор функций ОС, сервисов и правила обращения к ним. Поскольку каждая операционная система имеет свой набор функций и правил обращения к ним, программирование в операционной среде каждой ОС должно рассматриваться отдельно [1].

Программирование в среде однозадачной операционной системы

Программы для MS DOS могут быть одного из двух форматов: COM или EXE.

Программы типа COM не могут быть размером более 64 Кб и состоят только из одного сегмента – сегмента кода.

Размер программы типа EXE может превышать 64 кб.

В современных операционных средах приложения пользуются системными вызовами, число которых превышает 2000, в то время как в MS-DOS подобных функций гораздо меньше.

Главным входом большинства функций DOS служит прерывание, вызываемое с помощью команды INT 21h. Параметры функциям DOS передаются через регистры микропроцессора: AX (AH и AL), BX, CX, DX; регистровые пары DS:DX и ES:BX используются в основном при передаче адреса ячейки памяти. Через эти же регистры возвращаются результат работы функции DOS, кроме того могут быть установлены флаги в регистре флагов.

Как и любая операционная система, DOS загружает и выполняет программы. При загрузке программы в начале отводимого для нее блока памяти (для СОМ-программ это вся свободная на данный момент память) создается структура данных PSP (префикс программного сегмента) размером 256 байт (100h). Затем DOS создает копию текущего окружения для загружаемой программы, помещает полный путь и имя программы в конец окружения, заполняет поля PSP следующим образом:

+00h: слово – CDh 20h – команда INT 20h. Если СОМ-программа завершается командой RETN, управление передается на эту команду.

+02h: слово – сегментный адрес первого байта после области памяти, выделенной для программы

+04h: байт – не используется DOS

+05h: 5 байт – 9Ah F0h FEh 1Dh F0h – команда CALL FAR на абсолютный адрес 000C0h, записанная так, чтобы второй и третий байты составляли слово, равное размеру первого сегмента для СОМ-файлов (в этом примере FEF0h). Введено для совместимости с командой СР/М CALL 5.

+0Ah: 4 байта – адрес обработчика INT 22h (выход из программы)

+0Eh: 4 байта – адрес обработчика INT 23h (обработчик нажатия Ctrl-Break).

+12h: 4 байта – адрес обработчика INT 24h (обработчик критических ошибок)

+16h: слово – сегментный адрес PSP процесса, из которого был запущен текущий.

+18h: 20 байт – JFT – список открытых идентификаторов, один байт на идентификатор, FFh – конец списка.

+2Ch: слово – сегментный адрес копии окружения для процесса.

+2Eh: 2 слова – SS:SP процесса при последнем вызове INT 21h.

+32h: слово – число элементов JFT (по умолчанию 20).

+34h: 4 байта – дальний адрес JFT (по умолчанию PSP:0018).

+38h: 4 байта – дальний адрес предыдущего PSP.

+3Ch: байт – флаг, указывающий, что консоль находится в состоянии ввода 2-байтного символа.

+3Dh: байт – флаг, устанавливаемый функцией В711h прерывания 2Fh (при следующем вызове INT 21h для работы с файлом имя файла будет замечено на полное).

+3Eh: слово – не используется в DOS.

+40h: слово – версия DOS, которую вернет функция DOS 30h (DOS 5.0+).

+42h: 12 байт – не используется в DOS.

+50h: 2 байта – CDh 21h – команда INT 21h.

+54h: 7 байт – область для расширения первого FCB (FCB, FileControlBlok — это метод работы с файлами, являющийся рудиментом от ранних версий DOS’а. При его использовании можно работать только с файлами в текущем каталоге, причем даже нет возможности сменить каталог (точнее, даже понятия «каталог» в момент создания этих функций вообще не было). Современные программы эти функции не используют. MS-DOS обеспечивает две технологии обслуживания файлов. Первая была разработана при создании версий 1.Х. Эта технология основана на использовании структур данных, называемых блоками управления файлом (FCB). В то время подавляющее большинство компьютеров работало под управлением операционной системы CPM. Блоки FCB обеспечивали совместимость файлов MS-DOS с файлами этой системы. При разработке MS-DOS версий 2.Х, когда была предложена иерархическая структура организации файлов, была разработана вторая технология их обслуживания. Она основана на использовании ссылок на управляющую запись файла и не требует организации FCB. После того, как эта технология была опробована на операционной системе UNIX, она получила широкое распространение.).

+5Ch: 16 байт – первый FCB, заполняемый из первого аргумента командной строки.

+6Ch: 16 байт – второй FCB, заполняемый из второго аргумента командной строки.

+7Ch: 4 байта – не используется в DOS.

+80h: 128 байт – командная строка и область DTA по умолчанию.

Затем DOS записывает программу в память, начиная с адреса PSP:0100h.

Если загружается ЕХЕ-программа, использующая дальние процедуры или сегменты данных, DOS модифицирует эти команды так, чтобы используемые в них сегментные адреса соответствовали сегментным адресам, которые получили эти процедуры и сегменты данных при загрузке программы в память.

При запуске СОМ-программы регистры устанавливаются следующим образом:

AL = FFh, если первый параметр командной строки содержит неправильное имя диска (например, z:/something), иначе – 00h.

АН = FFh, если второй параметр содержит неправильное имя диска, иначе 00h.

CS = DS = ES = SS = сегментный адрес PSP.

SP = адрес последнего слова в сегменте (обычно FFFEh; меньше, если не хватает памяти).

При запуске ЕХЕ-программы регистры SS:SP устанавливаются в соответствии с сегментом стека, определенным в программе, затем в любом случае в стек помещается слово 0000h и выполняется переход на начало программы (PSP:0100h для СОМ, собственная точка входа для ЕХЕ).

Все эти действия выполняет одна функция DOS – DOS 4Bh – загрузить и выполнить программу. В качестве параметров этой функции передаются:

AL = 00h – загрузить и выполнить;

AL = 01h – загрузить и не выполнять;

DS:DX – адрес ASCIZ-строки с полным именем программы
ES:BX – адрес блока параметров ЕРВ:

+00h: слово – сегментный адрес окружения, которое будет скопировано для нового процесса (или 0, если используется текущее окружение)
+02h: 4 байта – адрес командной строки для нового процесса
+06h: 4 байта – адрес первого FCB для нового процесса
+0Ah: 4 байта – адрес второго FCB для нового процесса
+0Eh: 4 байта – здесь будет записан SS:SP нового процесса после его завершения (только для AL = 01)
+12h: 4 байта – здесь будет записан CS:IP (точка входа) нового процесса после его завершения (только для AL = 01)

AL = 03h – загрузить как оверлей;
DS:DX – адрес ASCIZ-строки с полным именем программы
ES:BX – адрес блока параметров:

+00h: слово – сегментный адрес для загрузки оверлея
+02h: слово – число, которое будет использовано в командах, использующих непосредственные сегментные адреса, – обычно то же самое число, что и в предыдущем поле. 0 для СОМ-файлов

AL = 05h – подготовиться к выполнению (используется в ОС MS DOS начиная с версии 5.0 и выше)
DS:DX – адрес следующей структуры:

+00h: слово – 00h
+02h: слово:

бит 0 – программа – ЕХЕ
бит 1 – программа – оверлей

+04h: 4 байта – адрес ASCIZ-строки с именем новой программы
+08h: слово – сегментный адрес PSP новой программы
+0Ah: 4 байта – точка входа новой программы
+0Eh: 4 байта – размер программы, включая PSP

CF = 0, если операция выполнена, ВХ и DX модифицируются,
CF = 1, если произошла ошибка, АХ = код ошибки (2 – файл не найден, 5 – доступ к файлу запрещен, 8 – не хватает памяти, 0Ah – неправильное окружение, 0Bh – неправильный формат).

Как уже отмечалось, прерывание INT 21h (сервис DOS) служит главным входом большинства функций DOS. Программа, запрашивающая сервис DOS, должна подготовить всю необходимую информацию в регистрах и управляющих блоках, указать в регистре AH номер желаемой функции DOS и затем вызвать прерывание INT 21H.

В таблице 1 приведены функции прерывания INT 21h.

Таблица 1 -Функции прерывания INT21h

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Увлечёшься девушкой-вырастут хвосты, займёшься учебой-вырастут рога 9790 — | 7665 — или читать все.

Open Library — открытая библиотека учебной информации

Открытая библиотека для школьников и студентов. Лекции, конспекты и учебные материалы по всем научным направлениям.

Категории

Менеджмент DOS Fn 4fH: Найти следующий совпадающий файл

Выход

Вход

DOS Fn 4eH: Найти 1-й совпадающий файл

Выход

Вход

DOS Fn 4dH: дать код выхода программы — WAIT

Выход

Вход

Описание:

возвращает управление от порожденного процесса его родителю, устанавливая код выхода, который можно опросить функцией 4dH WAIT. Управление передается по адресу завершения в PSP завершающейся программы. векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненнмы в родительском PSP.

Замечание:

значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы.

  • AH = 4dH
  • AL = код выхода последнего завершившегося процесса
  • AH = 0 — нормальное завершение
  • AH = 1 — завершение через Ctrl-Break
  • AH = 2 — завершение по критической ошибке устройства
  • AH = 3 — завершение через функцию 31H KEEP

Описание:

возвращает код выхода последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.

  • AH = 4fH
  • DS:DX = адрес строки ASCIIZ с именем файла (допускаются ? и *)
  • CX = атрибут файла для сравнения
  • AX = код ошибки если CF установлен
  • DTA = заполнена данными (если не было ошибки)

Описание:

DS:DX указывает на строку ASCIIZ в форме: «d:путьимяфайла»,0. В случае если диск и/или путь опущены, они подразумеваются по умолчанию. Обобщенные символы * и ? допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, ĸᴏᴛᴏᴩᴏᴇ совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA, как показано ниже:

Замечания:

Атрибут файла обычно используется во «включающем» поиске. если вас интересуют как файлы, так и оглавления, установите бит атрибута 4 (ᴛ.ᴇ. attr | 10H). См. атрибут файла для полной информации.

Типичная последовательность, используемая для поиска всœех подходящих файлов:

  • используйте вызов 1aH, чтобы установить DTA на локальный буфер (или используйте умалчиваемую DTA в PSP по смещению 80H)
  • уст. CX=атрибут, DS:DX => ASCIIZ диск, путь, обобщенное имя
  • вызовите функцию 4eH (Найти 1-й)
  • если флаг CF указывает ошибку, вы закончили (нет совпадений)
  • уст. DS:DX => DTA (или на данные, которые вы скопировали из DTA после вызова функции 4eH)
  • повторять
    • обработать имя файла и данные по адресу DS:DX
    • вызвать функцию 4fH (Найти следующий)
    • пока Carry-флаг не покажет, что совпадений больше нет

Читайте также

Выход Вход DOS Fn 4eH: Найти 1-й совпадающий файл Выход Вход DOS Fn 4dH: дать код выхода программы — WAIT Выход Вход AH = 4cH AL = код выхода нет = (неприменим) Описание: возвращает управление от порожденного процесса его родителю, устанавливая код выхода. [читать подробенее]

Выход Вход DOS Fn 4eH: Найти 1-й совпадающий файл Выход Вход DOS Fn 4dH: дать код выхода программы — WAIT Выход Вход AH = 4cH AL = код выхода нет = (неприменим) Описание: возвращает управление от порожденного процесса его родителю, устанавливая код выхода. [читать подробенее]

Текст книги «Создаем вирус и антивирус»

Автор книги: Игорь Гульев

Программирование

Текущая страница: 12 (всего у книги 15 страниц) [доступный отрывок для чтения: 4 страниц]

Для многих пользователей Интернет SPAM (бесконечные рекламные предложения и мусор, рассылаемый по почте) стал настоящим бедствием. Основные рекомендации для защиты от SPAM следующие:

– пишите письма в конференции Usenet исключительно с ненужных (бесплатных) адресов, потому что именно письма в конференции Usenet являются основной «засветкой» для спамеров. А если будет много SPAM, то такой адрес можно, что называется, выбросить и за пару минут сделать другой подобный;

– установите какую-либо программу-фильтр для e-mail. Существует великое множество таких программ, доступных на бесплатных серверах, например, на http://www.shareware.com и http://www.download.com.

На FTP-сервер под чужим IP-адресом

Путешествуя по Интернет, пользователи часто не задумываются о том, что оставляют следы своих посещений каждый раз, когда заходят на какой-либо FTP-сайт. Стандартные log-файлы позволяют любопытным владельцам сайтов узнать многое, и, прежде всего, IP-адрес, что равнозначно, например, тому, что определен номер телефона. Существует несколько способов защитить privacy от подобных посягательств.

Анонимно путешествовать по сети можно с помощью proxy-сервера. Proxy сервер работает, по сути, как Анонимайзер, то есть документ с сайта «забирает» он, а не компьютер пользователя. Большинство proxy серверов ограничивают доступ на основании IP-адреса, с которого приходит обращение. Иными словами, если провайдером пользователя является Demos, то proxy сервер Glasnet его к себе попросту не пустит. Но, к счастью, в сети всегда можно найти «добрый» proxy, владельцы которого либо открыто заявляют о его доступности для всех желающих, либо, по той или иной причине, не ограничивают доступ только своим доменом, о чем широкой публике не известно, например:

Для настройки FTP-клиентов proxy-сервер надо установить в passive режим. Проделав эту нехитрую операцию, можно путешествовать по сети, как болгарский или американский пользователь, но… тут есть один очень важный момент. Далеко не все proxy серверы являются полностью анонимными. Некоторые из них позволяют администратору сайта, который пользователь посещаете с использованием proxy, при желании определить IP-адрес, с которого происходит обращение к proxy, то есть реальный IP-адрес пользователя. Поэтому выбранный proxy-сервер нужно проверить на предмет его полной или неполной анонимности. Сделать это можно на сервере http://www.tamos.com/bin/proxy.cgi

Если в ответ получено сообщение «Proxy server is detected!», выбранный proxy имеет «дыру», будет предоставлена информация о реальном IP-адресе пользователя, как, впрочем, и об IP-адресе proxy сервера, с которого пришел запрос. Если же сообщение гласит «Proxy server is not detected» – все в порядке, анонимность обеспечена. Рекомендуется периодически (не реже, чем раз в месяц) проверять proxy, с которыми ведется работа, на предмет анонимности. В заключение еще несколько соображений касательно использования proxy серверов. Работа через далеко расположенный proxy снижает скорость передачи данных и увеличивает время ожидания. Кроме того, если все читатели будут использовать приведенные выше адреса proxy, то очень скоро удовольствие кончится, и доступ к ним будет закрыт (если уже не закрыт). Найти подходящий proxy несложно, например, приведенные адреса найдены всего за пять минут. В поисковой машине (например AltaVista) указываются ключевые слова, что-нибудь вроде proxy+server+configuration+ Netscape. В результате появится список страниц, где провайдеры рассказывают своим пользователям, как настроить браузеры для работы с их proxy. Если пробовать все подряд, на пятый или седьмой раз удача улыбнется, и proxy-сервер согласится работать.

Приложения

В приложениях приведена информация, которая может быть полезна программистам не только при написании вирусов, но и при создании других программ. Описано более 100 различных функций DOS, AMIBIOS и DPMI (в том числе недокументированные).

Приложение А
Форматы заголовков EXE-файлов
Формат заголовка обычного EXE-файла

В начале EXE-файла расположена форматированная часть заголовка EXE-файла (Таблица А-1).

Далее следует таблица настройки адресов (Relocation Table), состоящая из длинных указателей (смещение: сегмент) на те слова в загрузочном модуле, которые содержат настраиваемые сегментные адреса. Примечание: элементы таблицы настройки могут быть расположены не по порядку.

Таблица А-1. Формат заголовка обычного EXE-файла
Формат заголовка NE-executable EXE-файла

В состав старого заголовка входят:

– обычный EXE-заголовок (Таблица A-2);

– указатель на новый заголовок (если в ЕХЕ-заголовке в начале таблицы перемещаемых элементов – по смещению18h – стоит 40h или больше, то слово, расположенное по смещению 3С^ содержит смещение начала нового заголовка);

Таблица A-2. Формат обычного EXE-заголовка в NE-executable EXE-файле

В состав нового заголовка входят:

– инфоблок (Таблица A-3);

– таблица сегментов (Таблица A-4);

– таблица ресурсов (Таблица A-5);

Таблица A-3. Формат NE-заголовка
Таблица A-4. Формат таблицы сегментов
Таблица A-5. Формат таблицы ресурсов

– таблица резидентных имен;

– таблица ссылок на модули;

– таблица импортируемых имен;

– таблица входов (Таблицы A-6 и A-7);

– таблица нерезидентных имен.

В заголовке нового стиля содержится вся информация, необходимая для сегментированного исполняемого файла – заголовки таблицы сегментов, ресурсов и имен.

Сразу за заголовком находится таблица сегментов. В ней содержится описание каждого сегмента исполняемого файла.

Таблица ресурсов. Ресурсами являются все основные объекты интерфейса – диалоговые окна, меню, курсоры, растровые изображения, значки и так далее.

Формат таблицы ресурсов (смещения относительно начала входа каждого ресурса). Значения в диапазоне смещений 02-12h повторяются в таблице до тех пор, пока величина по смещению 02h не станет равной нулю. Значения в диапазоне от 0Ah до 12h повторяются столько раз, сколько указано по адресу 04h.

Таблица A-6. Таблица входов перемещаемого сегмента
Таблица A-7. Таблица входов фиксированного сегмента

Таблица резидентных имен. В ней содержатся строки, идентифицирующие экспортируемые функции исполняемого файла. Постоянно находятся в памяти и никогда не сбрасываются на диск. Верхний и нижний регистры различаются, ноль в конце отсутствует.

Данные в таблице находятся в виде:

– длина строки (равна нулю, если в таблице нет дополнительных строк);

– строка резидентного имени (первая строка – имя модуля);

– порядковый номер, идентифицирующий строку. Может использоваться в качестве индексного выхода в таблицу.

Таблица ссылок на модули. В ней содержится список смещений имен модулей, хранящихся в таблице импортируемых имен. Каждый вход в таблице есть двубайтное последовательное число.

Таблица импортируемых имен. В ней записаны имена модулей, импортируемых в исполняемый файл. Каждый вход состоит из двух частей – байта длины строки и собственно строки.

Таблица входов. В ней содержатся группы точек входа в исполняемый файл.

Эти группы создаются редактором связей и последовательно пронумерованы (начиная с 1). Каждая группа начинается с двухбайтного заголовка, который содержит число входов в группе (00h – конец таблицы) и дополнительную информацию о сегменте (FFh – перемещаемый, FEh – вход относится к константе, определенной внутри модуля, иначе вход является индексом сегмента). Для перемещаемых сегментов каждый вход состоит из шести байт, а для фиксированных – из трех.

Таблица нерезидентных имен. Содержит имена экспортируемых функций, содержащихся в исполняемом файле. Эти имена не всегда остаются резидентными в памяти. Структура полностью совпадает со структурой таблицы резидентных имен.

Сегменты кода и данных. Если в сегменте кода содержатся вызовы функций, определенных в других сегментах, то для таких вызовов необходимо использовать таблицы перемещений. Они располагаются непосредственно за кодом или данными в сегменте. В двух первых байтах содержится число элементов таблицы.

– тип адресации (только сегмент, только смещение, или и то, и другое);

– тип перемещения (внутренняя ссылка, импортируемый порядковый номер, импортируемое имя);

– номер сегмента или порядковый ID (для внутренних ссылок);

– индекс таблицы ссылок или порядковый номер функции;

– индекс таблицы ссылок или смещение таблицы имен (для импортируемых имен).

Формат заголовка PE-executable EXE-файла

В состав старого заголовка входят:

– обычный EXE-заголовок (Таблица A-8);

– указатель на PE-заголовок (если в ЕХЕ-заголовке в начале таблицы перемещаемых элементов – по смещению 18h – стоит 40h или больше, то слово, расположенное по смещению 3С^ содержит смещение начала PE-заголовка);

В состав нового заголовка входят:

– PE-заголовок (Таблица A-9);

– таблица объектов (Таблица A-10);

– таблицы ресурсов, импортируемых и экспортируемых имен, настройки адресов.

DOS, функция 11h Найти первый совпадающий файл через FCB

DS:DX — адрес неоткрытого FCB (Таблица Б-2)

AL°OOh, если подходящее имя найдено

AL=FFh, если подходящего имени нет

В текущем оглавлении DOS происходит поиск файлов с именем, соот-

ветствующим заданному шаблону. При неудаче возвращается

AL=OFFh. Если имя найдено, AL очищается, в первый байт DTA поме-

щается номер дисковода (А — 1, В — 2 и так далее), а в следующие

32 байта помещается элемент оглавления для найденного файла.

Можно использовать при вызове расширенный FCB, чтобы выбирать

файлы с указанными атрибутами. В этом случае в DTA помещаются:

байт FFh, 7 байт нулей, номер диска и элемент оглавления. ,

Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители
Страница 8. Чтение/изменение корневого каталога

5.2.1 Чтение/изменение корневого каталога.

Каталоги диска подразделяются на корневой каталог (обсуждаемый
здесь) и подкаталоги (обсуждаемые в [5.2.3]). Когда пользователь
программы вводит имя какого-либо файла для работы, то бывает
полезным проверить, имеется ли этот файл на самом деле. Обычно
изменения в корневом каталоге производятся в ходе обычных файло-
вых операций или с помощью специальных функций DOS. Однако можно
работать с каталогом напрямую. Большая нужда в таком подходе
возникает при работе на языках высокого уровня, где утилиты DOS
по большей части недоступны.
Корневой каталог читается и изменяется загрузкой его в память
с использованием подхода, показанного в [5.4.2], когда читаются
абсолютные сектора диска. Эти операции не оставляют места между
секторами, когда они загружаются в память. Буфер, содержащий
данные сектора, может рассматриваться как набор 32-байтных полей
и пара указателей, которые могут использоваться для движения по
каталогу. Один указатель всегда кратен 32 и указывает на начало
элемента каталога. Второй указатель добавляется к первому и ука-
зывает на одно из полей в 32-байтном элементе. Данные в памяти
могут быть изменены требуемым образом, а затем весь буфер записы-
вается обратно на диск.
Имеется два метода чтения абсолютных секторов диска и в обоих
случаях только одно число отличает случаи чтения и записи. Пос-
кольку ошибка при записи на диск может легко повредить все содер-
жимое диска, то надо действовать аккуратно. Сначала убедитесь,
что операция чтения сектора выполнена верно во всех отношениях.
После этого можно попробовать записать на диск, взяв точную копию
кода, использованного для чтения и заменив только номер функции.

Высокий уровень.

Бейсик выводит каталог по команде FILES. При этом выводятся
только имена файлов. FILES дает каталог накопителя по умолчанию;
для указания накопителя напишите FILES «A:» и т.д. Можно потребо-
вать, чтобы была выведена информация об отдельном файле, написав
FILES «A:MYFILE.DAT». Как и в операционной системе имя файла
может содержать * и ?. Оператор FILES снабжает информацией поль-
зователя, но иногда наличие некоторого файла хочет проверить
программа. В этом случае надо открыть файл для последовательного
чтения и если он не существует, то возникнет ошибочная ситуация.
Смотрите обсуждение и пример в [5.2.3].

Для поиска любой информации, относящейся к корневому каталогу,
используйте процедуру на машинном языке, приведенную в [5.4.2].
После того как данные каталога в памяти, установите указатели,
как описано выше, и ведите поиск по буферу памяти с 32-байтным
интервалом. Нижеприведенный пример ищет элемент каталога, относя-
щийся к стертому файлу. Когда файл стирается, то первый байт
имени файла заменяется на E5H, но все остальное содержимое данно-
го элемента остается неизменным. Конечно, при этом освобождается
дисковое пространство, отведенное файлу в FAT. Процедура восста-
новления удаленного файла должна знать номер начального кластера
в FAT. В примере этот 2-байтный номер кластера помещается со
смещением 26 в элементе каталога.

100 »’чтение секторов каталога в память с сегмента &H2000
110 INPUT «Enter erased filename «, FNAME$
120 IF LEN(FNAME$) > 12 THEN BEEP: GOTO 110
130 IF INSTR(FNAME$,».») > 9 THEN BEEP: GOTO 110
140 »’дополнение имени и расширения файла нулями
150 Y = INSTR(FNAME$,».»)
160 IF Y = 0 THEN FIRSTPART$ = FNAME$: GOTO 230
170 EXTEN$ = LEFT$(FNAME$, LEN(FNAME$) — Y)
180 EXTEN$ = EXTEN$ + STRING$(3 — LEN(EXTEN$),»»)
190 FIRSTPART$ = RIGHT$(FNAME$,Y — 1)
200 FIRSTPART$ = FIRSTPART$ + STRING$(8 — LEN(FIRSTPART$),»»)
210 FNAME$ = FIRSTPART$ + EXTEN$
220 »’теперь хотим найти удаленный файл
230 M >240 DIRPTR = 0 ‘указатель на элемент
250 FIELDPTR = 26 ‘указатель на номер кластера
260 FOR N = 1 TO 112 ‘на дискете 112 элементов
270 X$ = «» ‘чистим X$
280 FOR M = 0 TO 10 ‘читаем имя файла из каталога
290 X$ = X$ + PEEK(DIRPTR + M) ‘берем по символу
300 NEXT ‘
310 IF X$ = FNAME$ THEN 340 ‘совпадает с введенной строкой
320 NEXT ‘если нет, то следующий
330 PRINT «Too late — file entry obliterated»: END ‘уже нет
340 X = PEEK(DIRPTR + FIELDPTR) ‘нашли его, берем 1-й байт и
350 Y = PEEK(DIRPTR + FIELDPTR + 1) ‘2-й байт номера кластера
360 Z = X + 256*Y ‘теперь номер кластера в Z

Средний уровень.

MS DOS обеспечивает две пары функций для поиска файлов, одна
для файлов, открытых методом управляющих блоков файла, а другая —
для файлов, открытых методом дескриптора файлов. Одна из функций
каждой пары ищет первое появление имени файла в каталоге, а дру-
гая ищет последующие появления, когда в имени файла содержатся
джокеры. Только метод, использующий дескриптор файла позволяет
искать подкаталоги.

Функция 11H прерывания 21H ищет первое появление файла. Уста-
новите DS:DX на неоткрытый FCB и выполните функцию. При возврате

AL будет содержать 0, если файл найден, и FF — если нет. DTA
заполняется информацией из каталога. Для обычных FCB первый байт
DTA содержит номер накопителя (1 = A и т.д.), а следующие 32
байта содержат элемент каталога. Для расширенного FCB первые 7
байтов файла копируются в первые 7 байтов расширенного FCB, вось-
мой байт указывает на накопитель, а следующие 32 байта — элемент
каталога.

;—в сегменте данных
FCB DB 1,’NEWDATABAK’,25DUP(0)

;—ищем файл
MOV AH,11H ;функция поиска в каталоге
LEA DX,FCB ;указываем на FCB
INT 21H ;ищем
CMP AL,0 ;успешно?
JNE NO_FILE ;если нет, то процедура обработки ошибки
LEA BX,DTA ;теперь DS:BX указывает на элемент каталога

После использования функции 11H можно использовать функцию 12H
для поиска следующих подходящих элементов, когда имя файла содер-
жит джокеры. В данном случае в имени файла допустим только символ
«?», но не «*». Эта функция работает в точности так же, как и
первая, и если найден второй файл, то информация о первом файле в
DTA будет уничтожена повторной записью.

Метод дескриптора файлов:

Функция 4EH прерывания 21H ищет файл с данным именем. DS:DX
должны указывать на строку, дающую путь файла. Например, B:\EURO-
PE\FRANCE\PARIS указывает на файл PARIS. Строка может содержать
до 63 символов и завершаться символом ASCII 0. Имя файла может
содержать джокеры, включая как «?», так и «*». Поместите атрибут
файла в CX; если он обычный то 0, в противном случае проконсуль-
тируйтесь в [5.2.6] относительно значений атрибута.
При возврает устанавливается флаг переноса, если файл не най-
ден. Если файл найден, то функция заполняет DTA информацией о
файле. Отметим частный случай использования DTA методом дескрип-
тора файлов — обычно, DTA используется функциями MS DOS для рабо-
ты через FCB. Первые 21 байт DTA зарезервированы DOS для поиска
следующих совпадающих файлов. Двадцать второй байт дает атрибут
файла, за ним следуют два байта, содержащие время и еще два байта
содержащие дату. Следующие 4 байта содержат размер файла (младшее
слово сначала). И, наконец, дается имя файла в виде строки пере-
менной длины, заканчивающейся байтом ASCII 0. Точка (ASCII 46)
разделяет имя и расширение и не один из этих элементов не запол-
нен пробелами.

;—в сегменте данных
PATH DB ‘B:FRANCE\PARIS\4EME’,0

;—ищем файл
MOV AH,4EH ;номер функции
LEA DX,PATH ;DS:DX указывают на путь
MOV CX,0 ;обычный атрибут файла
INT 21H ;ищем файл
JC NO_FILE ;уход, если не найден
LEA BX,DTA ;DS:BX указывают на DTA
MOV AL,[BX]+21 ;теперь атрибут файла в AL

Следующее появление имени файла (когда используются джокеры)
ищется с помощью функции 4FH прерывания 21H. Она готовится в
точности так же, как и функция 4EH, при этом указатель DTA не
должен меняться. Когда других совпадений не найдено, то устанав-
ливается флаг переноса, а в AX появляется 18.

Dos fn 11h: найти 1 й совпадающий файл через fcb

Ассемблер? Это просто! Учимся программировать (FAQ)
______________________________________

Вопросы, которые поступили от подписчиков рассылки
«Ассемблер? Это просто! Учимся программировать»

Дата выхода: 2001-08-16

Здравствуйте!
Значит, история такая: мой приятель купил винт Quantum AS на 10 гигов. И принёс мне — временно, пока он не купит все остальные части компа. А у меня его не видно.
BIOS-то этот винт детектит, а вот Виндоуз — ни в какую. Я джамперы и так и сяк ставил — безуспешно.
Быть может, дело в моей матплате Acorp для Pentium MMX ?
Она у меня старая, 1997 года. Если так, то мне перед тем, как тоже винт покупать, и матплату сменить? (А заодно и процессор, и корпус с AT на ATX. )
Кстати, какую лучше брать матплату для Дюрона?
Спасибо за внимание.
Константин.

Привет!
А ты его отформатировал? Если нет, то вначале иди запускай fdisk, создавай логические диски, а потом форматируй их с помощью
format disk:
Если хочешь, чтобы весь диск можно было одним куском отформатировать в программе fdisk надо согласиться на поддержку больших дисков( >2ГБ).

Отправил эксперт: Александр
Эксперт отправил ответов (всего): 65

Экспертная группа: Модели, виды и типы компьютеров (hard)

Пишу программу работающую в реальном режиме времени
Использую прерывание по таймеру
Основная программа пишется на Паскале (Borland Pascal 7.0)
Иницилизация таймера и обработка прерывания на ассемблере.
В обработке прерывания работа с lpt-портом. И. проблема :
добавление команд out dx,al (время выполнения по некоторым
данным на 486 машине — 10 тактов, а у меня Celeron 433) приводит к изменению промежутка времени между прерываниями. Я в шоке! Помогите — горит проект и меня ждет жестокая расправа.
Ниже привожу исходник.

Не знаю, что у меня хорошего получилось, но лучше, думаю, сделать так (см. приложение, там все написано).

Отправил эксперт: Василий
Эксперт отправил ответов (всего): 20

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Здравствуйте, Broken Sword, уважаемые эксперты,

_программа_ должна трассировать Int 21h и сама принимять решение о местонахождении заданной функции.
Весь процесс проходит _автоматически_ без человеческого вмешательства.

Ко всему, возможно, добавляются защиты от трассировки, вроде уничтожения векторов 1 и 3, проверка и подмена флагов трассировки, запись «мусора» в регистры TR1, TR2 . и т.д.

С нетерпением жду ответа,
Андрей.

Не понял, ты хочешь, чтобы я тебе такую программу написал или у тебя есть идеи, но требуются консультации?

Отправил эксперт: Василий
Эксперт отправил ответов (всего): 21

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

У меня проблема с завершением работы Windows98, мне приходится два раза повотрять операцию «Выключить компьютер». Каким образом мне изабивться от этого глюка?

Здравствуйте, Владимир!
Могу сходу предложить три варианта действий:
1.Проверить машину стандартным regclean-ом (можно взять на download.com.
2.Проверить машину с помощью приблуды типа Нортон Виндоктор.
Если ошибка была связана со сбоем в реестре — должно помочь.
3.Вариант, связанный с запуском приложения типа AVX ICQ checker.
(Мне также приходится по два раза выключаться, после первого раза он выкидывает aqmon, после второго — собственно выключается.Но если пользуешься ICQ и не хочешь заловить вируса луче перестраховаться, не так ли =|;о) ).

Отправил эксперт: RANDOM
Эксперт отправил ответов (всего): 10

Экспертная группа: Пользовательская работа с Windows

Как взять с дискетв серийный номр?
Как записать в файл текстовую информациь?

Описание: CX байт данных записывается в файл или на устройство с описателем,
заданным в BX. Данные берутся из буфера, адресуемого через DS:DX.
Данные записываются, начиная с текущей позиции указателя
чтения/записи файла.

Используйте функцию 42H LSEEK, чтобы установить указатель файла,
если необходимо (OPEN сбрасывает указатель в 0).

Обновляет указатель чтения/записи файла, чтобы подготовиться
к последующим операциям последовательного чтения или записи.

Вы должны всегда сравнивать возвращаемое значение AX (число запи-
санных байт) с CX (запрошенное число байт для записи).
если AX = CX, запись была успешной
если AX Эксперт отправил ответов (всего): 22

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Здравствуйте!
Значит, история такая: мой приятель купил винт Quantum AS на 10 гигов. И принёс мне — временно, пока он не купит все остальные части компа. А у меня его не видно.
BIOS-то этот винт детектит, а вот Виндоуз — ни в какую. Я джамперы и так и сяк ставил — безуспешно.
Быть может, дело в моей матплате Acorp для Pentium MMX ?
Она у меня старая, 1997 года. Если так, то мне перед тем, как тоже винт покупать, и матплату сменить? (А заодно и процессор, и корпус с AT на ATX. )
Кстати, какую лучше брать матплату для Дюрона?
Спасибо за внимание.
Константин.

Здравствуйте, Константин!
Просто напросто у тебя жёсткий диск новый, поэтому на нем нет никакой файловой системы(для Win — обычно Fat 32, для Пингвина — Ext2+Swap).
Тебе надо найти FDisk(стандартная для Win) или Partition Magic, затем создать основной раздел дос на нём(или ещё дополнительный), тогда всё будет в порядке.
А, вообще, обычно к жёсткому диску при покупке должна прилагаться дискета с утилитой установки жесткого диска!

Отправил эксперт: Orlando
Эксперт отправил ответов (всего): 10

Экспертная группа: Модели, виды и типы компьютеров (hard)

Как взять с дискетв серийный номр?
Как записать в файл текстовую информациь?

Здравствуйте, fagot!
По первому вопросу читай выпуск 056 этой рассылки, там есть как найти серийный номер винта(и дискеты соответственно)
По второму вопросу
Для открытия функция 3dh
al=Access mode(0-read, 1-write, 2-both)
DS:DX=ASCIIZ строка полного пути файла
Выход
если бит С=1 AX=Error code, иначе AX=Handle
Тогда для записи используем ф-цию 40h
AX=40h
BX=Handle
CX=кол-во байт для записи
DS:DX-адрес буфера
Выход
если бит С=1 AX=кол-во реально записанных байт

Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 76

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Здравствуйте!
Значит, история такая: мой приятель купил винт Quantum AS на 10 гигов. И принёс мне — временно, пока он не купит все остальные части компа. А у меня его не видно.
BIOS-то этот винт детектит, а вот Виндоуз — ни в какую. Я джамперы и так и сяк ставил — безуспешно.
Быть может, дело в моей матплате Acorp для Pentium MMX ?
Она у меня старая, 1997 года. Если так, то мне перед тем, как тоже винт покупать, и матплату сменить? (А заодно и процессор, и корпус с AT на ATX. )
Кстати, какую лучше брать матплату для Дюрона?
Спасибо за внимание.
Константин.

Здравствуйте, Константин!
Кажись ты прав- твоя мать видит винты до 8 гиг
Хотя! Попробуй его на отдельный шлейф, причем строго Primary Master
А загружайся с другого, то есть типа с D
Для Дюрона лучше всего Soltek, хотя Canyon лучше, но дороже
И не пожалей лишних 3$ на корпус, возьми CodeGen- он пошире, охлаждение получше, и Дюрон с хорошим вентилятором точно влезет.

Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 77

Экспертная группа: Модели, виды и типы компьютеров (hard)

с ЛЕМЪ РЮЙЮЪ ОПНАКЕЛЮ. лЮРЕПХМЯЙЮЪ ОКЮРЮ Asus CUEP2-M. мЮЯРПНИЙХ ОН СЛНКВЮМХЧ ГЮБНДЯЙХЕ. оНД DOCНЛ (МЕ ГЮЦПСФЮЪ Windows) Ъ МЕ БХФС ЛШЬЭ Х ХМНЦДЮ ОПНОЮДЮЕР ЙКЮБХЮРСПЮ. щРН ВРН МЕХЯОПЮБМНЯРЭ ЛЮРЕПХ ХКХ ЦДЕ-РН Ъ МЕСЯКЕДХК, МН МЮЯРПНИЙХ РН ГЮБНДЯЙХЕ. (Х ОНРНЛ МЮЯЙНКЭЙН Ъ ГМЮЧ ЛШЬЭ Х ЙКЮБХЮРСПЮ МХЙЮЙ МЕМЮЯРПЮХБЮЧРЯЪ Б BIOS). нОЕПЮЖХНММСЧ ЯХЯРЕЛС ОЕПЕЯРЮБХК, ПЮГЗЕЛШ ЛШЬХ Х ЙКЮБХЮРСПШ PS/2

гДПЮБЯРБСИРЕ, юКЕЙЯЕИ!
хГБХМХРЕ ГЮ БЯРПЕВМШИ БНОПНЯ, Ю бШ ДПЮИБЕП ДКЪ ЛШЬХ СЯРЮМЮБКХБЮКХ?
ю ЙКЮБХЮРСПЮ ХМНЦДЮ РЮЙ ЯЕАЪ БЕДёР.

Отправил эксперт: яРЮЯ
Эксперт отправил ответов (всего): 6

Экспертная группа: лНДЕКХ, БХДШ Х РХОШ ЙНЛОЭЧРЕПНБ (hard)

КАК
МОЖНО
ПОЛУЧИТЬ
ВСЮ
рассылку с начала.
Чтобы не повторять вопросы
не отнимать время
и неказаться совсем глупым

С уважением к Твоей просветительной деятельности
Олег

Олег Никуленков!
http://www.kalashnikoff.ru/, ссылка Ассемблер, там архив — ВСЕ номера рассылки «Ассемблер, это просто», и 33 (помоему) FAQ из 60 полных, все FAQ можно получить токо осенью

Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 51

Экспертная группа: Общие вопросы по программированию на Ассемблере под Win32

гДПЮБЯРБСИРЕ, СБЮФЮЕЛШЕ ЩЙЯОЕПРШ.
мЕДЮБМН С МЮЯ КНЙЮКЭМСЧ ЯЕРЭ ОПНРЪМСКХ. яПЮГС ФЕ БНГМХЙКЮ ОПНАКЕЛЮ, Р.Й. Ъ ПЮАНРЮЧ ХГ ОНД ДБСУ НЯЕИ — WinXP RC2 Х Win98. рЮЙ БНР, ЯСРЭ ОПНАКЕЛШ Б РНЛ, ВРН ХГ ОНД БХМ98 БЯё МНПЛЮКЭМН ПЮЯЬЮПХБЮЕРЯЪ, БЯё ОНКЭГНБЮРЕКХ ОЮОЙХ БХДЪР, Б МЕЙНРНПШЕ ЛНЦСР ОХЯЮРЭ ЦДЕ ПЮГПЕЬЕМН, Ю ОНД WinXP ОНВЕЛС РПЕАСЕРЯЪ ОЮПНКЭ ОПХВЕЛ Й ОЮОЙЕ IPC$. лНФЕР ЩРН МЕДНДЕКЙХ ЙЮЙХЕ, БЕДЭ НТХЖХЮКЭМНЦН ПЕКХГЮ ЕЫЕ МЕ БШЬКН. ю ЛНФЕР БЯё-РЮЙХ ЛНФМН ЙЮЙ-МХАСДЭ МЮЯРПНХРЭ ?
P.s. вРН-РН ОНУНФЕЕ МЮАКЧДЮЕРЯЪ Х Я Win2000 Professional SP1.
я СБЮФЕМХЕЛ, дЛХРПХИ.

гДПЮБЯРБСИРЕ, дЛХРПХИ!
б НОЕПЮЖХНМЙЮУ НЯМНБЮММШУ МЮ NT (NT 4.0, w2k, winXP) ОПХЛЕМЪЕРЯЪ ДПСЦЮЪ ЯХЯРЕЛЮ ОПНБЕПЙХ ОНКЭГНБЮРЕКЪ. р.Е. ВРНАШ ОНКСВХРЭ ДНЯРСО Й ПЮЯЬЮПЕМНЛС ПЕЯСПЯС МЕНАУНДХЛН ББНДХРЭ МЕ РНКЭЙН ОЮПНКЭ МН Х КНЦХМ. ЩРН ЛНФМН ОПХ ОНЛНЫХ ЯОЕЖХЮКЭМНИ ОПНЦПЮЛЙХ (e.g. Essential NetTools ЙНЛОЮМХХ «TamosSoft» www.tamos.com), КХАН МЮДН КНЦХМХРЭЯЪ Б win’9x Я ХЛЕМЕЛ Х ОЮПНКЕЛ ОНКЭГНБЮРЕКЪ ЙНРНПНЛС МЮ WinXP ПЮГПЕЬёМ ДНЯРСО Й ПЮЯЬЮПЕМНЛС ПЕЯСПЯС.
ю КСВЬЕ ОНЯРЮБЭРЕ ЯЕПБЕП, ОСРЮМХЖШ АСДЕР ЛЕМЭЬЕ.

Отправил эксперт: яРЮЯ
Эксперт отправил ответов (всего): 8

Экспертная группа: оНКЭГНБЮРЕКЭЯЙЮЪ ПЮАНРЮ Я Windows

Как взять с дискетв серийный номр?
Как записать в файл текстовую информациь?

Уважаемый fagot! Вот пример проги, замени ‘Текст’
text_mes db ‘Текст’ на любой свой, и придумай имя файла
filename db ‘c:\text.txt’,0

Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 52

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Здравствуйте!
У меня усть вопросики :)
1) Где можно найти tasm32.exe, tlink32.exe & import32.lib
2) Сейчас я пользуюсь Масмом, но у меня есть проблемка с созданием экзешника вот, то что я делаю.
файл Digger.asm:

includelib c:\masm\lib\kernel32.lib
extrn _imp_ExitProcess@4:dword
ExitProcess equ _imp_ExitProcess@4

.386
.model flat,stdcall
option casemap:none
.data
;Инициализированные данные
.data?
;Неинициализированные данные
.code
start: ;Точка входа

push 0
call ExitProcess ;Выход из программы
end start
—————-
А потом я запускаю.
masm /Ic:\masm digger.asm
link digger.obj,digger.exe
—————-
Выводиться сообщение об шибке.
Microsoft (R) Segmented Executable Linker Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992. All rights reserved.

List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : warning L4021: no stack segment

digger.obj(digger.asm) : error L2029: ‘_IMP_EXITPROCESS@4’ : unresolved external

There was 1 error detected
———————-
Может я неправильно создал kernal32.lib.
НО kernal32.lib от Visual C++ не подошёл.
ии я сделал
implib.exe kernal32.lib kernal32.dll
(предварительно скопировав dll в ту директорию где запускал implib :)

Я думаю что это связано с ограничением длинны имен, которое присутствует в некоторых объектных файлах.

Или (что вернее) в данном случае у тебя просто отсутствует глобальная переменная _imp_ExitProcess@4

Или же masm все имена приводит к нижнему регистру.

Или же все вместе. :) не знаю точно.

Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html — Операционная система с нуля!)
Эксперт отправил ответов (всего): 53

Экспертная группа: Работа с MASM/TASM

А существуют ли разные всякие ассемблерные библиотеки? Где их можно поискать? (может есть сайты специальные?) Мне например нужен оконный интерфейс для ассемблерной проги. Не как Turbo Vision конечно, поскромнее, но желательно готовый.
PS прилиновать TV не предлогайте :)

Ну и обленился же ты!
Самому состряпать слабо?! Можно даже, используя объекты, благо TASM их поддерживает. Могу если что с этим помочь.

Отправил эксперт: Василий
Эксперт отправил ответов (всего): 23

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Здравствуйте,уважаемые эксперты. ) :)
Ответьте, пожалуйста вот на такой вопрос:)как создать файл, что-нить записать в него, удалить файл с диска, памяти, переместить файл, скопировать?

Здравствуйте, Веселый Эдик!

Как много ты сразу хочешь знать.

Обрати свое внимание на следующие функции DOS:

int 21h
fn 3ch Create file via handle
fn 3dh Open file via handle
fn 3eh Close file via handle
fn 3fh Read from file via handle
fn 40h Write to file via handle
fn 41h Delete file

Функции копирования файлов в досе не существует. реализуется через чтение/запись.

Помимо функций, работающих черех handle есть еще функции работающие через FCB, ноони гораздо неудобнее!.

Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html — Операционная система с нуля!)
Эксперт отправил ответов (всего): 54

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Подписаться на рассылки

Форма подачи вопроса

ВНИМАНИЕ. Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!

Нажимайте кнопку «Отправить» только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!

Ведущий рассылки,

По вопросам сотрудничества, рекламы и спонсорства обращайтесь:

MS-DOS для программиста

3. Файловая система DOS

Теперь, после того как мы познакомились с логической структурой диска, можно приступить к изучению одной из самых развитых систем MS-DOS — файловой системы .

Сервис файловой системы доступен программе через прерывание INT 21h . Многочисленные функции этого прерывания, относящиеся к файловой системе, можно разбить на группы:

  • получение справочной информации;
  • работа с каталогами;
  • работа с файлами.

Функции первой группы позволяют программе получать разностороннюю информацию, касающуюся текущего состояния дисковой системы — текущий диск и текущий каталог, размер свободного места на диске, параметры логического диска и т. д.

Функции второй группы выполняют все необходимые операции с каталогами — создание, переименование, уничтожение каталогов, изменение текущего каталога.

Третья группа функций позволяет программе выполнять практически любые операции над файлами — создание, удаление, чтение или запись, переименование, копирование, пересылка.

Заметим, что существует два класса функций для работы с файлами. Первый класс использует управляющие блоки файлов FCB . Эти функции использовались в MS-DOS версий 1.х и имеют в настоящее время чисто исторический интерес. Вам они, скорее всего, никогда не будут нужны, за исключением одного случая — если вам надо составить программу, способную работать под управлением MS-DOS версии 1.0 или 1.1. В этой книге мы не будем упоминать функции, предназначенные для работы с файлами через FCB.

Второй класс использует идентификаторы файла (file handle). Этот класс функций впервые появился в MS-DOS версии 2.0.

Смысл идентификатора файла индекса очень прост. Для того чтобы приступить к работе с файлом, программа должна вызывать определенную функцию DOS, «открывающую» этот файл. Процесс открытия файла заключается в присвоении ему определенного числа (идентификатора) и выполнении некоторых других инициализирующих действий. Для выполнения каких-либо операций с файлом программа, вызывая соответствующую функцию MS-DOS, должна указать идентификатор этого файла.

Первые пять идентификаторов зарезервированы операционной системой:

Номер функции Название Входные данные Выходные данные Описание
Функции ввода/вывода данных
01H Ввод с клавиатуры AH = 01H AL = символ, полученный из стандартного ввода Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). При распознавании Ctrl-Break выполняется INT 23H. Замечание: Ввод расширенных клавиш ASCII (F1-F12, pgup, курсор и т.п.) требует двух обращений к этой функции. Первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.
02H Вывод на дисплей AH = 02H DL = символ, выводимый на стандартный вывод Посылает символ из DL на стандартный вывод. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции. При обнаружении Ctrl-Break выполняется INT 23H.
03H Вспомогательный ввод AH = 03H AL = символ, полученный со стандартного вспомогательного устр-ва Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1 или AUX и возвращает этот символ в AL. Замечание: Ввод не буферизуется и должен опрашиваться (не управляется прерываниями). При запуске DOS порт AUX (COM1) инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битовые слова. Команда DOS MODE используется для установки иных характеристик.
04H Вспомогательный вывод AH = 04H DL = символ, записываемый на стандартное вспомогательное устр-во Посылает символ в DL на стандартное вспомогательное устройство, COM1 или AUX.
05H Вывод на принтер AH = 05H DL = символ, записываемый на стандартный принтер Посылает символ в DL на стандартное устройство принтера, обычно LPT1. Замечание: Команда DOS «MODE» может перенаправить этот вывод в последовательный порт.
06H Консольн. ввод-вывод AH = 06H DL = символ (от 0 до 0feh), посылаемый на стандартный вывод DL = 0ffh запрос ввода со стандартного ввода ZF = Сброшен (NZ), если символ готов при запросе ввода При DL = 0ffh выполняет ввод с консоли «без ожидания», возвращая взведенный флаг нуля (ZF), если на консоли нет готового символа. Если символ готов, сбрасывает флаг ZF (NZ) и возвращает считанный символ в AL. Если DL не равен 0ffh, то DL направляется на стандартный вывод. Замечание: Не проверяет Ctrl-Break. Вызывайте дважды для расширенного ASCII.
07H Нефильтрующий консольный ввод без эха AH = 07H AL = символ, полученный через стандартный ввод Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. Не фильтрует: Не проверяет на Ctrl-Break, backspace и т.п. Замечания Вызывайте дважды для ввода расширенного символа ASCII. Используйте функцию 0bh для проверки статуса (если не хотите ожидать нажатия клавиши).
08H Консольный ввод без эха AH = 08H AL = символ, полученный через стандартный ввод Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. При обнаружении Ctrl-Break выполняется прерывание INT 23H. Замечание: Вызывайте дважды для ввода расширенного символа ASCII.
09H Выдать строку на дисплей AH = 09H DS:DX = адрес строки, заканчивающейся символом ‘$’ (ASCII 24H) Строка, исключая завершающий ее символ ‘$’, посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02H Display Char. Обычно, чтобы перейти на новую строку, включают в текст пару CR/LF (ASCII 0dh и ASCII 0ah). Строки, содержащие ‘$’, можно выдать через 40H Write Handle (BX=0).
0ah Ввод строки в буфер AH = 0ah DS:DX = адрес входного буфера (смотри ниже) Буфер содержит ввод, заканчивающийся символом CR (ASCII 0dh) При входе буфер по адресу DS:DX должен быть оформлен так:
Max * * * *

Где max – максимальная допустимая длина ввода (от 1 до 254)

При выходе буфер заполнен следующим образом:

Max Len T E X T 0dh

Где len– действительная длина данных без завершающего CR (здесь — 04H). Символы считываются со стандартного ввода вплоть до CR (ASCII 0dh) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).

Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. Последний символ в буфере — всегда CR (который не засчитан в байте длины). Символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редактирования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т.д. Большинство расширенных кодов ASCII игнорируются. При распознавании Ctrl-Break выполняется прерывание INT 23H (буфер остается неизменным).

0bh Проверить статус ввода AH = 0bh AL = 0ffh, если символ доступен со стандартного ввода Проверяет состояние стандартного ввода. При распознавании Ctrl-Break выполняется INT 23H. Замечание: используйте перед функциями 01H 07H и 08H, чтобы избежать ожидания нажатия клавиши. Эта функция дает простой неразрушающий способ проверки Ctrl-Break в процессе длинных вычислений или другой обработки, обычно не требующей ввода. Это позволяет вам снимать счет по нажатию Ctrl-Break.
0ch Ввод с очисткой AH = 0ch AL = номер функции ввода DOS (01H, 06H, 07H, 08H или 0ah) Очищает буфер опережающего ввода стандартного ввода, а затем вызывает функцию ввода, указанную в AL. Это заставляет систему ожидать ввод очередного символа. Следующие значения допустимы в AL: 01H ввод с клавиатуры 06H ввод с консоли 07H Нефильтрующий без эха 08H ввод без эха 0ah буферизованный ввод
Операции с файлами
3ch Создать файл через описатель (дескриптор) AH = 3ch DS:DX = адрес строки ASCIIZ с именем файла CX = атрибут файла AX = код ошибки если CF установлен и описатель файла если ошибки нет DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Файл создается в указанном (или умалчиваемом) оглавлении Файл открывается в режиме доступа чтение/запись Вы должны сохранить описатель (дескриптор, handle) для последующих операций. Если файл уже существует: При открытии файл усекается до нулевой длины Если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут) CONFIG.SYS специфицирует число доступных описателей в системе Используйте функцию 5bh создать Новый файл, если вы не хотите перекрывать (усекать) существующий файл.
3dh Открыть описатель файла AH = 3dh DS:DX = адрес строки ASCIIZ с именем файла AL = режим открытия AX = код ошибки если CF установлен и описатель файла если нет ошибки. DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Файл должен существовать. См. Функцию 3ch (создать файл). Файл открывается в выбранном режиме доступа / режиме открытия для совместимости с DOS 2.x и избежания сетевых режимов, задавайте: AL = 0 чтобы открыть для чтения AL = 1 чтобы открыть для записи AL = 2 чтобы открыть для чтения и записи Указатель чтения/записи устанавливается в 0. См. 42H (LSEEK) Вы должны сохранить описатель (handle) для последующих операций Разделение файлов должно быть активизировано (команда DOS SHARE), если запрашивается открытие в одном из режимов разделения. CONFIG.SYS специфицирует число доступных описателей файлов.
3eh Закрыть описатель файла AH = 3eh BX = описатель файла AX = код ошибки если CF установлен BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфера сбрасываются, и оглавление обновляется корректными размером, временем и датой. Из-за нехватки описателей файлов (максимум 20, по умолчанию 8), вам может понадобиться закрыть часть умалчиваемых описателей, как, например, описатель 3 (стандартный AUX).
3fh Читать файл через описатель AH = 3fh BX = описатель файла DS:DX = адрес буфера для чтения данных CX = число считываемых байт AX = код ошибки если CF установлен или число действительно прочитанных байт CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX. Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла, подготавливая его к последующим операциям чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт): Если AX = CX, (и CF сброшен) — чтение было корректным без ошибок Если AX = 0, достигнут конец файла (EOF) Если AX При чтении с устройства — входная строка имеет длину AX байт При чтении из файла — в процессе чтения достигнут EOF Замечания: Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю выполнять свое собственное блокирование. Удобно использовать эту функцию для чтения стандартных описателей, таких как описатели стандартного в/в, взамен многочисленных буферизующих и посимвольных FCB-функций ввода. Когда вы читаете с устройства, AX возвращает длину считанной строки с учетом завершающего возврата каретки CR (ASCII 0dh).
40H Писать в файл через описатель AH = 40H BX = описатель файла DS:DX = адрес буфера, содержащего записываемые данные CX = число записываемых байт AX = код ошибки если CF установлен AL = число реально считанных байт (лучший тест для ошибок) CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX. Данные записываются, начиная с текущей позиции указателя чтения/записи файла. Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям последовательного чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи). Если AX = CX, запись была успешной Если AX Замечание: Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю осуществлять собственное блокирование. Удобно использовать эту функцию для вывода на умалчиваемые устройства, такие как стандартный вывод, взамен использования различных функций вывода текста.
42H Установить указатель файла – LSEEK AH = 42H BX = описатель файла CX:DX = на сколько передвинуть указатель: (CX 65536) + DX AL = 0 переместить к началу файла + CX:DX AL = 1 переместить к текущей позиции + CX:DX AL = 2 переместить к концу файла + CX:DX AX = код ошибки если CF установлен DX:AX = новая позиция указателя файла (если нет ошибки) Перемещает логический указатель чтения/записи к нужному адресу. Очередная операция чтения или записи начнется с этого адреса. Замечание: Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее слово: действительная длина (DX 65536) + AX.
Операции с файловой системой
0dh Сброс диска AH = 0dh Сбрасывает (пишет на диск) все файловые буфера. Если размер файла изменился, такой файл должен быть предварительно закрыт (при помощи функций 10H или 3eh).
0eh Установить текущий диск DOS AH = 0eh DL = номер диска (0=A, 1=B и т.д.), который становится текущим AL = общее число дисководов в системе Диск, указанный в DL, становится текущим (умалчиваемым) в DOS. Проверка: используйте функцию 19H «дать текущий» для проверки. В регистре AL возвращается число дисководов всех типов, включая твердые диски и «логические» диски (как B: в 1-floppy системе).
19H Дать текущий диск DOS AH = 19H AL = номер текущего умалчиваемого диска (0=A, 1=B, и т.д.) Возвращает номер дисковода текущего умалчиваемого диска DOS.
1bh Дать информацию FAT (текущий диск) AH = 1bh DS:BX = адрес байта FAT > Возвращает информацию о размере и типе умалчиваемого диска. Размер диска в байтах = (DX*AL*CX). Ищите свободную память функциями 36h Disk Free или 32h Disk Info. Версии: DOS 1.x держит FAT в памяти и возвращает DS:BX => FAT. DOS 2.0+ может держать в памяти лишь порцию всей FAT. Предупреждение: Эта функция изменяет содержимое регистра DS.
1ch Дать информацию FAT (любой диск) AH = 1ch DL = номер диска (0=текущий, 1=A, и т.д.) DS:BX = адрес байта FAT > Аналогична функции 1bh Get FAT Cur, с той разницей, что регистр DL указывает диск, для которого вы хотите получить информацию. Версии: Недоступна для DOS 1.x.
32H Дать информацию DOS о диске AH = 32H DL = номер диска (0=текущий, 1=A, и т.д.) AL = 0 если DL задавал корректный диск FF = 0ffh если диск задан неверно DS:BX = адрес блока информации диска для запрошенного устройства Возвращает блок информации, представляющей интерес для приложений и утилит, выполняющих доступ к диску, поддерживаемый драйверами устройств, на уровне секторов. Некоторые дисководы (особенно незагружаемые) функционируют исключительно через свои драйверы устройств. Такие диски могут содержать неверную информацию в корневой записи и таблице разделов, что делает очень трудным определение, например, размера корневого оглавления, числа таблиц FAT, и т.п. Блок информации диска содержит все данные такого рода в хорошо форматированной структуре. Это может быть единственным способом определить адрес драйвера устройства. Предупреждение: Изменяет сегментный регистр DS. Эта недокументированная функция может измениться в будущих версиях.
36H Дать свободную память диска AH = 36H DL = номер диска (0=текущий, 1=A, и т.д.) AX = 0ffffh, если AL содержал неверный номер диска или число секторов на кластер, если нет ошибок. BX = доступных кластеров. CX = байт на сектор. DX = всего кластеров на диске. Возвращает данные для подсчета общей и доступной дисковой памяти. Если в AX возвращено 0ffffh, значит, вы задали неверный диск. Иначе, свободная память в байтах = (AX*BX*CX) всего памяти в байтах = (AX*CX*DX)
39H Создать новое оглавление — MKDIR AH = 39H DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0 если диск и/или корневой путь опущены, то принимаются по умолчанию. Подоглавление создается и связывается с существующим деревом. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не создается.
3ah Удалить оглавление – RMDIR AH = 3ah DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0. Если диск и/или корневой путь опущены, то принимаются по умолчанию. Подоглавление удаляется из структуры оглавления. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не удаляется. Замечание: Оглавление не должно содержать файлов и подоглавлений и не должно быть связано возможными ограничениями DOS (например, не должно быть задействовано в активных командах JOIN или SUBST).
3bh Установить умалчиваемое оглавление DOS – CHDIR AH = 3bh DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0. Если диск и/или корневой путь опущены, то принимаются по умолчанию. Указанное подоглавление для указанного диска становится текущим (умалчиваемым) оглавлением DOS для этого (или текущего) диска. Если флаг CF установлен при возврате, то AX содержит код ошибки, и текущее оглавление для выбранного диска не изменяется.
41H Удалить файл AH = 41H DS:DX = адрес строки ASCIIZ с именем файла AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Имя файла не может содержать обобщенные символы (‘?’ и ‘*’). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изменить этот атрибут через функцию 43H CHMOD.
43H Установить/опросить атрибут файла – CHMOD AH = 43H DS:DX = адрес строки ASCIIZ с именем файла AL — код подфункции: = 0 — извлечь текущий атрибут файла AL = 1 — установить атрибут файла CX = новый атрибут файла (для подфункции 01H) AX = код ошибки если CF установлен CX = текущий атрибут файла (для подфункции 00H) DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Атрибут файла извлекается или устанавливается, согласно коду в AL. Замечание: Чтобы спрятать оглавление, используйте CX=02H (а не 12H, как вы, возможно, ожидали, см. описание файловой системы FAT, аттрибуты файлов).
45H Дублировать описатель файла – DUP AH = 45H BX = существующий описатель файла AX = новый описатель файла, дублирующий оригинал или код ошибки если CF установлен. Создает дополнительный описатель файла, ссылающийся на тот же поток в/в, что и существующий описатель. Любое продвижение указателя чтения/записи для одного описателя действует на его дубликат — включая любые операции чтения, записи или перемещения указателя посредством функции 42H LSEEK. Новый описатель наследует ограничения режима открытия оригинала. Эта функция используется с одной главной целью: вы можете закрыть описатель, заставляя DOS записать файловые буфера. Такой способ DUP/CLOSE — быстрее, чем закрытие и повторное открытие файла. Оставить комментарий – для сохранения файла без его закрытия – CTRL+S
46H Переназначить описатель – FORCDUP AH = 46H BX = целевой описатель файла (должен уже существовать) CX = исходный описатель файла (должен уже существовать) AX = код ошибки если CF установлен Заставляет описатель файла (handle) ссылаться на другой файл или устройство. Описатель в CX (источник) закрывается, если он открыт, а затем становится дубликатом описателя в BX (назначения). Иными словами, описатели в CX и BX будут ссылаться на один и тот же физический файл или устройство. Используется для переназначения стандартного в/в. Пример: Откроем файл «C:\STDOUT.TXT» через функцию 3dh Open File и получим описатель (например, 05). Установим BX=05, CX=01 и вызовем эту функцию. (замечание: описатель 01 — это предопределенный описатель «стандартного выходного устройства»). Теперь можно вызвать функцию 3eh Close File и закрыть handle 05. Можно обращаться к файлу STDOUT.TXT через описатель 01. Стало быть, дисковый файл «C:\STDOUT.TXT» будет отныне получать весь вывод, создаваемый всеми процессами (текущим и порожденными) через любую функцию символьного в/в DOS, так же как и любой вывод в описатель файла 01 через функцию DOS 40H. Когда вы выходите в COMMAND.COM, предопределенные описатели устанавливаются на обычные устройства (например, описатель 01 устанавливается на «CON»).
47H Дать умалчиваемое оглавление DOS AH = 47H DS:SI = адрес локального буфера для результирующего пути (64 байта) DL = номер диска (0=текущий, 1=A, и т.д.) AX = код ошибка если CF установлен В пользовательский буфер по адресу DS:SI помещается в форме ASCIIZ путь текущего умалчиваемого оглавления для диска, указанного в DL. Путь возвращается в формате: «путь\оглавление»,0. Не подставляется впереди буква диска, а сзади не подставляется символ «\». Например, если текущим является корневое оглавление, эта функция вернет вам пустую строку (DS:[SI] = 0).
4eh Найти 1-й совпадающий файл AH = 4fh DS:DX = адрес строки ASCIIZ с именем файла (допускаются ? И *) CX = атрибут файла для сравнения AX = код ошибки если CF установлен DTA = заполнена данными (если не было ошибки) DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они подразумеваются по умолчанию. Обобщенные символы и ? Допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA, как показано ниже: Замечания: Атрибут файла обычно используется во «включающем» поиске. Если вас интересуют как файлы, так и оглавления, установите бит атрибута 4 (т.е. Attr | 10H). См. Атрибут файла для полной информации. Типичная последовательность, используемая для поиска всех подходящих файлов: Используйте вызов 1ah, чтобы установить DTA на локальный буфер (или используйте умалчиваемую DTA в PSP по смещению 80H) Уст. CX=атрибут, DS:DX => ASCIIZ диск, путь, обобщенное имя Вызовите функцию 4eh (Найти 1-й) Если флаг CF указывает ошибку, вы закончили (нет совпадений) Уст. DS:DX => DTA (или на данные, которые вы скопировали из DTA после вызова функции 4eh) Повторять Обработать имя файла и данные по адресу DS:DX Вызвать функцию 4fh (Найти следующий) Пока CF=1 не покажет, что совпадений больше нет
4fh Найти следующий совпадающий файл AH = 4fh DS:DX = адрес данных, возвращенных предыдущей 4eh Найти 1-й файл AX = код ошибки если CF установлен DTA = заполнена данными DS:DX указывает на 2bh-байтовый буфер с информацией, возвращенной функцией 4eh Найти 1-й (либо DTA, либо буфер, скопированный из DTA). Используйте эту функцию после вызова 4eh. Следующее имя файла, совпадающее по обобщенному имени и атрибуту файла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. Функцию 4eh о структуре файловой информации в буфере, заполняемом DOS).
56H Переименовать/переместить файл AH = 56H DS:DX = адрес старого ASCIIZ имени (путь/имя существующего файла) ES:DI = адрес нового ASCIIZ имени (новые путь/имя) AX = код ошибки если CF установлен DS:DX и ES:DI указывают на строки ASCIIZ: «d:\путь\имяфайла»,0. Старое имя DS:DX должно отвечать существующему файлу и не может содержать обобщенных символов. Диск и путь необязательны (если опущены, они принимаются по умолчанию). Новое имя ES:DI должно описывать НЕ существующий файл. Если указан диск, он должен быть тем же, что и в старом имени. Если диск или путь опущены, принимаются текущие умолчания. Если старое и новое имя содержат разные пути (явно или принятые по умолчанию), то элемент оглавления для файла ПЕРЕМЕЩАЕТСЯ в оглавление, указанное в новом имени. Замечание: Если ID диска в старом имени отличается от текущего диска DOS, не забывайте указывать такой же ID диска в новом имени.
57H Установить/опросить дату/время файла AH = 57H AL = 0 чтобы получить дату/время файла = 1 чтобы установить дату/время файла BX = описатель файла (handle) CX = (если AL=1) новая отметка времени в формате время/дата файла DX = (если AL=1) новая отметка даты в формате время/дата файла AX = код ошибки если CF установлен CX = отметка времени файла в формате время/дата файла DX = отметка даты файла в формате время/дата файла BX должен содержать описатель открытого файла (см. 3ch или 3dh ). Укажите подфункцию, 0 или 1, в регистре AL. DX и CX задаются в формате памяти; например, младшие 8 бит даты находятся в DH.
5ah Создать уникальный временный файл AH = 5ah DOS 3.0+ DS:DX = адрес строки ASCIIZ с диском и путем (заканчивается \) CX = атрибут файла AX = код ошибки если CF установлен и описатель файла (если нет ошибки) DS:DX = (не изменяется) становится полным ASCIIZ-именем нового файла Открывает (создает) файл с уникальным именем в оглавлении, указанном строкой ASCIIZ, на которую указывает DS:DX. COMMAND.COM использует эту функцию, когда создает временные «канальные» файлы, используемые при переназначении ввода-вывода. Описание пути должно быть готово к присоединению в его конец имени файла. Вы должны обеспечить минимум 12 байт в конце строки. Сама строка должна быть заполнена в одной из форм: «d:\путь\»,0 (указаны диск и путь) ИЛИ «d:»,0 (умалчиваемое оглавление диска) ИЛИ «d:\»,0 (корневое оглавление диска) ИЛИ «»,0 (умалчиваемые диск и оглавление) После возврата строка DS:DX будет дополнена именем файла. Замечания: DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Если имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя. Создаваемые таким способом файлы — по существу НЕ ВРЕМЕННЫЕ, и их следует удалять посредством функции DOS 41H , когда они не нужны. Версии: Доступна, начиная с DOS 3.0
5bh Создать новый файл AH = 5bh DOS 3.0+ DS:DX = адрес строки ASCIIZ с именем файла CX = атрибут файла AX = код ошибки если CF установлен и описатель файла если ошибок нет DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Этот вызов идентичен функции DOS 3ch CREATE, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует. Файл открывается для чтения/записи в совместимом режиме доступа
5ch Блокировать/разблокировать доступ к файлу AH = 5ch DOS 3.0+ AL = подфункция: 0 = заблокировать область файла = 1 = разблокировать ранее захваченную область BX = описатель файла (handle) CX:DX = смещение ((CX 65536) + DX) от начала файла SI:DI = длина блокируемой области ((SI 65536) + DI) байт AX = код ошибки если CF установлен Блокирует или освобождает доступ к участку файла, идентифицируемого описателем в BX. Область файла, начинающаяся по логическому смещению CX:DX и имеющая длину SI:DI, блокируется (захватывается) или разблокируется (освобождается). Смещение и длина обязательны. Разделение файлов ДОЛЖНО быть активизировано (командой SHARE), иначе функция вернет код ошибки «неверный номер функции.» Блокировка действует на операции чтения, записи и открытия со стороны порожденного или конкурирующего процесса. При попытке такого доступа (и режиме доступа , определенном при OPEN как «режим разделения», который запрещает такой доступ), DOS отвергает операцию через вызов INT 24H (обработчик критических ошибок) после трех попыток. DOS при этом выдает сообщение «Abort, Retry, Ignore». Рекомендуемое действие — НЕ пытаться читать файл и ожидать кода ошибки. Вместо этого попытайтесь заблокировать область и действуйте в соответствии с кодом возврата. Это позволяет избежать довольно неустойчивого состояния DOS, связанного с выполнением INT 24H. Блокировка за концом файла не является ошибкой. Вы можете захватить весь файл, задав CX=0, DX=0, SI=0ffffh, DI=0ffffh и AL=0. При освобождении, смещение и длина участка должны точно совпадать со смещением и длиной захваченного участка. Замечания: Дублирование описателя через 45H или 46H дублирует и блокировки. Даже если во время OPEN выбран режим доступа Inherit, механизм блокировки не даст никаких привилегий доступа порожденным процессам, созданным функцией 4bh EXEC (они трактуются как отдельные). Важно, чтобы все блокировки файла были сняты до завершения программы. Если вы используете блокировку, особо отслеживайте вызовы INT 23H (выход Ctrl-Break) и INT 24H (выход по критической ошибке), чтобы снять блокировки до действительного завершения программы. Рекомендуется освобождать блокировки как можно скорее. Всегда блокируйте, обрабатывайте файл и освобождайте блокировку одной операцией. Версии: Доступна, начиная с DOS 3.0
Операции с системой прерываний
25H Установить вектор прерывания AH = 25H AL = номер прерывания DS:DX = вектор прерывания: адрес программы обработки прерывания Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS здесь знает, что вы делаете, и гарантирует, что в момент записи прерывания будут заблокированы. Предупреждение: Не забудьте восстановить DS (если необходимо) после этого вызова.
26H Построить PSP AH = 26H DX = адрес сегмента (параграфа) для нового PSP CS = сегмент PSP, используемого как шаблон для нового PSP Устанавливает PSP для порождаемого процесса по адресу DX:0000. Текущий PSP (100H байт, начиная с CS:0), копируется в DX:0 Поле memtop соответственно корректируется Векторы Terminate, Ctrl-Break и Critical Error копируются в PSP из векторов прерываний INT 22H, INT 23H и INT 24H после этого вы можете загрузить программу с диска и передать ей управление посредством FAR JMP. Замечание: Если вы перехватываете INT 21H, позаботьтесь о помещении в стек корректного CS:IP. Еще лучше использовать функцию 4ch (EXEC).
2ah Дать системную дату AH = 2ah AL = день недели (0=Вск, 1=Пнд. 6=Суб) DOS 3.0+ CX = год (1980 до 2099) DH = месяц (1 до 12) DL = день (1 до 31) Возвращает текущую дату, как она известна системе. Версии: DOS 2.x не гарантирует возврата в AL значения дня; все версии 1.0+ возвращают правильный день недели. Версии до 2.1 имеют проблемы с переходом даты.
2bh Установить системную дату AH = 2bh CX = год (1980 до 2099) DH = месяц (1 до 12) DL = день (1 до 31) AL = 0 если дата корректна Устанавливает системную дату DOS.
2ch Дать время DOS AH = 2ch CH = часы (0 до 23) CL = минуты (0 до 59) DH = секунды (0 до 59) DL = сотые доли секунды (0 до 99) Возвращает текущее время, как оно известно системе. Замечание: Поскольку системные часы имеют частоту 18.2 тиков в секунду (интервал 55мс), DL имеет точность 0.04 сек.
2dh Установить время DOS AH = 2dh CH = часы (0 до 23) CL = минуты (0 до 59) DH = секунды (0 до 59) DL = сотые доли секунды (0 до 99) AL = 0 если время корректно Устанавливает системное время DOS.
2eh Установить/сбросить переключатель верификации AH = 2eh AL = 0 отключить верификацию = 1 включить верификацию Устанавливает, должна ли DOS верифицировать (считывать обратно) каждый сектор, записываемый на диск. Это замедляет операции записи на диск, но гарантирует максимальную надежность записи. Функция 56H Get Verify возвращает текущий статус верификации DOS.
2fh Дать адрес текущей DTA AH = 2fh ES:BX = адрес начала текущей DTA Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться сохранить адрес DTA, а впоследствии восстановить его посредством функции 1ah «Уст. DTA». Замечание: Эта функция изменяет сегментный регистр ES.
30H Дать номер версии DOS AH = 30H AL = старший номер версии AH = младший номер версии BX,CX = 0000H DOS 3.0+ Возвращает в AX значение текущего номера версии DOS. Например, для DOS 3.2, в AL возвращается 3, в AH — 2. Замечание: Если в AL возвращается 0, можно предполагать, что работает DOS более ранней версии, чем DOS 2.0. Версии: DOS 2.x не гарантирует очистки регистров CX и BX.
31H Завершиться и остаться резидентным – KEEP AH = 31H AL = код выхода DX = объем памяти, оставляемой резидентной, в параграфах Выходит в родительский процесс, сохраняя код выхода в AL. Код выхода можно получить через функцию 4dh Wait. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт = DX 16). Эта функция перекрывает функцию INT 27H, которая не возвращает код выхода и неспособна установить резидентную программу, большую 64K.
33H Установить/опросить статус Ctrl-Break AH = 33H AL = 0 чтобы опросить текущий статус контроля Ctrl-Break AL = 1 чтобы установить статус контроля Ctrl-Break DL = требуемый статус (0=OFF, 1=ON) (только при AL=1) DL = текущий статус (0=OFF, 1=ON) Если AL=0, в DL возвращается текущий статус контроля Ctrl-Break. Если AL=1, в DL возвращается новый текущий статус. Когда статус ON, DOS проверяет на Ctrl-Break с консоли для большинства функций (исключая 06H и 07H). При обнаружении, выполняется INT 23H (если оно не перехватывается, то это снимает процесс). Когда статус OFF, DOS проверяет на Ctrl-Break лишь при операциях стандартного в/в, стандартной печати и стандартных операциях AUX.
35H Дать вектор прерывания AH = 35H AL = номер прерывания (00H до 0ffh) ES:BX = адрес обработчика прерывания Возвращает значение вектора прерывания для INT (AL); то есть, загружает в BX 0000:[AL*4], а в ES — 0000:[(AL*4)+2]. Предупреждение: Эта функция изменяет сегментный регистр ES.
44H Управление устройством в/в – IOCTL AH = 43H AL = код подфункции: AL = 0ch — (зарезервировано) Прочие = (в зависимости от подфункции) AX = код ошибки если CF установлен или иное значение (в зависимости от подфункции) IOCTL предоставляет метод взаимодействия с устройствами и получения информации о файлах. Входные параметры и выходные значения варьируются в зависимости от кода подфункции в регистре AL. Версии: Подфункции 0-7 . DOS 2.1+ Подфункции 8,0bh . DOS 3.0+ Подфункции 9,0ah . DOS 3.1+ Подфункции 0dh,0eh,0fh . DOS 3.2+ ———————————— Подфункция 00H: Запросить флаги информации об устройстве Вход: BX= описатель файла (устройство или дисковый файл) Выход: DX= IOCTL Инф об устр ———————————— Подфункция 01H: установить флаги информации об устройстве Вход: BX = описатель файла (устройство или дисковый файл) DX = IOCTL Инф об устр (DH должен быть нулевым) Выход: DX= IOCTL Инф об устр ———————————— Подфункция 02-03: читать (AL=02H) или писать (AL=03H) строку IOCTL на СИМВОЛЬНОЕ устр Вход: DS:DX = адрес буфера (чтение) или данных (запись) CX= число передаваемых байт BX= описатель файла (только устройство — не файл!) Выход: AX= код ошибки если CF установлен ———————————— Подфункция 04-05: читать (AL=04H) или писать (AL=05H) строку IOCTL на БЛОЧНОЕ устр Вход: DS:DX = адрес буфера (чтение) или данных (запись) CX = число передаваемых байт BL = : Вход: CL = код действия 40H = установить параметры устройства 60H = дать параметры устройства 41H = писать дорожку логического устройства 61H = читать дорожку логического устройства 42H = форматировать дорожку с верификацией 62H = Верифицировать дорожку логического устройства DS:DX=> адрес пакета данных IOCTL Выход: AX= код ошибки если CF установлен DS:DX=> пакет данных может содержать информацию возврата. ———————————— Подфункция 0eh: Выяснить, назначил ли драйвер устройства несколько логических устройств одному физическому устройству. [DOS 3.2+] Вход: BL= . Эта функция позволяет вам сообщать DOS, что диск с указанным >
48H Распределить память (дать размер памяти) AH = 48H BX = запрошенное количество памяти в 16-байтовых параграфах AX = код ошибки если CF установлен BX = размер доступной памяти в параграфах (если памяти не хватает) AX = сегментный адрес распределенного блока (если нет ошибок) Распределяет блок памяти длиной BX параграфов, возвращая сегментный адрес этого блока в AX (блок начинается с AX:0000). Если распределение неудачно, устанавливается CF, в AX возвращается код ошибки, а BX содержит максимальный размер доступной для распределения памяти (в параграфах). Чтобы определить наибольший доступный кусок, общепринято устанавливать BX=0ffffh перед вызовом. Распределение завершится с ошибкой, возвратив размер максимального блока памяти в BX. Замечание: Когда процесс получает управление через функцию 4bh EXEC, вся доступная память уже распределена ему.
49H Освободить распределенный блок памяти AH = 49H ES = сегментный адрес (параграф) освобождаемого блока памяти AX = код ошибки если CF установлен Освобождает блок памяти, начинающийся с адреса ES:0000. Этот блок становится доступным для других запросов системы. Вообще говоря, вы должны освобождать лишь те блоки памяти, которые вы получили через функцию 48H распределить память. Родитель отвечает за освобождение памяти порожденных процессов. Тем не менее, ничто не препятствует вам освобождать память чужих процессов.
4ah Сжать или расширить блок памяти AH = 4ah ES = сегмент распределенного блока памяти BX = желаемый размер блока в 16-байтовых параграфах AX = код ошибки если CF установлен BX = наибольший доступный блок (если расширение неудачно) Изменяет размер существующего блока памяти. Когда программа получает управление, функция 4bh EXEC уже распределила блок памяти, начиная с PSP, который содержит всю доступную память. Чтобы освободить память для запуска порождаемых процессов, блок памяти, начинающийся с PSP, необходимо сначала сжать. Замечание: Функция 31H (KEEP) и INT 27H (TSR) сжимают блок по адресу PSP.
4bh Выполнить или загрузить программу – EXEC AH = 4bh DS:DX = адрес строки ASCIIZ с именем файла, содержащего программу ES:BX = адрес EPB (EXEC Parameter Block — блока параметров EXEC) AL = 0 = загрузить и выполнить AL = 3 = загрузить программный оверлей AX = код ошибки если CF установлен Предоставляет средства одной программе (родителю) вызвать другую программу (ребенка), которая по завершению возвратит управление родителю. DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск или путь опущены, они подразумеваются по умолчанию. ES:BX указывает на блок памяти, подготовленный как EPB, формат которого зависит от запрошенной подфункции в AL. AL=0 EXEC: так как родительская программа первоначально получает всю доступную память в свое распоряжение, вы должны освободить часть памяти через функцию 4ah до вызова EXEC (AL=0). Обычная последовательность: 1. Вызовите функцию 4ah с ES=сегменту PSP и BX=минимальному объему памяти, требуемой вашей программе (в параграфах). 2. Подготовьте строку ASCIIZ с именем вызываемого программного файла и установите DS:DX на первый символ этой строки. 3. Подготовьте блок параметров EXEC со всеми необходимыми полями. 4. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных, адресуемых через регистр CS (CS — это единственная точка для ссылок после того, как EXEC вернет управление от ребенка). 5. Выдайте вызов EXEC с AL=0. 6. Восстановите локальные значения SS и SP. 7. Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC. 8. Восстановите DS, ES и локальную DTA, если необходимо. 9. Проверьте код выхода через функцию 4dh WAIT (если надо). Все открытые файлы дублируются, так что ребенок может обрабатывать данные как через описатели файлов, так и через стандартный в/в. Режимы доступа описателей дублируются, но любые активные блокировки файлов не будут относиться к ребенку. См. Функцию 5ch. После возврата из ребенка, векторы INT 22H Terminate, INT 23H Ctrl-Break и INT 24H Critical Error восстанавливаются в их предыдущие значения. AL=3 LOAD: Эта подфункция используется для загрузки «оверлея». DS:DX указывает на ASCIIZ имя файла, а ES:BX указывает на «LOAD»-версию блока параметров EXEC. Главное значение этой подфункции в том, что она считывает заголовок EXE и выполняет необходимые перемещения сегментов, как это требуется для программ .EXE. Замечания: Эта функция использует программу-загрузчик из COMMAND.COM, который транзитен в DOS 2.x (и, возможно, уже перекрыт программой). В этом случае возникнет ошибка, если DOS не найдет файл COMMAND.COM. Вы должны обеспечить корректную строку COMSPEC= в окружении перед вызовом этой функции. Вместо разбора собственных FCB (как требуется для EPB), вы можете найти удобным загрузить и выполнить вторичную копию файла COMMAND.COM, используя опцию /C. Например, чтобы выполнить программу FORMAT.COM, установите DS:DX на адрес строки ASCIIZ: «\command.com»,0 и установите EPB+2 на сегмент и смещение следующей строки команд: 0eh,»/c format a:/s/4″,0dh такой вторичный интерпретатор команд использует очень мало памяти (около 4K). Вы можете поискать в окружении DOS строку COMSPEC=, чтобы установить точное местоположение файла COMMAND.COM.
4ch Завершить программу – EXIT AH = 4ch AL = код выхода Возвращает управление от порожденного процесса его родителю, устанавливая код выхода, который можно опросить функцией 4dh WAIT. Управление передается по адресу завершения в PSP завершающейся программы. Векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненным в родительском PSP. Замечание: Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы.
4dh Дать код выхода программы – WAIT AH = 4dh AL = код выхода последнего завершившегося процесса AH = 0 — нормальное завершение AH = 1 — завершение через Ctrl-Break AH = 2 — завершение по критической ошибке устройства AH = 3 — завершение через функцию 31H KEEP Возвращает код выхода последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.
54H Дать переключатель верификации DOS AH = 54H AL = 0 если верификация выключена (OFF) AL = 1 если верификация включена (ON) Возвращает текущий статус верификации записи DOS. Если в AL возвращается 1, то DOS считывает обратно каждый сектор, записываемый на диск, чтобы проверить правильность записи. Функция DOS 2eh позволяет установить/изменить режим верификации.
59H Дать расширенную информацию об ошибке AH = 59H DOS 3.0+ BX = 0000H (номер версии: 0000H для DOS 3.0, 3.1 и 3.2) AX = расширенный код ошибки (0, если не было ошибки) BH = класс ошибки BL = предлагаемое действие CH = сфера (где произошла ошибка) Используйте эту функцию, чтобы уточнить, что предпринять после сбоя функции DOS по ошибке (только DOS 3.0+ ). Вызывайте ее: В обработчике критических ошибок INT 24H После любой функции INT 21H , возвратившей Carry-флаг После вызова FCB-функции, возвратившей AL=0ffh Версии: Эта функция отсутствует в версиях до DOS 3.00. В DOS 2.x, когда флаг CF указывает на ошибку, используйте логику вашей программы, чтобы отреагировать на ошибку. В DOS 3.0+, когда функция возвращает CF=1, рекомендуем вам игнорировать код ошибки, возвращенный в AX, вызвать эту функцию и выполнить действие, предложенное в BL.
5eh Разные сетевые функции AH = 5eh DOS 3.1+ AL = подф.: 0=дать имя машины (узла) в сети AL = 2=установить стартовую строку сетевого принтера AL = 3=извлечь стартовую строку сетевого принтера Прочие = (зависят от подфункции) AX = код ошибки если CF установлен Прочие = (зависят от подфункции) Эти функции доступны при установленной IBM PC Network Program. Версии: Доступны, начиная с DOS 3.1 ———————————— Подф. 00H: Извлекает имя машины (узла), как оно известно в сети. Вход: DS:DX=> буфер пользователя для ASCIIZ сетевого имени Выход: DS:DX=> буфер, содержащий сетевое имя CH= 0=имя не определено; иначе=имя определено CL= номер имени NETBIOS (если CH ненулевой) AX= код ошибки если CF установлен Замечание: Сетевое имя — 15-симв. (дополненная пробелами) строка ASCIIZ ———————————— Подф. 02H: Задает настроечную строку, посылаемую на принтер каждый раз, когда эта машина выдает результаты на сетевой принтер. Вход: DS:SI=> буфер, содержащий настроечную строку (до 64 байт) CX= длина настроечной строки BX= индекс в списке назначений, отвечающий принтеру Выход: AX= код ошибки если CF установлен ———————————— Подф. 03H: Извлекает настроечную строку принтера, заданную ранее посредством DOS Fn 5eh подф. 02H. Вход: DS:DI=> 64-байтовый буфер пользователя для результата bx= индекс принтера в списке назначений Выход: ES:DI=> буфер, заполненный настроечной строкой CX= длина настроечной строки AX= код ошибки если CF установлен Замечание: Поскольку индекс в списке назначений может измениться в любой момент, используйте функцию 5fh подф. 02H, чтобы получить индекс непосредственно перед вызовом этой функции.
5fh Переназначение устройств в сети AH = 5fh DOS 3.1+ AL = подф.: 2=получить элемент списка переназначений устройств = 3=переназначить сетевое устройство = 4=отменить переназначение сетевого устройства Прочие = (зависят от подфункции) AX = код ошибки если CF установлен Эти функции доступны при установленной IBM PC Network Program. Версии: Доступны, начиная с DOS 3.1 ———————————— Подф. 02H: Извлекает элемент из списка переназначений сетевых устройств. Вход: DS:DI=> 128-байтовое ASCIIZ локальное имя устр. («LPT1»,0) ES:DI=> 128-байтовый буфер с ASCIIZ сетевым именем BX= индекс в списке назначений Выход: DS:DI=> ASCIIZ локальное имя устройства (напр., «LPT1»,0) ES:DI=> ASCIIZ сетевое имя BL= тип устр: 3=принтер; 04=файл ‘устройство’ BH= статус устр: бит 0=1 -неверное устр.; 0=верное CX= сохраненный параметр (при NETBIOS, всегда 0) AX= код ошибки если CF установлен DX,BP = (изменены) Замечание: обычно эту функцию вызывают с BX=0, затем повторяют вызовы, увеличивая значение BX, пока DOS не вернет ошибку 12H (больше нет файлов). ———————————— Подф. 03H: этот вызов определяет имена оглавлений для сети и перенаправляет доступ на сетевые принтеры. Замеч: доступ к принтеру переназначается на уровне ROM-BIOS INT 17H. Вход: DS:SI = ASCIIZ имя исходного устройства ES:DI = ASCIIZ назначение (сетевой путь с паролем) BL= тип устр: 03=принтер; 04=файл ‘устройство’ CX= параметр для вызывающего (задавайте 0 для NETBIOS) Выход: AX= код ошибки если CF установлен Замеч: если BL=03, то источник задает ASCIIZ-имя принтера (например, «LPT1»,0). Назначение кодируется в форме: [\\computername\],0,[password],0. Если пароль начинается с 00, считается, что пароля нет. Если BL=04, то источник задает ASCIIZ-имя диска (например, «F:»,0), а назначение — ASCIIZ-имя пути. После вызова этой функции, локальные обращения к этому диску переназначаются на выбранные имя компьютера и путь. ———————————— Подф. 04H: Отменить сетевое переназначение для указанного устройства. Вход: DS:SI=> ASCIIZ-имя устройства или ,0), то переназначение этого диска прекращается, и ID диска восстанавливает свое предыдущее значение.
Идентификатор Описание
Стандартное устройство ввода (клавиатура)
1 Стандартное устройство вывода (консоль)
2 Стандартное устройство для вывода сообщений об ошибках (консоль)
3 Стандартное устройство последовательного ввода/вывода, обычно асинхронный адаптер COM1
4 Стандартное печатающее устройство (обычно параллельный порт LPT1)

Зарезервированные идентификаторы всегда доступны программе. Для устройств, соответствующих этим идентификаторам, не требуется выполнять операцию открытия.

Одно из преимуществ файловых функций второго класса (использующих идентификаторы файлов) — возможность одновременной работы с файлами, расположенными в разных каталогах.

Состав функций MS-DOS, предназначенных для работы с файловой системой, достаточно разнообразен. Только в очень редких случаях, связанных в основном с организацией защиты информации от несанкционированного доступа, вам может потребоваться доступ к диску на более низком уровне. Если ваша программа использует для работы с файлами только документированные функции операционной системы, ее работа не будет зависеть от аппаратных средств компьютера, а также от программы, с помощью которой были созданы разделы диска MS-DOS.

3.1. Получение справочной информации

В этом разделе мы опишем наиболее нужные, на наш взгляд, функции MS-DOS, предназначенные для получения справочной информации о состоянии дисковой системы.

Текущий диск и текущий каталог

В любой момент времени программа может определить текущий диск или текущий каталог, а также сменить текущий диск или текущий каталог. Для этого она должна использовать специальные функции прерывания INT 21h .

Для того чтобы узнать номер текущего диска, программа может воспользоваться функцией 19h:

На входе: AH 19h
На выходе: AL Номер текущего устройства НГМД или НМД (0 — А:, 1 — В:, и т. д.).

Для установки текущего диска можно использовать функцию 0Eh, которая имеет следующие параметры вызова:

На входе: AH 0Eh
DL Номер устройства НГМД или НМД (0 — А:, 1 — В:, и т. д.)
На выходе: AL Общее количество дисковых устройств в системе. Эта величина соответствует параметру LASTDRIVE из файла CONFIG.SYS

Для того чтобы узнать текущий каталог, вы можете воспользоваться функцией 47h:

На входе: AH 47h
DL Номер устройства НГМД или НМД (0 — текущий, 1 — А:, 2 — В:, и т. д.)
DS:SI Адрес буфера для записи пути текущего каталога
На выходе: AX Код ошибки, если установлен флаг переноса CF

Буфер должен иметь размер не менее 64 байт. Функция 47h возвращает текущий каталог в формате ASCIIZ (то есть строку, закрытую двоичным нулем, например: «path\dirname»,0) без символа, обозначающего диск. Если текущим является корневой каталог, регистровая пара DS:SI будет указывать на нулевую строку (состоящую из одного двоичного нуля).

Функция 3Bh предназначена для установки текущего каталога:

На входе: AH 3Bh
DL Номер устройства НГМД или НМД (0 — текущий, 1 — А:, 2 — В:, и т. д.)
DS:DX Адрес буфера, содержащего путь к каталогу, который должен стать текущим
На выходе: AX Код ошибки, если установлен флаг переноса CF

Буфер может иметь максимальный размер 64 байт. Он должен содержать путь в формате ASCIIZ. Строка не должна содержать символ, обозначающий диск. Если текущим должен стать корневой каталог, строка должна состоять только из одного двоичного нуля.

Определение размера кластера и сектора

Функции MS-DOS могут помочь вам в получении информации, необходимой для организации доступа к диску на уровне секторов и кластеров. При этом вы будете избавлены от необходимости читать в память и анализировать содержимое загрузочного сектора логического диска.

Информация о таблице размещения файлов FAT для текущего диска может быть получена с помощью функции 1Bh прерывания INT 21h , имеющего следующие параметры вызова:

На входе: AH 1Bh
На выходе: DS:BX Адрес первого байта FAT . Это байт идентификации среды носителя данных, соответствует байту media в блоке параметров BIOS
DX Общее количество кластеров на диске
AL Количество секторов в одном кластере
CX Количество байт в одном секторе

Дополнительно эта функция возвращает общее количество кластеров на диске, размер кластера в секторах и размер сектора в байтах.

Для старых версий MS-DOS регистровая пара DS:BX указывала на FAT , считанный в память. Более поздние версии операционной системы могут содержать по этому адресу только часть таблицы размещения файлов .

Для получения аналогичной информации не о текущем, а о любом диске, используйте функцию 1Ch. Эта функция полностью аналогична предыдущей, за исключением того, что в регистре DL должен быть указан номер НГМД или НМД: 0 — текущий, 1 — А:, 2 — В: и т. д.

Определение размера свободного пространства

Если вас интересует размер свободного места на диске, вы можете его узнать с помощью функции 36h:

На входе: AH 36h
DL Номер устройства НГМД или НМД (0 — текущий, 1 — А:, 2 — В:, и т. д.)
На выходе: AX Количество секторов в кластере или 0FFFFh, если был задан неправильный номер устройства
BX Количество свободных кластеров на диске
CX Количество байт в одном секторе
DX Общее количество кластеров на диске

Эта функция возвращает в регистре AX число 0FFFFh, если вы неправильно указали номер устройства.

Блок управления устройством DDCB

При обсуждении векторной таблицы связи в предыдущем томе «Библиотеки системного программиста» мы рассказывали о блоках управления устройствами DDCB . Поле dev_cb векторной таблицы связи содержит дальний адрес цепочки этих блоков.

Для получения адреса блока DDCB можно воспользоваться недокументированной функцией 32h:

На входе: AH 32h
DL Номер устройства НГМД или НМД (0 — текущий, 1 — А:, 2 — В:, и т. д.)
На выходе: AL 0, если был задан правильный номер устройства;
0FFh, если был задан неправильный номер устройства
DS:BX Адрес блока DDCB

Для получения адреса блока DDCB текущего диска можно также воспользоваться недокументированной функцией 1Fh, которая имеет формат, аналогичный функции 32h, за исключением того, что для нее не надо задавать номер устройства в регистре DL.

Флаг прерывания

С помощью функции 33h программа может проверить или установить флаг прерывания при помощи комбинации клавиш и, кроме того, узнать номер диска, с которого выполнялась загрузка операционной системы:

На входе: AH 33h
AL Код операции:
0 — Проверить текущее состояние флага прерывания при помощи комбинации клавиш ;
1 — Установить флаг прерывания при помощи комбинации клавиш ;
5 — Определить номер диска, который был использован для загрузки операционной системы
DL Значение флага прерывания при помощи комбинации клавиш операции с кодом 1:0 — запретить прерывание,1 — разрешить прерывание
На выходе: DL Текущее состояние флага прерывания при помощи комбинации клавиш для операции с кодом 0; Номер диска, использованного для загрузки операционной системы для операции 5 (1 — А:, 2 — В:, и т. д.)

Сведения о диске, который был использован для загрузки операционной системы, могут понадобиться вам, например, для поиска файла командного интерпретатора.

Состояние флага прерывания при помощи комбинации клавиш влияет на возможность прервать выполнение программы. Если прерывание запрещено, MS-DOS проверяет эту комбинацию клавиш только при вызове функций стандартного ввода/вывода на консоль, принтер и последовательный порт. Если же прерывание разрешено, указанная комбинация клавиш проверяется и при вызове других функций MS-DOS. Если пользователь нажал комбинацию клавиш , операционная система выполняет прерывание INT 23h , которое завершает работу текущей программы.

Адрес области DTA

Функция 2Fh возвращает в регистровой паре ES:BX адрес текущей области DTA (Disk Transfer Area ), которая используется при поиске файлов в каталогах. Этот адрес необходим резидентным программам, о чем мы говорили в предыдущем томе «Библиотеки системного программиста».

Флаг проверки записи

Функция 54h позволяет программе узнать текущее состояние флага проверки записи информации на диск. В регистре AL эта функция возвращает текущее состояние флага.

Если содержимое регистра равно 1, после записи сектора операционная система считывает его для проверки. Разумеется, такая проверка снижает скорость работы программы. Если после вызова функции регистр AL содержит 0, проверка записи не выполняется.

Для установки флага проверки записи можно использовать функцию 2Eh. Перед вызовом функции в регистр AL необходимо занести новое значение флага проверки: 0 — проверка не нужна; 1 — должна выполняться проверка записанной информации.

Функции библиотеки Borland C++

Стандартная библиотека Borland C++ содержит несколько функций, облегчающих получение справочной информации о состоянии дисковой системы.

_dos_getdiskfree

Функция _dos_getdiskfree использует функцию 36h для получения информации о диске. Файл dos.h содержит такое описание этой функции:

Параметр drive задает номер используемого устройства: 0 — текущий, 1 — А:, и т. д.

Информация возвращается в структуре diskfree_t, которая определена также в файле dos.h:

Поля этой структуры описаны ниже:

Поле Описание
unsigned total_clusters Общее количество кластеров на диске
unsigned avail_clusters Количество свободных кластеров
unsigned sectors_per_cluster Количество секторов, занимаемых одним кластером
unsigned bytes_per_sector Размер сектора в байтах

_dos_getdrive и _dos_setdrive

Для получения номера текущего диска и для установки номера текущего диска можно использовать, соответственно, функции _dos_getdrive и _dos_setdrive .

Функция _dos_getdrive имеет следующий прототип:

Она пользуется функцией 19h для получения номера текущего диска, который записывается по адресу, задаваемому параметром drive. Значение 1 соответствует диску А:, 2 — В:, и т. д.

Функция _dos_setdrive предназначена для установки текущего диска и может быть использована для определения общего числа дисков в системе:

Параметр drive определяет текущий диск (1 — А:, и т. д.). В переменную, адрес которой передается через второй параметр, функция записывает общее количество логических дисков, установленных в системе. Функция _dos_setdrive использует функцию 0Eh прерывания INT 21h .

Программа DISKINF2

Для иллюстрации способов использования функций _dos_getdrive , _dos_setdrive и _dos_getdiskfree мы составили программу DISKINF2 (листинг 3.1).

Листинг 3.1. Файл diskinf2\diskinf2.cpp

3.2. Работа с каталогами

После форматирования логический диск содержит корневой каталог. Если диск форматируется как системный, в этом каталоге могут находится дескрипторы файлов операционной системы io.sys , msdos.sys , command.com .

Операционная система предоставляет программам пользователя удобный сервис для создания, уничтожения и переименования каталогов. Используя сведения, приведенные в этой книге, вы сможете изменять структуру каталогов сами, не прибегая к услугам MS-DOS. Однако это следует делать только тогда, когда операции с каталогами по каким-то причинам нежелательно выполнять с использованием функций операционной системы.

Создание каталога

Для создания каталога используйте функцию 39h прерывания INT 21h :

На входе: AH 39h
DS:DX Адрес строки в формате ASCIIZ, содержащей путь создаваемого каталога
На выходе: AL Код ошибки, если был установлен флаг переноса CF

Строка, адрес которой передается в регистрах DS:DX, может содержать полный путь, состоящий из имени диска и имени каталога, в котором должен быть создан каталог, или она может состоять только из одного имени каталога. В последнем случае каталог создается в текущем каталоге на текущем диске.

Размер строки с именем каталога не должен превышать по длине 64 байта.

Удаление каталога

Удалить существующий каталог можно с помощью функции 3Ah:

На входе: AH 3Ah
DS:DX Адрес строки в формате ASCIIZ, содержащей путь к каталогу
На выходе: AL Код ошибки, если был установлен флаг переноса CF

Необходимо заметить, что удалить можно только пустой каталог. И это понятно, так как если вы в обход операционной системы удалите непустой каталог, то описанные в этом каталоге файлы и каталоги будут потеряны, а занимаемое ими место невозможно будет распределить другим файлам.

Переименование каталога

Для изменения имени каталогов и файлов предназначена функция 56h:

На входе: AH 56h
DS:DX Адрес строки в формате ASCIIZ, содержащей старое имя каталога или файла
ES:DI Адрес строки в формате ASCIIZ, содержащей новое имя каталога или файла
На выходе: AL Код ошибки, если был установлен флаг переноса CF

Файл или каталог, который будет переименован, должен существовать. Если в имени не указан диск или каталог, то подразумевается, что файл или каталог находится в текущем каталоге на текущем диске. Напротив, каталог или файл с новым именем не должен существовать, иначе функция возвратит признак ошибки.

Эта функция может перемещать файл из одного каталога в другой, если вы укажите разные пути. Каталоги перемещать нельзя, их можно только переименовывать.

Функции библиотеки Borland C++

Стандартная библиотека Borland C++ содержат несколько функций, предназначенных для работы с каталогами.

getcwd

Функция getcwd предназначена для определения текущего каталога. Прототип этой функции описан в файле direct.h:

Первый параметр этой функции — адрес буфера, в который функция запишет строку, содержащую имя текущего каталога. Размер этого буфера определяется вторым параметром.

Если в качестве первого параметра указать NULL, функция динамически закажет буфер длиной n байт из области кучи и вернет его адрес. Эту память впоследствии необходимо будет освободить при помощи функции free.

Функция getcwd всегда возвращает указатель на буфер, содержащий текущий каталог.

mkdir , rmdir , chdir

Для создания и удаления каталогов, изменения текущего каталога имеются функции mkdir , rmdir , chdir .

Все эти функции имеют один параметр — путь каталога, который имеет тип (char *). В случае успешного выполнения операции функции возвращают 0, при ошибке — 1.

rename

Для переименования каталогов (и файлов) предназначена функция rename :

Способ ее использования очевиден: необходимо задать старое и новое имя каталога. Можно задавать как полный путь, так и просто имя каталога либо файла. В последнем случае операция переименования выполняется над каталогами или файлами, находящимися в текущем каталоге.

Функция может возвращать один из приведенных ниже кодов ошибки:

Код ошибки Описание
ENOENT Нет такого файла или каталога
EACCES Нет прав доступа
EXDEV Другой диск

Код ошибки EXDEV возвращается в том случае, когда программа указывает разные диски для старого и нового имен файлов или каталогов.

Важное замечание: если вы задаете полный путь в программе, составленной на С или С++, повторяйте символ ‘\’ два раза в строке пути. Это нужно для того, чтобы избежать конфликта с форматом представления констант в языке С. Например:

Программа DIRCTL

Приведем исходный текст небольшой программы DIRCTL (листинг 3.2), использующий перечисленные выше функции.

Листинг 3.2. Файл dirctl\dirctl.cpp

3.3. Поиск в каталогах

Часто перед программистом стоит задача определения содержимого каталога. При описании логической структуры диска мы приводили текст программы, выводящей на экран содержимого корневого каталога и других каталогов. Эта программа использовала загрузочный сектор логического диска и таблицу размещения файлов . Вы можете использовать такой способ, однако если вам не требуется информация о номерах начальных кластеров файлов и дескрипторы удаленных файлов, лучше применить специальные функции MS-DOS, предназначенные для поиска файлов в каталогах.

Это функции 4Eh и 4Fh.

Указанные выше функции используются вместе следующим образом:

Вначале вызывается функция 4Eh для поиска в каталоге файла, соответствующего образцу. В образце можно использовать символы «?» и «*», которые означают, соответственно, один любой символ и любое количество любых символов. Информация о найденном файле располагается в специальной области, распределенной каждой работающей программе — области DTA .

Затем для поиска остальных файлов, удовлетворяющих заданному ранее образцу, в цикле вызывается функция 4Fh. Условие завершения цикла — отсутствие в каталоге указанных файлов.

Функция 4Eh вызывается следующим образом:

На входе: AH 4Eh
CX Атрибуты файла, которые будут использованы при поиске. Будут найдены файлы, имеющие атрибут, заданный в регистре CX
DS:DX Адрес строки в формате ASCIIZ, содержащей путь каталога или файла
На выходе: AL Код ошибки, если был установлен флаг переноса CF

Функция 4Fh имеет следующие параметры вызова:

На входе: AH 4Fh
На выходе: AL Код ошибки, если был установлен флаг переноса CF

Обе функции устанавливают флаг переноса в том случае, когда каталог не содержит файлов, удовлетворяющих заданному критерию поиска.

Для работы с областью DTA в составе MS-DOS имеются две функции. Это функция 2Fh, позволяющая получить адрес области DTA (она возвращает этот адрес в регистрах ES:BX), и функция 1Ah, предназначенная для установки своей области DTA (адрес новой области DTA должен быть указан в регистрах DS:DX).

Напомним, что по умолчанию область DTA занимает 128 байт в префиксе сегмента программы PSP со смещением 80h.

В случае успешного поиска функции 4Eh и 4Fh помещают в DTA информацию о найденных файлах в следующем формате:

Смещение Размер Содержимое
20 Зарезервировано
21 1 Атрибуты найденного файла
22 2 Поле времени последнего обновления файла
24 2 Поле даты последнего обновления файла
26 4 Длина файла
30 13 Имя файла и расширение в формате ASCIIZ

Номер начального кластера, распределенного файлу или каталогу, невозможно получить с помощью функций 4Eh и 4Fh.

Стандартная библиотека Borland C++ содержат две функции, предназначенные для сканирования каталогов. Это _dos_findfirst и _dos_findnext .

Приведем прототипы этих функций, описанные в файле dos.h:

В этих функциях параметр pattern определяет образец для поиска файлов, параметр attr (атрибуты файла) используется в качестве дополнительного критерия поиска. Параметр found представляет собой указатель на структуру, в которую будет записываться информация о найденных файлах. Эта структура определена в файле dos.h:

Программа DIRLIST

Приведем текст программы просмотра содержимого каталога DIRLIST (листинг 3.3). Программа принимает из командной строки параметр — образец для показа файлов. Если вы укажете параметр *.*, будет выведена информация обо всех файлах. Можно задавать полный путь: c:\*.*.

Листинг 3.3. Файл dirlist\dirlist.cpp

3.4. Работа с файлами

В этом разделе мы рассмотрим функции MS-DOS, предназначенные для создания, открытия, удаления, переименования и перемещения файлов. Операции чтения из файла и записи в файл будут описаны в следующем разделе.

Создание файлов

Для создания файла предназначена функция 3Ch прерывания INT 21h. С помощью этой функции может быть создан файл как в текущем, так и в любом другом каталоге. Если файл с указанным именем уже существует, он обрезается до нулевой длины. Будьте осторожны при использовании этой функции — она может уничтожить файл.

Дополнительно функция 3Ch выполняет операцию открытия только что созданного файла, возвращая программе идентификатор файла. При создании файла программа может указать атрибуты файла.

Приведем параметры вызова функции создания файла:

На входе: AH 3Ch
CX Атрибуты создаваемого файла:
00h — обычный файл;
01h — только читаемый файл;
02h — скрытый файл;
04h — системный файл
DS:DX Адрес строки, содержащей путь к файлу
На выходе: AX Код ошибки, если был установлен флаг переноса CF;
Идентификатор файла, если флаг переноса CF сброшен

При выполнении этой функции возможно возникновение следующих ошибок:

  • отсутствует какой-либо элемент в пути для создаваемого файла, например, диск или каталог;
  • была сделана попытка создать файл в корневом каталоге, но корневой каталог переполнен;
  • в указанном каталоге уже есть файл с таким именем, и этот файл имеет атрибут «Только читаемый»;
  • пользователь, который работает в сети, не имеет прав доступа для выполнения указанной операции.

Операционная система игнорирует попытки создания с помощью этой функции каталога или метки диска.

Для того чтобы при создании файла случайно не уничтожить содержимое уже существующего файла с таким же именем, программа может использовать функцию 5Bh. Эта функция проверяет заданный путь на предмет наличия указанного файла. Если такой файл уже существует, функция возвращает программе признак ошибки:

На входе: AH 5Bh
CX Атрибуты создаваемого файла:
00h — обычный файл;
01h — только читаемый файл;
02h — скрытый файл;
04h — системный файл
DS:DX Адрес строки, содержащей путь к файлу
На выходе: AX Код ошибки, если был установлен флаг переноса CF;
Идентификатор файла, если флаг переноса CF сброшен

Если вам требуется временный файл, вы можете создать его с помощью функции 5Ah:

На входе: AH 5Ah
CX Атрибуты создаваемого файла:
00h — обычный файл;
01h — только читаемый файл;
02h — скрытый файл;
04h — системный файл
DS:DX Адрес блока памяти, в который функция запишет путь созданного временного файла. Размер этого блока памяти должен быть по крайней мере 13 байт
На выходе: AX Код ошибки, если был установлен флаг переноса CF;
Идентификатор файла, если флаг переноса CF сброшен

Операционная система не будет автоматически удалять созданный временный файл после завершения работы программы или перезагрузки. Программа должна сама удалить этот файл.

Открытие файла

Перед тем, как начать работу с файлом, его нужно открыть. Функции, создающие новые файлы, открывают их автоматически. Для того, чтобы открыть существующий файл, вы можете воспользоваться функцией 3Dh:

На входе: AH 3Dh
AL Требуемый режим доступа:

Бит 7: флаг наследования

0 — идентификатор файла наследуется порожденным процессом
1 — идентификатор файла не наследуется порожденным процессом

Биты 4. 6: режим разделения

000 — режим совместимости
001 — запрещение всех видов доступа
010 — запрещение записи
011 — запрещение чтения
100 — разрешение всех видов доступа

Бит 3:0 — зарезервировано

Биты 0. 2: вид доступа

000 — чтение
001 — запись
010 — чтение и запись

DS:DX Адрес строки, содержащей путь к файлу
На выходе: AX Код ошибки, если установлен флаг переноса CF;
Идентификатор файла, если флаг переноса CF сброшен

С помощью функции 3Dh можно открыть любой файл (но не каталог). Если требуется вид доступа «запись», открываемый файл не должен иметь атрибут «Только читаемый».

Для использования битов 4. 7 (управляющих доступом к файлу другими программами в сети) должна быть запущена программа share.exe .

Если используется бит наследования, то порожденному процессу наследуются вид доступа, запрошенный при открытии файла.

Функция 6Ch обладает расширенными возможностями по созданию и открытию файлов:

На входе: AH 6Ch
AL 00h
BX Байт флагов расширенного режима открытия файла
CX Атрибуты создаваемого файла, используется только при создании файлов
DX Выполняемая функция, если файл существует или не существует:

Биты 0-3 регистра DX задают действие, если файл существует:

0000h — если файл существует, вернуть признак ошибки;
0001h — если файл существует, открыть его;
0002h — если файл существует, заместить и открыть его.

Биты 4-7 регистра DX задают действие, если файл не существует:

0000h — если файл не существует, вернуть признак ошибки;
0001h — если файл не существует, создать и открыть его

DS:SI Адрес строки, содержащей путь к файлу
На выходе: AX Код ошибки, если флаг переноса CF установлен;
Идентификатор файла, если флаг переноса CF сброшен
CX Код выполненных действий:
0 — файл был открыт;
1 — файл был создан и открыт;
2 — файл был замещен и открыт

Регистр BX на входе задает флаги расширенного режима открытия файла в следующем формате:

Биты Назначение
0. 2 Режим доступа при чтении или записи
3 Зарезервировано, должно быть равно 0
4. 6 Режим разделения
7 Флаг наследования
8. 12 Зарезервировано, должно быть равно 0
13 0 — Режим обычного использования обработчика критических ошибок INT 24h (обработчик критических ошибок будет описан позже)
1 — Блокировка обработчика критических ошибок INT 24h. Для того, чтобы узнать причину ошибки, программа должна использовать функцию 59h прерывания INT 21h
14 Управление буферизацией:
0 — Использование стандартной для MS-DOS буферизации;
1 — Отмена буферизации. Использование этого режима замедлит работу с диском, однако вероятность потери информации при аварии в питающей сети уменьшится

Описанная выше функция является как бы комбинацией функций 3Dh и 3Ch (открытие и создание файла). Она удобна, но при ее использовании программа должна убедиться в том, что версия MS-DOS не ниже, чем 4.0.

Удаление файла

Удалить файл можно при помощи функции 41h прерывания INT 21h :

На входе: AH 41h
DS:DX Адрес строки в формате ASCIIZ, содержащей путь удаляемого файла
На выходе: AL Код ошибки, если установлен флаг переноса CF

С помощью этой функции нельзя удалить файл, имеющий атрибут «Только читаемый».

Под удалением файла понимается вычеркивание файла из каталога и освобождение всех принадлежавших ранее этому файлу кластеров. Эти кластеры отмечаются в таблице размещения файлов как свободные. При стирании файлов не происходит уничтожение информации, записанной на диске, поэтому в некоторых случаях можно полностью восстановить случайно удаленные файлы.

Переименование или перемещение файла

Программа может изменить имя файла или переместить его в другой каталог того же самого диска, воспользовавшись функцией 56h прерывания INT 21h :

На входе: AH 56h
DS:DX Адрес строки в формате ASCIIZ, содержащей старое имя
ES:DI Адрес строки в формате ASCIIZ, содержащей новое имя или новый путь к файлу
На выходе: AL Код ошибки, если установлен флаг переноса CF

С помощью этой функции можно переименовать (но не переместить) не только файл, но и каталог.

Функции библиотеки Borland C++

Стандартная библиотека Borland C++ содержит функции для работы с файлами. Эти функции можно разделить на две группы — функции низкого уровня и функции ввода/вывода потоком. Вторая группа функций использует буферизацию и будет рассмотрена в разделе, посвященном буферизованному вводу/выводу.

Функции низкого уровня отображаются на описанные выше функции прерывания INT 21h (а также на функции этого же прерывания, предназначенные для чтения или записи, позиционирования и т. д.).

creat

Для создания файла можно использовать функцию creat :

Эта функция и ее параметры описаны в файлах io.h, sys\types.h, sys\stat.h, errno.h.

Первый параметр определяет путь создаваемого файла и его имя. Если файл с указанным именем существует, и не имеет атрибут «Только читаемый», функция сбрасывает длину файла до нуля. Содержимое файла при этом уничтожается.

Второй параметр позволяет задать атрибуты создаваемого файла. Он может иметь следующие значения:

Параметр Операции, разрешенные для создаваемого файла
S_IWRITE Запись
S_IREAD Чтение
S_IREAD | S_IWRITE Чтение и запись

В операционной системе MS-DOS невозможно создать файл, в который можно было бы писать, но из которого было бы нельзя читать информацию. Поэтому если указать второй параметр как S_IWRITE, будет создан такой файл, для которого разрешены как операция записи, так и операция чтения.

После создания файла функция creat открывает новый файл, возвращая идентификатор файла или код ошибки.

Мощная функция open предназначена как для открытия существующих файлов, так и для создания новых:

Первый и третий параметры этой функции аналогичны параметрам функции creat , причем третий параметр нужен только при создании нового файла. Квадратные скобки указывают на то, что этот параметр можно не указывать.

Параметр oflag может являться результатом логической операции ИЛИ над следующими константами, определенными в файле fcntl.h:

Константа Описание
O_APPEND При записи в файл информация будет добавляться в конец файла
O_BINARY Файл открывается для работы в двоичном режиме (игнорируются управляющие символы, такие как конец строки)
O_CREAT Создается новый файл и открывается для записи. Эта константа игнорируется, если указанный в первом параметре файл уже существует
O_EXCL Используется вместе с O_CREAT . Если указанный в первом параметре файл существует, функция возвратит признак ошибки
O_RDONLY Файл открывается только для чтения, попытка записи в файл приведет к тому, что функция записи вернет признак ошибки
O_RDWR Файл открывается как для чтения, так и для записи
O_TEXT Файл открывается в текстовом режиме
O_TRUNC Существующий файл открывается и обрезается до нулевой длины (если для этого файла разрешена операция записи)
O_WRONLY Файл открывается только для записи (в MS-DOS для файла, открытого с признаком O_WRONLY , разрешено выполнение операции чтения)

close

Для того, чтобы закрыть файл, открытый функциями creat или open , нужно использовать функцию close :

В качестве параметра функции передается идентификатор файла, полученный при открытии или создании файла. Функция возвращает 0 при успешном закрытии файла или -1 при ошибке.

Коды ошибок

Код ошибки для этой и других функций стандартной библиотеки Borland C++ записывается в глобальную переменную errno.

3.5. Чтение и запись файлов

После того как вы открыли файл, можно выполнять над ним операции чтения или записи. При этом соответствующим функциям необходимо передать идентификатор файла. После завершения операций чтения или записи файл следует закрыть.

Запись данных в файл

Для записи данных в файл предназначена функция 40h прерывания INT 21h . В качестве параметров для этой функции необходимо указать идентификатор файла, полученный при открытии существующего файла или создании нового, адрес блока памяти, содержащего данные для записи и размер этого блока памяти:

На входе: AH 40h
BX Идентификатор открытого файла
CX Количество записываемых байт
DS:DX Адрес блока памяти, содержащего записываемые данные
На выходе: AX Код ошибки, если был установлен флаг переноса CF;
Количество действительно записанных байт, если флаг переноса CF сброшен

При записи данные попадают в то место внутри файла, которое определяется содержимым так называемого файлового указателя позиции. При создании нового файла этот указатель сбрасывается в 0, что соответствует началу файла. При открытии файла с помощью функции 3Dh указатель также устанавливается на начало файла. Операция записи в файл с помощью функции 40h продвигает указатель вперед к концу файла на количество записанных байт.

По мере увеличения размера файла ему будут распределяться все новые и новые кластеры из числа отмеченных как свободные.

Если вам необходимо перезаписать содержимое файла, а не дописывать данные в конец, необходимо воспользоваться функцией позиционирования. Эта функция будет описана в следующем разделе. Она позволяет управлять содержимым файлового указателя позиции.

Следует учитывать, что количество действительно записанных байт может не совпадать с заданным в регистре CX при вызове функции 40h. Такая ситуация возможна, например, при записи в файл, открытый в текстовом режиме, байта 1Ah. Этот байт означает конец текстового файла. Другая возможная причина — отсутствие свободного места на диске.

Если функция вызывается с содержимым регистра CX, равным 0, файл будет обрезан или расширен до текущего положения файлового указателя.

Разумеется, если программа, выполняющая запись в файл, работает в сети, она должна иметь соответствующие права доступа к каталогу и файлу.

Функция 40h может выполнять запись не только в файл, но и в символьное устройство, предварительно открытое функцией 3Dh. Об этом мы говорили в разделах книги, посвященных драйверам.

Чтение данных из файла

Для чтения данных из файла (или символьного устройства) предназначена функция 3Fh прерывания INT 21h :

На входе: AH 3Fh
BX Идентификатор открытого файла
CX Количество читаемых байт
DS:DX Адрес блока памяти, в который будут записаны прочитанные данные
На выходе: AX Код ошибки, если установлен флаг переноса CF;
Количество действительно прочитанных байт, если флаг переноса CF сброшен

Эта функция используется аналогично функции записи. Для нее верны все замечания, касающиеся файлового указателя позиции, количества действительно прочитанных байт и прав доступа.

Функции библиотеки Borland C++

Если ваша программа составлена на языке программирования С или C++, для записи и чтения данных она может воспользоваться функциями write и read :

Эти функции работают аналогично функциям 40h и 3Fh прерывания INT 21h . Параметр handle определяет файл, для которого необходимо выполнить операцию записи или чтения. Параметр buffer — указатель на блок памяти, который содержит данные для записи или в который необходимо поместить прочитанные данные. Количество записываемых или читаемых байт определяется третьим параметром — count.

После выполнения операции функция возвращает количество действительно записанных или прочитанных байт или -1 при ошибке.

Будьте внимательны, если вы записываете или читаете больше 32 Кбайт — вы можете получить признак ошибки, хотя передача данных выполнилась правильно. Большие массивы данных можно записывать по частям.

Программа FCOPY

В качестве примера мы приведем программу копирования файлов FCOPY (листинг 3.4), которая пользуется описанными выше функциями.

Листинг 3.4. Файл fcopy\fcopy.cpp

Для определения момента достижения конца исходного файла в программе использована функция eof:

Для файла с идентификатором handle эта функция возвращает одно из трех значений:

Значение Описание
1 Достигнут конец файла
Конец файла не достигнут
-1 Ошибка, например, неправильно указан идентификатор файла

Программа, которая читает файл с помощью функции 3Fh прерывания INT 21h , может определить момент достижения конца файла анализируя код ошибки, передаваемый в регистре AX.

3.6. Позиционирование

Управляя содержимым файлового указателя позиции программа может произвольно считывать или перезаписывать различные участки файла, то есть организовать прямой доступ к содержимому файла. Прямой доступ к файлу может вам пригодиться, например, для создания системы управления базами данных.

Установка файлового указателя

Установить файловый указатель в нужную вам позицию можно с помощью функции 42h прерывания INT 21h :

На входе: AH 42h
AL Метод кодирования смещения:
00h — абсолютное смещение от начала файла;01h — смещение от текущей позиции;02h — смещение от конца файла
BX Идентификатор открытого файла
CX Старший байт смещения
DX Младший байт смещения
На выходе: AX Код ошибки, если установлен флаг переноса CF;Младший байт текущей позиции, если флаг переноса CF сброшен
DX Старший байт текущей позиции

Функция 42h позволяет указывать новое значение указателя либо как абсолютное смещение от начала файла, либо как смещение от текущей позиции, либо как смещение от конца файла. В последних двух случаях используется смещение со знаком. Для указания смещения или абсолютной позиции программа должна задать в регистрах CX, DX соответствующее 32-битное значение.

Что произойдет, если при использовании методов кодирования 01h или 02h попытаться установить указатель позиции до начала файла?

Функция 42h при этом не возвратит признак ошибки, однако если будет сделана попытка прочитать или записать данные, то соответствующая функция чтения/записи завершится с ошибкой.

Определение размера файла

Если использовать метод кодирования 02h и при этом задать нулевое смещение, функция установит указатель на конец файла. Это обстоятельство может быть использовано для определения размера файла в байтах.

Функции библиотеки Borland C++

Стандартная библиотека Borland C++ содержит функции, предназначенные для управления файловым указателем позиции и получения текущего значения этого указателя. Это функции lseek , tell , filelength .

lseek

Функция lseek работает аналогично только что описанной функции 42h. Приведем ее прототип:

Первый параметр определяет файл, для которого выполняется операция позиционирования. Параметр offset определяет смещение. Последний параметр задает метод кодирования смещения. Он может принимать следующие значения, описанные в фале stdio.h:

Значение Описание
SEEK_SET Абсолютное смещение от начала файла
SEEK_CUR Смещение относительно текущей позиции
SEEK_END Смещение относительно конца файла

Функция возвращает величину текущего смещения в байтах относительно начала файла или -1 в случае ошибки. Как и для остальных функций библиотеки, код ошибки находится в глобальной переменной errno.

filelength

Вы, конечно, можете использовать функцию lseek для определения размера файла или текущей файловой позиции. Однако для того чтобы узнать размер файла, лучше воспользоваться специальной функцией filelength :

Эта функция возвращает размер файла в байтах. Файл задается параметром handle. В случае ошибки функция возвращает значение -1.

Для того, чтобы определить текущую файловую позицию, можно использовать функцию tell :

Эта функция возвращает текущую позицию для файла, определенного параметром handle, или -1 в случае ошибки.

Программа SETPOS

Для демонстрации использования функций позиционирования приведем простую программу SETPOS (листинг 3.5), которая для заданного файла и позиции внутри файла отображает содержимое одного байта. Дополнительно программа определяет размер файла и текущую позицию после чтения байта.

Листинг 3.5. Файл setpos\setpos.cpp

3.7. Изменение дескриптора файла

Напомним: атрибуты файла, время и дата его последней модификации, а также размер файла хранятся в дескрипторе файла. Дескриптор файла находится в каталоге.

Операционная система предоставляет вам все необходимые средства для изменения всех полей дескриптора файла, кроме номера начального кластера. Для изменения этого номера вам придется работать с каталогом через таблицу размещения файлов FAT . Для этого нужно сначала считать каталог по кластерам с помощью прерывания INT 25h , модифицировать нужные поля и записать каталог обратно на диск при помощи прерывания INT 26h .

Атрибуты файла

Для работы с полем атрибутов файла предназначена функция 43h прерывания INT 21h :

На входе: AH 43h
AL Выполняемая операция: 00h — чтение атрибутов файла;01h — установка новых атрибутов файла
CX Новые атрибуты файла, если AL = 01h:Биты регистра CX:5 — бит архивации; 4 — каталог;3 — метка диска;2 — системный файл; 1 — скрытый файл; 0 — только читаемый файл
DS:DX Путь к файлу в формате строки ASCIIZ
На выходе: AX Код ошибки, если установлен флаг переноса CF
CX Если не было ошибки, этот регистр содержит атрибуты файла

При изменении атрибутов файла допустимо указывать комбинации битов в регистре CX.

Если ваша программа работает в сети, она должна иметь соответствующие права доступа к каталогу, содержащему файл, для которого программа собирается изменять байт атрибутов.

Время и дата изменения файла

Для работы с полями времени и даты последней модификации файла предназначена функция 57h прерывания INT 21h :

На входе: AH 57h
AL Выполняемая операция:
00h — чтение даты и времени;01h — установка даты и времени
BX Идентификатор открытого файла
CX Время
DX Дата
На выходе: AX Код ошибки, если установлен флаг переноса CF
CX Если не было ошибки, этот регистр содержит время последнего изменения файла
DX Если не было ошибки, этот регистр содержит дату последнего изменения файла

Для того чтобы изменить время или дату последней модификации файла с помощью этой функции, файл предварительно должен быть открыт. Формат времени и даты для этой функции такой же, как и используемый в дескрипторе каталога (рис. 2.4 и 2.5).

Функции библиотеки Borland C++

Стандартная библиотека Borland C++ содержит функции для чтения и изменения атрибутов файлов, а также времени и даты их последней модификации.

_dos_getfileattr

Для определения атрибутов файла можно использовать функцию _dos_getfileattr :

Эта функция получает атрибуты файла, заданного первым аргументом, и записывает байт атрибутов в младший байт по адресу, указанному вторым параметром.

В случае успешного завершения функция возвращает 0. При ошибке она возвращает код ошибки, полученный от операционной системы и устанавливает глобальную переменную errno в значение ENOENT, что означает отсутствие файла, указанного в параметре path.

_dos_setfileattr

Для изменения атрибутов файла можно использовать функцию _dos_setfileattr :

Параметр attrib может принимать следующие значения:

Значение Описание
_A_ARCH Установка бита архивации
_A_HIDDEN Скрытый файл
_A_NORMAL Обычный файл
_A_RDONLY Только читаемый файл
_A_SUBDIR Каталог
_A_SYSTEM Системный файл
_A_VOLID Метка диска

_dos_getftime

Для определения времени последней модификации файла можно использовать функцию _dos_getftime :

Перед использованием этой функции программа должна открыть файл. Дата и время записываются по адресу, указываемому, соответственно, вторым и третьим параметрами.

_dos_setftime

Если вам надо изменить время или дату последней модификации файла, используйте функцию _dos_setftime :

Параметры этой функции аналогичны используемым в функции _dos_getftime , за исключением того что в качестве второго и третьего параметра применяются не указатели, а непосредственные значения даты и времени.

Программа READONLY

Приведем программу READONLY (листинг 3.6), изменяющую на противоположное значение бита файла атрибутов «Только читаемый» для файла, имя которого передается программе в качестве параметра.

Листинг 3.6. Файл readonly\readonly.cpp

Программа сначала считывает байт атрибутов, затем инвертирует соответствующий бит и устанавливает новое значение байта атрибутов.

3.8. Буферизация

Ввод и вывод для дисков в операционной системе MS-DOS буферизован. Это означает, что данные не сразу записываются на диск, а накапливаются в специальном массиве (буфере). По мере заполнения буфер сбрасывается на диск. При чтении информация заполняет весь входной буфер, независимо от количества байт, которые программа читает из файла. В дальнейшем если программе потребуются данные, которые уже были считаны с диска и записаны во входной буфер, она получит их непосредственно из этого буфера без обращения к диску.

Буферизация сокращает затраты времени на ввод и вывод, особенно в тех случаях, когда программе периодически требуется одни и те же участки файлов. При копировании файлов буферизация сокращает время на перемещение головок от исходного файла к выходному и обратно, причем эффект получается тем больше, чем больше размер используемого буфера.

Операционная система MS-DOS может создать несколько буферов. Их количество зависит от оператора BUFFERS из файла config.sys . Этот оператор позволяет определить от 2 до 99 буферов. Если файл config.sys не содержит оператора BUFFERS, по умолчанию используются два буфера.

При увеличении количества буферов увеличивается вероятность того, что нужная часть файла уже считана и находится в оперативной памяти. Однако необходимо учитывать, что для хранения буферов расходуется основная оперативная память. Кроме того, с ростом количества буферов увеличивается время, необходимое операционной системе на анализ состояния буферов, что может привести к снижению производительности. Значительное снижение скорости работы наступает при количестве буферов порядка 50.

Еще один способ организовать буферизацию данных для жестких дисков и устройств CD-ROM — использовать драйвер smartdrv.exe . Этот драйвер позволяет создать для диска кеш-память в расширенной памяти.

Кеш-память особенно эффективна при работе с базами данных, когда вам периодически требуется одна и та же информация. Если создать кеш-память достаточно большого размера, можно значительно сократить количество обращений к диску.

Буферизация данных имеет и свои недостатки. Если в результате аварии в питающей сети или по какой-то другой причине компьютер выключился, то информация, хранящаяся в буферах и не записанная на диск, будет потеряна.

При закрытии файла все буферы, связанные с ним, сбрасываются на диск. Если вам надо сбросить буферы, не закрывая файл, это можно сделать с помощью функции 68h прерывания INT 21h :

На входе: AH 68h
BX Идентификатор открытого файла
На выходе: AX Код ошибки, если установлен флаг переноса CF;
0, если операция выполнена успешно

При вызове этой функции дополнительно обновляется дескриптор файла в каталоге, а именно поля времени, даты и размера файла.

Обратите также внимание на функцию расширенного открытия файлов 6Ch. Эта функция позволяет при открытии файла отменить буферизацию.

3.9. Потоки ввода и вывода

Стандартная библиотека Borland C++ содержит многочисленные функции, использующие собственный механизм буферизации при работе с файлами. Их часто называют функциями потокового ввода/вывода . Такую буферизацию не следует путать с буферизацией, выполняемой операционной системой. Имена всех этих функций начинаются на f — fopen , fclose , fprintf и т. д.

Функции потокового ввода/вывода хорошо описаны во многих учебных пособиях по языку программирования С, поэтому мы приведем лишь краткий обзор, делая акцент на особенностях их применения.

Существуют потоки , соответствующие стандартным устройствам ввода, вывода, вывода сообщений об ошибках, стандартному устройству последовательного ввода/вывода и стандартному устройство печати:

Поток Описание
stdin Стандартное устройство ввода
stdout Стандартное устройство вывода
stderr Стандартное устройство для вывода сообщений об ошибках
stdaux Стандартное последовательное устройство ввода/вывода
stdprn Стандартное печатающее устройство

Для использования этих потоков не требуются выполнять процедуру открытия и закрытия.

Для работы со стандартными устройствами ввода/вывода в библиотеках трансляторов языка программирования С имеется соответствующий набор функций, которые должны быть вам хорошо известны — printf, scanf , putchar и т. д. Мы не будем их описывать, так как объем книги ограничен.

Открытие и закрытие потоков

При использовании функций потокового ввода/вывода файлы открываются функцией fopen , а закрываются функцией fclose . Эти функции не только открывают и закрывают файлы (получают и освобождают их идентификаторы), но и, соответственно, создают и уничтожают переменную типа FILE , описанную в файле stdio.h и связанную с данным файлом.

fopen

Для организации потокового ввода/вывода вначале необходимо при помощи функции fopen открыть файл. Функция fopen имеет следующий прототип:

Первый параметр указывает на строку, содержащую путь открываемого файла, второй — на строку режима открытия файла. Возможны следующие режимы:

Режим Операция, для выполнения которой открывается файл
«r» Чтение
«w» Запись
«a» Запись, данные будут добавляться в конец файла

К буквам r, w, a справа могут добавляться буквы t и b.

Буква t означает, что файл будет открыт в текстовом режиме, b — в двоичном. Для двоичного режима не выполняется обработка таких символов, как конец строки, конец файла и т. д.

Строка режима открытия файла может дополнительно содержать символ ‘+’. Этот символ означает, что для файла разрешены операции чтения и записи одновременно.

fclose

Для закрытия файлов, открытых для ввода или вывода потоком, должна использоваться функция fclose :

При закрытии файла освобождаются и сбрасываются на диск все буферы, распределенные этому файлу.

fdopen

Если вы открыли файл с помощью функции open , вы можете создать поток для этого файла, используя функцию fdopen :

В качестве первого параметра используется идентификатор файла, полученный от функции open . Второй параметр аналогичен параметру mode для функции fopen .

Для того чтобы закрыть поток, созданный функцией fdopen , необходимо использовать функцию fclose , а не close .

fileno

Для открытого потока вы можете узнать идентификатор соответствующего файла с помощью функции fileno :

Функция возвращает идентификатор файла, связанного с данным потоком.

fwrite

Для записи данных в поток предназначена функция fwrite :

Эта функция записывает в файл stream блоки информации, каждый из которых имеет длину size байт. Количество блоков — count. Данные для записи расположены по адресу buffer.

Если файл открыт в текстовом режиме, каждый символ возврата каретки CR заменяется на два символа — возврата каретки CR и перевода строки LF.

Функция возвращает количество действительно записанных блоков информации без учета замены символа CR в текстовом режиме.

fread

Чтение данных потоком можно выполнить с помощью функции fread :

Эта функция используется аналогично предыдущей. Для распознавания конца файла и обнаружения ошибок после вызова этой функции необходимо использовать функции feof и ferror.

Если при использовании функции fread вы задали значения параметров size или count, равные нулю, функция fread не изменяет содержимое буфера buffer.

fseek

Для позиционирования внутри файла, открытого потоком с помощью функции fopen, предназначена функция fseek :

В этой функции параметр offset задает новое содержимое указателя текущей позиции в файле stream, а параметр origin определяет способ задания новой позиции. Этот оператор может иметь значения, аналогичные используемым в функции lseek :

Значение Описание
SEEK_SET Абсолютное смещение от начала файла
SEEK_CUR Смещение относительно текущей позиции
SEEK_END Смещение относительно конца файла

При открытии файла указатель текущей позиции устанавливается на начало файла. Операции ввода или вывода вызывают увеличение значения этого указателя на количество, соответственно, прочитанных или записанных байт.

Функция fseek позволяет вам установить указатель за конец файла, однако при попытке установит указатель до начала файла функция возвратит признак ошибки — ненулевое значение.

При использовании функции fseek для позиционирования внутри файлов, открытых в текстовом режиме, необходимо учитывать особенность обработки текстовых файлов — автоматическую замену символа возврата каретки CR на пару символов: возврат каретки CR и перевод строки LF. Для текстовых файлов функция fseek будет правильно работать только в следующих двух случаях:

  • если поиск выполняется со смещением offset, равным нулю, при любом значении параметра origin;
  • если поиск выполняется относительно начала файла, причем в качестве смещения offset используется значение, полученное специальной функцией ftell .

ftell

Функция ftell возвращает текущее значение указателя позиции для файла, или -1 при ошибке:

Пара функций ftell и fseek позволит вам правильно организовать позиционирование для файлов, открытых в текстовом режиме.

fgetpos , fsetpos

Есть еще одна возможность организовать позиционирование внутри файлов, открытых потоком — вызов пары функций fgetpos и fsetpos :

Эти две функции используют для запоминания и установки позиции переменную с типом fpos_t, определенным в файле stdio.h. Функция fgetpos записывает в эту переменную текущую позицию в потоке stream. Содержимое переменной затем может быть использовано для установки позиции в потоке с помощью функции fsetpos .

Обе эти функции возвращают нулевое значение в случае успешного завершения работы, или ненулевое — при ошибке.

Форматный ввод и вывод

Среди потоковых функций можно выделить группу функций форматного ввода и вывода. Это такие функции, как fputc , fgetc , fputs , fgets , fprintf , fscanf .

Функции форматного ввода и вывода сильно облегчают запись и чтение таких элементов данных, как отдельные байты, текстовые строки, числа в различных форматах.

fputc

Для записи в поток отдельных байт используется функция fputc :

Байт c записывается в поток stream начиная с текущей позиции. После записи текущая позиция увеличивается на единицу. Функция возвращает записанный байт или значение EOF , которое служит признаком ошибки.

fgetc

Для побайтового чтения содержимого файла, открытого потоком, удобно использовать функцию fgetc :

Эта функция возвращает байт, считанный из потока stream и преобразованный к типу int. После чтения байта текущая позиция в потоке увеличивается на единицу.

При достижении конца файла или в случае ошибок функция fgetc возвращает значение EOF . Однако для проверки на ошибку или конец файла лучше пользоваться специальными функциями ferror и feof. Если вы открыли файл в двоичном режиме, единственный способ определить момент достижения конца файла — использовать функцию feof, так как значение константы EOF может находиться в любом месте двоичного файла.

fputs и fgets

Для работы со строками предназначены функции fputs и fgets .

Функция fputs предназначена для вывода строки в файл, открытый потоком:

Первый параметр — указатель на строку, второй — поток, в который эта строка выводится. Двоичный нуль, закрывающий строку, в выходной файл не копируется. После вывода строки содержимое текущего указателя позиции увеличивается на количество записанных байт.

Для ввода строк из текстового файла удобна функция fgets :

Функция читает байты из потока stream и записывает их в блок памяти, указатель на который задан параметром string, до тех пор, пока не произойдет одно из двух событий — будет прочитан символ новой строки ‘\n’ или количество прочитанных символов не станет равно n-1.

После того, как байты будут прочитаны в блок памяти, в конец строки образованной из этих байт, функция запишет двоичный нуль. Если был прочитан символ новой строки ‘\n’, он тоже будет записан.

Для анализа достижения конца файла или ошибок необходимо использовать функции feof и ferror.

fprintf

Для форматного вывода в файл содержимого переменных удобно использовать функцию fprintf :

Эта функция аналогична хорошо известной вам функции форматного вывода на экран printf, с которой обычно начинают изучение языка программирования С. Вспомните такую программу:

Функция fprintf имеет дополнительно один параметр — stream, который определяет выходной поток.

После завершения работы функция возвращает количество записанных байт или отрицательную величину, если при записи произошла ошибка.

fscanf

Для форматного ввода информации из файла можно использовать функцию fscanf , аналогичную известной вам функции scanf :

Эта функция читает данные, начиная с текущей позиции в потоке stream, в переменные, определенные аргументами arg. Каждый аргумент должен являться указателем на переменную, соответствующую типу, определенному в строке формата format.

Функция fscanf возвращает количество успешно считанных и преобразованных в указанный формат полей. Те поля, которые были считаны, но не преобразовывались, в возвращаемом функцией значении не учитываются.

При достижении конца файла функция возвращает значение EOF . Если функция возвратила нулевое значение, это означает, что преобразование полей не производилось.

Буферизация потоков

Рассмотрим теперь функции, управляющие буферизацией для потокового ввода/вывода.

setbuf

Функция setbuf позволяет вам заменить системный буфер на свой собственный:

Параметр buffer должен указывать на подготовленный пользователем массив, имеющий размер BUFSIZ байт. Константа BUFSIZ описана в файле stdio.h.

setvbuf

Функция setvbuf позволяет программе не только указать свой буфер, но и задать его размер:

Параметр stream должен указывать на открытый поток, причем для этого потока до вызова функции setvbuf нельзя выполнять операции чтения и записи.

Параметр buffer должен указывать на подготовленный программой буфер размером size байт. Этот буфер будет использоваться для работы с потоком stream.

Параметр mode может принимать значения _IOFBF , _IOLBF , _IONBF . Если mode равен _IOFBF или _IOLBF, параметр size указывает размер буфера. Если параметр mode равен _IONBF, буферизация не используется, а параметры buffer и size игнорируются.

Параметры _IOFBF и _IOLBF эквивалентны друг другу.

Если в качестве адреса буфера buffer задать значение NULL, функция автоматически закажет буфер размером size.

Функция setvbuf возвращает нуль при успешном завершении и ненулевую величину, если указан неправильный параметр mode или неправильный размер буфера size.

Для чего может понадобиться изменение размера буфера?

Главным образом — для сокращения времени, необходимого для позиционирования магнитных головок при выполнении операций одновременно над несколькими файлами, например, при копировании файлов, слиянии нескольких файлов в один и т. д.

fflush

При закрытии потока функцией fclose содержимое буфера записывается на диск. Если программе необходимо выполнить запись содержимого буфера на диск без закрытия файла, она может воспользоваться функцией fflush :

Эта функция возвращает нуль при успешной записи буфера на диск, а так же в тех случаях, когда поток либо совсем не имеет буфера, либо открыт только для чтения. При ошибке возвращается значение EOF .

Если поток открыт только для чтения, функция fflush очищает содержимое буфера, связанного с этим потоком.

Программа BUFCOPY

В качестве примера приведем текст программы BUFCOPY (листинг 3.7), копирующей содержимое текстового файла.

Программа копирует этот файл три раза. В первый раз она использует буфер стандартного размера, затем увеличивает размер буфера в десять раз, и наконец, копирует файл без использования механизма буферизации. Каждый раз программа измеряет продолжительность копирования файла с помощью функции clock, входящей в состав стандартной библиотеки Borland C++.

Листинг 3.7. Файл bufcopy\ bufcopy.cpp

3.10. Другие функции для работы с файлами

В задачу данной книги не входит описание всех функций стандартных библиотек трансляторов Borland C++, Microsoft Quick C или аналогичных, предназначенных для работы с дисками и файловой системой. Но мы приведем еще несколько интересных и полезных на наш взгляд функций.

Как мы уже отметили, программа может использовать два режима ввода/вывода для файлов — текстовый и двоичный. Переключение этого режима для открытого файла можно выполнять с помощью функции setmode :

Первый параметр — идентификатор файла. Второй параметр может принимать два значения:

Значение Описание
O_TEXT Установить текстовый режим
O_BINARY Установить двоичный режим

Функция setmode должна вызываться перед началом операций ввода или вывода в открытый файл.

Мы рассказывали о позиционировании внутри файла. Если вам нужно просто установить указатель позиции на начало файла, открытого для потока, вы можете воспользоваться функцией rewind :

Если вам нужно переназначить ввод или вывод для стандартных потоков (stdin, stdout, stderr), вы можете использовать функцию freopen :

Функция freopen закрывает файл, с которым был связан поток stream, и переназначает этот поток на файл, определенный параметром filename. Параметр mode задается так же, как и для функции fopen .

Можно переназначить идентификатор файла, открытого функцией open . Для этого можно воспользоваться одной из двух функций — dup или dup2 :

Первая функция связывает с открытым файлом еще один идентификатор. Она возвращает этот идентификатор при успешном завершении. В случае ошибки она возвращает значение -1.

Новый идентификатор может быть использован для любых операций над файлом.

Функция dup2 переназначает идентификатор файла handle2, связывая его с тем же файлом, которому соответствует идентификатор handle1. Если во время вызова функции dup2 с идентификатором handle2 связан какой-либо открытый файл, этот файл закрывается. В случае успешного завершения функция dup2 возвращает нулевое значение. Если произошла ошибка, возвращается значение -1.

3.11. Таблица открытых файлов

В предыдущем томе при описании векторной таблицы связи мы говорили о том, что для всех открытых файлов MS-DOS хранит различную информацию в специальной таблице. Ее адрес находится в поле file_tab векторной таблицы связи.

В этой таблице для каждого открытого файла хранится информация о количестве идентификаторов, связанных с данным файлом, режиме открытия файла (чтение, запись и т. д.), слово информации об устройстве, указатель на заголовок драйвера, обслуживающего данное устройство, элемент дескриптора файла (дата, время, имя файла, номер начального кластера, распределенного файлу), номер последнего прочитанного кластера и т. д.

Теперь, когда вы изучили способы работы с файлами, имеет смысл еще раз вернуться к разделу, посвященному таблице открытых файлов.

Вы можете самостоятельно экспериментировать с этой таблицей. Можно, например, попробовать создать несколько идентификаторов для какого-либо файла и посмотреть после этого содержимое поля, в котором находится количество идентификаторов, связанных с данным файлом.

Можно попробовать организовать чтение файла порциями размером в один кластер, и при этом каждый раз выводить содержимое поля, в котором находится номер последнего прочитанного кластера. Это один из самых простых способов получить список кластеров, распределенных данному файлу.

Однако не обольщайтесь — все что связано с таблицей файлов, отсутствует в документации по операционной системе MS-DOS. Используя эту таблицу для определения списка кластеров или для каких-либо других целей, вы рискуете потерять совместимость с последующими версиями операционной системы.

3.12. Обработка критических ошибок

Операционная система MS-DOS позволяет программам устанавливать собственный обработчик критических ошибок аппаратуры. Мы уже говорили о том, что вектор 0000h:0090h, соответствующий прерыванию INT 24h , содержит адрес обработчика критических ошибок. Этот обработчик получает управление от операционной системы, когда драйвер какого-либо устройства обнаруживает ошибку аппаратуры.

Обратите внимание на то, что обработчик критических ошибок не вызывается при работе с диском через прерывания INT 25h или INT 26h. Тем более, он не вызывается при работе с диском на уровне прерывания INT 13h .

При запуске программы операционная система MS-DOS копирует адрес обработчика в префикс сегмента программы PSP, а после завершения работы программы — восстанавливает его из PSP.

Стандартный обработчик MS-DOS выводит на экран сообщение:

Если ваша программа должна сама обрабатывать ошибки аппаратуры, она может установить свой собственный обработчик критических ошибок.

Анализ регистров

Когда обработчик получает управление, регистры процессора содержат информацию, необходимую для определения причины и места появления ошибки:

Регистр Содержимое
AH Информация об ошибке.Бит 0: тип операции:
0 — чтение, 1 — запись
Биты 1,2: область диска, где произошла ошибка:
00 — системные файлы;
01 — область FAT ;
10 — область каталога;
11 — область данных.
Бит 3: если равен 1, возможен выход с кодом FAIL
Бит 4: если равен 1, возможен выход с кодом RETRY
Бит 5: если равен 1, возможен выход с кодом IGNORE
Бит 6 зарезервирован, равен 0
Бит 7 тип устройства: 0 — диск; 1 — символьное устройство
AL Номер диска (если бит 7 регистра AH равен 0)
DI Код ошибки (биты 0. 7, остальные биты не определены)
BP:SI Адрес заголовка драйвера устройства, в котором произошла ошибка

Обработчик критических ошибок не должен пользоваться функциями MS-DOS с кодами, большими чем 0Ch (из-за того, что функции MS-DOS не реентерабельны).

Программа обработки критических ошибок может вывести на экран сообщение об ошибке и запросить оператора о необходимых действиях. Ей разрешено также получить дополнительную уточняющую информацию об ошибке с помощью функции 59h прерывания INT 21h или узнать версию MS-DOS с помощью функции 30h этого же прерывания.

Дополнительная информация об устройстве, в котором произошла ошибка, может быть получена с использованием адреса заголовка драйвера устройства, который передается операционной системой при вызове обработчика в регистрах BP:SI.

Анализ стека

Для определения номера функции MS-DOS, в которой произошла критическая ошибка, программа-обработчик может выполнить анализ стека. Когда обработчик получает управление, стек имеет следующую структуру:

Адрес возврата в DOS для команды IRET

FLAGS

Содержимое регистров программы перед вызовом INT 21h

AX, BX, CX, DX, SI, DI, BP, DS, ES

Адрес возврата в программу, вызвавшую функцию DOS

FLAGS

Выполнив анализ регистра AH, можно определить номер функции MS-DOS, при вызове которой произошла ошибка, а зная содержимое остальных регистров — и все параметры этой функции.

Код действия

После выполнения всех необходимых действий программа обработки критических ошибок должна возвратить в регистре AL код действия, которое должна выполнить операционная система для обработки данной ошибки:

Код Описание
Игнорировать ошибку
1 Повторить операцию
2 Завершить задачу аварийно, используя адрес завершения, записанный в векторе прерывания INT 23h
3 Вернуть программе управление с соответствующим кодом ошибки

При открытии файлов с помощью функции 6Ch программа может заблокировать вызов обработчика критических ошибок.

Функции библиотеки Borland C++

Для составления программы обработки критических ошибок вы можете воспользоваться языком ассемблера или функциями стандартной библиотеки Borland C++ с именами _dos_getvect , _dos_setvect , _chain_intr . Однако лучше всего использовать специально предназначенные для этого функции _harderr , _hardresume и _hardretn .

_harderr

Функция _harderr предназначена для установки нового обработчика критических ошибок, она имеет следующий прототип:

Параметр handler — указатель на новую функцию обработки критических ошибок.

_hardresume

Функция _hardresume и описанная ниже функция _hardretn должны быть использованы в обработчике критических ошибок, установленном функцией _harderr .

Функция _hardresume возвращает управление операционной системе, она имеет прототип:

Параметр result может иметь следующие значения (в соответствии с необходимыми действиями):

Значение Описание
_HARDERR_ABORT Завершить программу аварийно
_HARDERR_FAIL Вернуть код ошибки
_HARDERR_IGNORE Игнорировать ошибку
_HARDERR_RETRY Повторить операцию

Эти параметры описаны в файле dos.h.

_hardretn

Функция _hardretn возвращает управление непосредственно программе, передавая ей код ошибки, определяемый параметром функции error:

При этом программа получает код ошибки error после возврата из вызванной ей функции MS-DOS. Если ошибка произошла при выполнении функции с номером, большим чем 38h, дополнительно устанавливается флаг переноса. Если номер функции был меньше указанного значения, в регистр AL записывается величина FFh.

Функция обработки критических ошибок

Функция обработки критических ошибок handler имеет следующие параметры:

Первый параметр — код ошибки устройства. Он равен содержимому регистра AX при вызове обработчика прерывания INT 24h . Аналогично, параметр errcode соответствует содержимому регистра DI — код ошибки. Третий параметр devhdr — это указатель на заголовок драйвера устройства (передаваемый в регистрах BP:SI).

Программа CRITERR

Для демонстрации использования функций установки обработчика критических ошибок приведем программу, которая пытается создать каталог на диске А:. Эта программа сама обрабатывает критические ошибки, запрашивая у оператора информацию о необходимых действиях.

Илон Маск рекомендует:  Что такое код set database
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL