- •Fasm. Работа с файловой системой
- •2. Запись и чтение данных из файла
- •2.1. Организация вывода
- •2.2. Чтение содержания файла
- •2.3. Произвольный доступ к данным файла
- •3. Обслуживание файловой системы
- •5. Практические задания
- •6. Задания для самостоятельной работы
- •6.1. Файловый ввод-вывод
- •6.2. Обслуживание файловой системы
- •Приложение №1. Функции обслуживания файловой системы
- •Приложение №2. Команды консоли ms Windows
2.3. Произвольный доступ к данным файла
Если блоки байтов файла фиксированной длины, то можно выполнить произвольное чтение любого блока, либо можно выбрать определенный блок для перезаписи. Для организации произвольного доступа к файлы используется системная функция 42h.
Пример 2.3. Программа чтения из файла greet.txt байта со смещение 20 от начала.
use16
org 100h
;==========================
mov ah,3dh ;открыть файл
mov al,00
mov dx,myfile
int 21h
jc all
push ax
;==========================
pop bx
mov ah,42h;установить указатель
mov al,00
mov cx,00
mov dx,20 ;Смещение 20
int 21h
;==========================
mov ah,3Fh ;читать байт
mov cx,01 ;для чтения
mov dx,buffer ;буфер ввода
int 21h
;==========================
mov ah,02 ;вывести буфер
mov dl,[buffer]
int 21h
;=========================
all:;конец работы
mov ah,08h
int 21h
mov ax,4c00h
int 21h
Пример 2.4. Программа, заменяющая символ H строки на символ #.
use16
org 100h
;=============================
mov ah,3dh ;открытие файла
mov al,01
mov dx,myfile
int 21h
jc all ;ошибка открытия
push ax ;дескриптор в стек
;=============================
pop bx ;дескриптор из стека
mov ah,42h
mov al,00
mov cx,00
mov dx,20 ;смещение к байту
int 21h
;=============================
;Заменить байт
mov ah,40h
mov cx,01
mov dx,buffer
int 21h
;=============================
all: ;конец работы
mov ah,08h
int 21h
mov ax,4c00h
int 21h
;=============================
myfile db 'greet.txt',0
buffer db '#'
Результат работы программы, показан на рисунке.
Рис.2.2. Результат работы программы
3. Обслуживание файловой системы
Обслуживание файловой системы может быть выполнено путем вызова ряда системных функций. При работе с файлами доступ к ним выполняется не по дескриптору, а по имени ASCIIZ причем файлы должны быть закрыты.
Имена каталогов, так же указываются в ASCIIZ формате.
Пример 3.1. Работа с атрибутами файла. Проверка наличие атрибута у файла «только – чтение».
use16
org 256
;===============================
mov AH,43h ;получить атрибуты
mov AL,0
mov DX,myfile
int 21h
jc fin ;ошибка?
;===============================
and CX,01 ;нет, R?
jz fin ;нет,конец работы
mov AH,09 ;да,вывести сообщение
mov DX,mesR
int 21h
;==============================
fin: ;конец работы
mov AH,08
int 21h
mov AX,4c00h
int 21h
mesR db 'R - OK !',10,13,'$'
myfile db 'test.txt',0 ;тестируемый файл.
Сеанс работы с программой показан на рисунке 3.1. Файл с кодом программы tstr.com. Файл должен быть предварительно создан в текущем каталоге программным способом либо средствами ОС. Например, с помощью команды copy con test.txt.
Рис.3.1. Сеанс работы с программой
Для просмотра и установки атрибутов используется консольная команда attrib. Если атрибут не найден, то программа завершает свою работу без вывода контрольного сообщения.
Пример 3.2. Создание каталога в текущем каталоге.
use16
org 256
;==========================
mov AH,39h ;создать каталог
mov DX,myDIR
int 21h
jnc ok ;каталог создан?
jmp fin ;нет, конец работы
ok:
mov AH,09;контрольное сообщение
mov DX,mes
int 21h
;==========================
fin: ;конец работы
mov AH,08
int 21h
mov AX,4c00h
int 21h
;===========================
mes db 'Created !',10,13,'$'
myDIR db 'TESTDR',0
Пример 3.3. Организация поиска файла.
use16
org 256
;============================
mov AH,4eh ;поиск файла
mov CX,0
mov DX,testmask
int 21h
jc fin ;нет файла !
;============================
mov BX,9eh ;PSP->80h+1eh
go: ;читать байты имени файла
mov dl,[bx]
cmp dl,0
je fin
mov ah,02;вывести байт на консоль
int 21h
inc bx ;следующий байт
jmp go
;=============================
fin:
mov AH,08
int 21h
mov AX,4c00h
int 21h
testmask db "*.txt",0;маска поиска