Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Функции прямого доступа к файлу



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

Для организации прямого доступа к произвольному месту файла предусмотрена функция 42h, позволяющая задать положение указателя относительно начала файла (для этого надо задать AL=0), конца файла (AL=2) или текущего положения указателя (AL=1). Само значение смещения указателя (со знаком) заносится в регистры СХ (старшая половина) и DX (младшая). Функция 40h используется для записи в файл или устройство. Перед вызовом функции в регистр ВХ помещается дескриптор, в регистр СХ - число читаемых или записываемых байт, а в регистры DS:DX - адрес буфера в программе пользователя.

 

Примеры по программированию операций над файлами

Пример 1. Создание файла. В текущем каталоге диска создать файл с именем MYFILE.001.

 

;Определения

cr  equ 0Dh       ;Возврат каретки

lf   equ 0Ah       ;Перевод строки

text        segment 'code'

assume   CS:text, DS:data

myproc proc

mov AX, data

mov DS,AX

;Создадим файл

mov AH,3Ch                    ;Функция создания файла

mov CX,0                         ;Без атрибутов

mov DX, offset filename   ;Адрес имени файла

int 21h

mov handle, AX               ;Сохраним дескриптор файла

;Закроем файл (нет необходимости, если файл не надо читать повторно)

mov AH,3Eh                    ;Функция закрытия

mov BX,handle                 ;Дескриптор

int 21h

;Завершим программу

outprog: mov AX,4C00h                ;Функция завершения, код

int 2lh                            ;завершения = 0

myproc endp

text        ends

 

data        segment

handle    dw ?                          ;Ячейка для дескриптора

filename db 'MYFILE.001',0 ;Имя файла в формате ASCIIZ

data        ends

 

stack      segment para stack 'STACK'

db           128 dup (?)

stack      ends

end         myproc

 

Пример 2. Запись строки в файл.

;Основные фрагменты программы

;Создадим файл

...

;Запишем строку в файл

mov AH,40h                     ;Функция записи

mov BX, handle                ;Дескриптор

mov CX, stringln              ;Длина строки

mov DX, offset string       ;Адрес строки

int 21h

;Закроем файл

...

;Завершим программу

...

;Поля данных

string     db 'Текстовая строка',cr,lf ;Строка для записи в файл

stringln equ $-str1ng                    ;Ее длина

handle    dw ?                                ;Ячейка для дескриптора

 

Пример 3. Чтение файла. Прочитать содержимое файла MYFILE.001 в память и вывести его на экран. Предполагается, что размер файла не более 80 байт.

;Определения

stdout    equ 1                      ;Дескриптор стандартного вывода

;Основные фрагменты программы

;Откроем файл

mov AH,3Dh                    ;Функция открытия файла

mov AL,2                         ;Доступ для чтения/записи

mov DX, offset filename   ;Адрес имени файла

int 21h

mov handle,AX                ;Получили дескриптор

;Попытаемся прочитать 80 байт

mov AH,3Fh                ;Функция чтения

mov BX,handle                 ;Дескриптор

mov CX,80                       ;Столько читать

mov DX, offset bufin        ;Сюда

int 21h

mov CX,AX                     ;Столько реально прочитали

;Выведем прочитанное на экран

mov AH,4Dh                    ;Функция записи

mov BX, stdout      ;Дескриптор стандартного вывода

mov DX, offset bufin ;Отсюда выводить (СХ байт)

int 21h

;Завершим программу

...

;Поля данных

bufin      db 80 dup (' ')       ;Буфер ввода

handle    dw ?                          ;Ячейка для дескриптора

filename db 'MYFILE.001',0 ;Имя файла

Пример 4. Изменение атрибутов файла. Установить у файла MYFILE.001 атрибут "только для чтения".

;Основные фрагменты программы

;Установим атрибут "только для чтения"

mov AH,43h           ;Функция работы с атрибутами

mov AL,1                ;Установка атрибутов

mov CX,1               ;"Только для чтения"

mov DX, offset filename ;Адрес имени файла

int 21h

 

Пример 5. Прямой доступ к файлу. Прочитать 8 байт из созданного ранее файла MYFILE.001, начиная с байта 5, вывести их на экран.

;Определения

stdout    equ 1                      ;Дескриптор стандартного вывода

;Основные фрагменты программы

;Откроем файл

...

;Установим указатель

     mov AH,42h           ;Функция установки указателя

     mov AL,0                ;От начала файла

     mov BX, handle      ;Дескриптор

     mov CX,0               ;Старшая половина указателя

     mov DX,5                         ;Младшая половина указателя

     int 21h

;Прочитаем 8 байт данных с помощью функции 3Fh

...

;Выведем прочитанное на экран с помощью функции 40h

...

;Завершим программу

...

;Поля данных

bufin      db 80 dup (' ')       ;Буфер ввода

handle    dw ?                      ;Ячейка для дескриптора

filename db 'MYFILE.001',0 ;Имя файла в формате ASCIIZ

 

Пример 6. Добавление данных к файлу. Добавить символьную строку к концу символьного файла.

;Основные фрагменты программы

;Откроем файл с указанным именем функцией 3Dh и сохраним

;полученный дескриптор в ячейке handle

...

;Установим указатель на конец файла

     mov AH,42h           ;Функция установки указателя

     mov AL,02              ;От конца файла

     mov BX, handle      ;Дескриптор

     mov CX,0                ;Старшая половина указателя

     mov DX,0                         ;Младшая половина указателя

     int 21h

;Допишем новую строку

     mov AH,40h           ;Функция записи

     mov BX, handle      ;Дескриптор

     mov CX, stringln    ;Длина строки

     mov DX, offset string ;Адрес строки

     int 21h

;Завершим программу

...

;Поля данных

string     db 'Новая строка',cr,lf ;Строка для записи в файл

stringln equ $-str1ng                    ;Ее длина

handle    dw ?                                ;Ячейка для дескриптора

filename db 'MYFILE.001',0        ;Имя файла в формате ASCIIZ

 

Пример 7. Изменение характеристик файла. Изменить дату и время создания файла MYFILE.001.

;Основные фрагменты программы

 

;Откроем файл с указанным именем функцией 3Dh и сохраним

;полученный дескриптор в ячейке handle

...

;Изменим дату и время создания файла

     mov AH,57h                     ;Функция даты/времени

     mov AL,1                         ;Установить дату/время

     mov BX, handle               ;Дескриптор файла

     mov CX,0                         ;Очистим CX

     or CX, sec                     ;Добавим секунды

     or CX, min                    ;Добавим минуты

     or CX, hour                   ;Добавим часы

     xor DX, DX                    ;Очистим DX

     or DX, day                    ;Добавим день

     or DX, mon                   ;Добавим месяц

     or DX, year              ;Добавим год

     int 21h

;Завершим программу

...

;Поля данных

filename db 'MYFILE.001',0        ;Имя файла

handle    dw ?                                ;Ячейка для дескриптора

sec          dw 6/2                            ;6 секунд

min        dw 15*32                        ;15 минут

hour       dw 16*2048                    ;16 часов

day         dw 25                             ;25 число

mon       dw 3*32                          ;март

year        dw 13*512                      ;13 лет от 1980 года

 

Пример 8. Переименование файла. Переименовать файл MYFILE.001, находящийся в текущем каталоге, дав ему имя NEWNAME.DAT.

;Основные фрагменты программы

;Настроим сегментный регистр ES на наш сегмент данных

push DS

pop ES

;Переименуем файл

mov AH,56h                     ;Функция переименования

mov DX, offset oldname   ;Адрес старого имени

mov DI, offset newname   ;Адрес нового имени

int 21h

;Завершим программу

...

;Поля данных

oldname db 'MYFILE.001',0        ;Старое имя файла

newname db 'NEWNAME.DAT',0 ;Новое имя файла

 

Пример 9. Пересылка файла в другой каталог на том же диске. Переслать файл NEWNAME.DAT из текущего каталога в нижележащий каталог NEWDIR, изменив при этом имя файла на NEWNAME.LEX.

;Основные фрагменты программы

;Настроим сегментный регистр ES на наш сегмент данных

...

;Переименуем файл

...

;Завершим программу

...

;Поля данных

oldname db 'NEWNAME.DAT',0                   ;Старое имя файла

newname db 'NEWDIR\NEWNAME.LEX',0   ;Новое имя файла

 

Пример 10. Создание и удаление каталогов. Создать в текущем каталоге подкаталог NEWDIR. Удалить из текущего каталога подкаталог OLDDIR (обязательно пустой).

;Основные фрагменты программы

;Создадим новый каталог

mov AH,39h                     ;Функция создания каталога

mov DX, offset newname ;Адрес нового имени

int 21h

;Удалим ненужный каталог

mov AH,3Ah                    ;Функция удаления каталога

mov DX, offset oldname   ;Адрес старого имени

int 21h

 

;Завершим программу

...

;Поля данных

oldname db 'OLDDIR',0              ;Старый каталог

newname db 'NEWDIR',0             ;Новый каталог

 

Пример 11. Смена диска. Сделать текущим диск А.

;Основные фрагменты программы

;Сделаем текущим диск А

mov AH,0Eh           ;Функция смены диска

mov DL,0                ;Код диска А (А=0, В=1, С=2 и т.д.)

int 21h

;Завершим программу

 


Поделиться:



Последнее изменение этой страницы: 2019-05-07; Просмотров: 224; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.036 с.)
Главная | Случайная страница | Обратная связь