Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab6.DOC
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
186.37 Кб
Скачать

Керування файловою системою

Починаючи з MS DOS 2.0 файлова система організована у вигляді директорій. Пошук файлів виконується тільки в межах поточної директорії, а створення і видалення файлів неприйнятні до директорій, хоча на найнижчому рівні директорія - той же файл, в атрибуті якого біт 4 встановлений у 1 і який містить список імен вкладених файлів, їхніх атрибутів і фізичних адрес на диску.

Функція DOS 39h: Створити директорію

Вхід: АН = 39h

DS:DX - адреса ASCIZ-рядка зі шляхом, у якому всі директорії, крім останньої, існують.

Вихід: CF = 0, якщо директорія створена

CF = 1 і АХ = 3, якщо шлях не знайдений; 5, якщо доступ заборонений

Функція LFN 39h: Створити директорію з довгим ім'ям

Вхід: AX=7139h

DS:DX - адреса ASCIZ-рядка з шляхом

Вихід: CF = 0, якщо директорія створена

CF = 1 і АХ = код помилки (7100h, якщо функція не підтримується)

Функція DOS 3Ah: Видалити директорію

Вхід: АН = 3Ah

DS:DX = адреса ASCIZ-рядка зі шляхом, де остання директорія буде вилучена (якщо вона порожня)

Вихід: CF = 0, якщо директорія вилучена

CF = 1 і АХ = 3, якщо шлях не знайдений; 5, якщо доступ заборонений; 10h, якщо директорія, що видаляється - поточна

Функція LFN 3Ah: Видалити директорію з довгим ім'ям

Вхід: AX=713Ah

DS:DX - адреса рядка з шляхом

Вихід: CF = 0, якщо директорія вилучена, інакше CF = 1 і АХ = код помилки

Функція DOS 47h: Визначити поточну директорію

Вхід: AH=47h

DL = номер диска (00h - поточний, 01h = А и т. д.)

DS:SI - 64-байтний буфер для поточного шляху (ASCIZ-рядок без імені диска, першого й останнього символу \)

Вихід: CF = 0 і АХ = 0100h, якщо операція виконана

CF = 1 і АХ = 0Fh, якщо зазначено неіснуючий диск

Функція LFN47h: Визначити поточну директорію з довгим ім'ям

Вхід: АХ - 7147h

DL - номер диска

DS:SI - буфер для шляху (ASCIZ-рядок без імені диска, першого й останнього символу \. Необов'язково містить лише довгі імена - повертається той шлях, що використовувався при останній зміні поточної директорії.)

Вихід: CF = 0, якщо директорія визначена, інакше CF = 1 і АХ = код помилки

Функція DOS 3Bh: Змінити директорію

Вхід: АН = 3Bh

DS:DX = адреса 64-байтного ASCIZ-буфера зі шляхом, що стане поточною директорією

Вихід: CF = 0, якщо директорія змінена, інакше CF =1 і АХ = 3 (шлях не знайдений)

Функція LFN3B: Змінити директорію з довгим ім'ям

Вхід: AX=713Bh

DS:DX = адреса ASCIZ - буфера зі шляхом

Вихід: CF = 0, якщо директорія змінена, інакше CF = 1 і АХ = код помилки

Перед роботою з будь-якими функціями LFN необхідно один раз викликати підфункцію 0A0h, щоб визначити розміри буферів для імен файлів і шляхів.

Функція LFN OAOh: Одержати інформацію про розділ файлової системи VFAT

Вхід: AX=71A0h

DS:DX = адреса ASCIZ-рядка з ім'ям розділу (наприклад: db "C:\",0)

ES:DI = адреса буфера для імені файлової системи (FAT, NTFS, CDFS)

СХ = розмір буфера в ES:DI (звичайно 32 байта)

Вихід: СХ = 0, АХ = 0000h або 0200h

ВХ = флаги файлової системи:

біт 0: функції пошуку враховують регістр символів

біт 1: регістр символів зберігається для імен директорій

біт 2: використовуються символи Unicode

біт 14: підтримуються функції LFN

біт 15: включено-стискування розділу (DoubleSpace)

СХ = максимальна довжина імені файлу (звичайно 255)

DX = максимальна довжина шляху (звичайно 260) у Windows 95 повертає 0000h для CD-ROM

CF = 1 і АХ = код помилки, якщо відбулася помилка (7100h, якщо функція не підтримується)

Крім того, при виклику будь-якої функції LFN варто встановлювати CF у 1 для сумісності з ранніми версіями DOS. Старі версії DOS не змінювали CF, так що в результаті, якщо функція не підтримується, CF залишиться рівним 1.

Завдання 1. (1 рівень, 2 рівень, 3 рівень)

1. Наберіть наведену нище програму.

; заміняє російську "Н" на латинські "H" у всіх файлах з розширенням .TXT у

; поточній директорії

.model tiny

.code

org 100h ; COM-файл

start:

mov ah,4Eh ; пошук першого файлу

xor cx,cx ; не системний, не директорія і т.д.

mov dx,offset filespec ; маска для пошуку в DS:DX

file_open:

int 21h

jc no_more_files ; якщо CF = 1 - файли скінчилися

mov ax,3D02h ; відкрити файл для читання і запису

mov dx,80h+1Eh ; зміщення DTA + зміщення імені файлу

int 21h ; від початку DTA

jc find_next ; якщо файл не відкрився - перейти до

; наступного

mov bx,ax ; ідентифікатор файлу в BX

mov cx,1 ; зчитати один байт

mov dx,offset buffer ; початок буфера - у DX

read_next:

mov ah,3Fh ; читання файлу

int 21h

jc find_next ; якщо помилка - перейти до наступного

dec ax ; якщо AX = 0 - файл скінчився -

js find_next ; перейти до наступного

cmp byte ptr buffer,41h ; якщо не прочитана російська "Н",

jne read_next ; зчитати наступний байт,

mov byte ptr buffer,4Bh ; інакше - записати в буфер

; латинську букву "H"

mov ax,4201h ; перемістити покажчик файлу від поточної

dec cx ; позиції назад на 1

dec cx ; CX = FFFFh

mov dx,cx ; DX = FFFFh

int 21h

mov ah,40h ; записати у файл

inc cx

inc cx ; один байт (CX = 1)

mov dx,offset buffer ; з буфера в DS:DX

int 21h

jmp short read_next ; зчитати наступний байт

find_next:

mov ah,3Eh ; закрити попередній файл

int 21h

mov ah,4Fh ; знайти наступний файл

mov dx,80h ; зміщення DTA від початку PSP

jmp short file_open

no_more_files: ; якщо файли скінчилися,

ret ; вийти з програми

filespec db '*.txt',0 ; маска для пошуку

buffer label byte ; буфер для читання/запису - за кінцем

; програми

end start

2. Проаналізувати программу за допомогою TD.

3. Разібрати логіку работи програми

4. Модифікуйте програму так, щоб вона міняла у текстових файлах поточної директорії всі латинські літери “А” на “К”.

Керування пам'яттю

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]