- •Fasm. Работа с файловой системой
- •2. Запись и чтение данных из файла
- •2.1. Организация вывода
- •2.2. Чтение содержания файла
- •2.3. Произвольный доступ к данным файла
- •3. Обслуживание файловой системы
- •5. Практические задания
- •6. Задания для самостоятельной работы
- •6.1. Файловый ввод-вывод
- •6.2. Обслуживание файловой системы
- •Приложение №1. Функции обслуживания файловой системы
- •Приложение №2. Команды консоли ms Windows
Fasm. Работа с файловой системой
Оглавление
Оглавление 2
1. Получение дескриптора файла 3
2. Запись и чтение данных из файла 4
2.1. Организация вывода 4
2.2. Чтение содержания файла 5
2.3. Произвольный доступ к данным файла 6
3. Обслуживание файловой системы 8
5. Практические задания 11
6.1. Файловый ввод-вывод 12
6.2. Обслуживание файловой системы 14
Приложение №1. Функции обслуживания файловой системы 18
Приложение №2. Команды консоли MS Windows 24
1. Получение дескриптора файла
Дескриптор файла – числовой код целого типа, который ос присваивает открытому физическому файлу. Операции ввода – вывода выполняются через дескриптор файла. В операционной системе MS Windows имеется набор системных дескрипторов.
Стандартные дескрипторы:
1 – вывод CON
2 – стандартная ошибка CON
3 – порт AUX (COM1)
4 – PRN (LPT1)
Для получения дескриптора файла его нужно открыть или создать с помощью соответствующей системной функции. Эти функции приводятся в приложении. При работе с файловыми функциями имена файлов и каталогов задаются в ASCIIZ формате. В таком формате последний код имени файла – 0. Для контроля за работой файловых системных функций используется бит CF регистра флагов процессора. Если значение бита равно 1, то функция отработала с ошибкой. Условный переход по значению бита выполняется с помощью команд JC (CF=1) и JNC (CF=0)
Пример 1.1. Создание файла без атрибутов.
use16
org 256
;=========================
mov AH,3Ch
mov CX,0 ;нет атрибутов
mov DX,myfile ;адрес имени файла
int 21h
jc fin ;создан ?
;=========================
push AX ;да, дескриптор в стек
fin: ;нет !
mov AX,4c00h
int 21h
myfile db 'test.txt',0
2. Запись и чтение данных из файла
2.1. Организация вывода
Занесение данных в файл по известному дескриптору выполняется с помощью функции 40h. Для занесения данных необходимо байты поместить в буфер. При создании текстовых файлов в операционной системе MS Windows строки символов должны замыкаться управляющими кодами LF(10) и CR (13).
Пример 2.1. Программа создания текстового файла из трех строк.
use16
org 256
;======================
mov AH,3Ch ;создать файл
mov CX,0
mov DX,myfile
int 21h
jc fin ;ошибка ?
push AX ;нет, дескриптор в стек
;======================
mov AH,40H ;записать строки в файл
pop BX ;дескриптор из стека
mov CX,n ;число байтов строк
mov DX,strings; адрес буфера вывода
int 21h
;======================
fin: ;выход в ОС
mov AX,4c00h
int 21h
;======================
myfile db 'greet.txt',0 ;файл
;буфер вывода:
strings db '================',10,13 ;
db '==Hello World !=',10,13
db '================',10,13
n=$-strings ;число байтов строк
2.2. Чтение содержания файла
На низком уровне любой файл это последовательность блоков байтов. Обычно эти блоки являются фиксированного размера. В этом случае файлы являются двоичными источниками данных. Структура двоичного файла с блоками фиксированной длины показана на рисунке.
Минимальной единицей – блоком данных является 1 – байт. В случае текстового файла это код символа, либо управляющие коды.
Выполнить чтение из файла блоков байтов можно с помощью с помощью системной функции 3Fh. Для контроля за работой функции используется содержание регистра AX, в него записывается количество байтов, полученных за одну операцию ввода-вывода.
Пример 2.2. Программа посимвольного чтения содержания файла, созданного в примере.
use16
org 100h
;=============================
mov ah,3dh ;открыть файл
mov dx,myfile
int 21h
jc all ;файл открыт?
push ax ;да, дескриптор в стек
;=============================
pop bx ;извлечь дескриптор
go: ;читать байты
mov ah,3Fh
mov cx,1 ;читать один байт
mov dx,buffer ;буфер хранения байта
int 21h
cmp AX,1 ;прочитан один байт ?
jne all ;нет больше байтов
mov ah,02h ;вывести байт на консоль
mov dl,[buffer] ;код байта из буфера
int 21h
jmp go
all: ;конец работы
;=============================
mov ah,08h
int 21h
mov ax,4c00h
int 21h
;=============================
myfile db 'greet.txt',0 ;файл с текстом
buffer db 0 ;буфер хранения байта
Результат работы программы показан на рисунке.
Рис.2.1. Вывод содержания файла на экран