Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Функции прямого доступа к файлу⇐ ПредыдущаяСтр 12 из 12
Для каждого открытого файла 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; Нарушение авторского права страницы