
- •Робота з файлами
- •Теоретичні відомості
- •Работа с файлами с длинными именами в ms-dos
- •Описание функций для работы с файлами с длинными именами:
- •716Сh - открыть или создать файл
- •7141H – удаление файла с длинным именем.
- •714Eh - поиск первого соответствующего файла с длинным именем
- •714Fh – найти следующий файл
- •5706H – получить дату и время создания файла
- •5707H – установить дату и время создания или последней модификации файла
- •7143H – получить или установить атрибуты файла
- •7156H – переименовать файл
- •7160H – Получить полный путь файла
- •Вспомогательные функции при работе с файлами:
- •67H – изменить максимальное число идентификаторов файлов, доступных для одновременной работе в системе:
- •71A7h – Преобразование времени из Windows-формата в dos-формат и наоборот
- •Рекомендации по построению программы, использующей функции работы с файлами
- •1) Обработка ошибок – вывод сообщения о конкретной ошибке
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •2) Вывод информации о файле
- •3) Поиск файла с длинным именем
- •Int 21h
- •Додаток 0
- •Приложение 2 Примеры и алгоритмы программ, использующих функции работы с файлами
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Int 21h
- •Xor ah,ah
- •Int 21h
- •Int 21h
Робота з файлами
Мета роботи: Вивчення способів вводу інформації в програму з файлів на диску, а також виводу з програми в файли на диску засобами операційної системи MS DOS.
Теоретичні відомості
Практично при виконанні будь-якої програми виникає необхідність вводу або виводу символьної інформації, для чого в мовах високого рівня є спеціальні оператори вводу-виводу, які дозволяють в зручній формі реалізувати ці функції. У системі команд МП INTEL-80x86 також є команди вводу-виводу, але вони реалізують ці операції на самому низькому (фізичному рівні), тобто забезпечують звернення до портів вводу-виводу за конкретними адресами. Тому для забезпечення вводу або виводу на цьому рівні програміст повинен знати номери портів відповідного пристрою, а також алгоритми обслуговування кожного пристрою. Все це вимагає не тільки докладного вивчення системної документації, але і високого професіоналізму. Для полегшення програмування операцій по введенню-виведенню в операційній системі MS DOS реалізовані спеціальні сервісні функції, що забезпечують ввід-вивід на логічному рівні. При цьому прикладна програма повинна тільки повідомити необхідні для даної функції параметри і передати управління DOS, яка здійснює всі необхідні операції по управлінню пристроєм і передачі даних на фізичному рівні, а потім повертає управління прикладній програмі, повідомляючи також про те, чи успішно завершилася операція або ж були зафіксовані помилки. Цей механізм значною мірою спрощує реалізацію вводу-виводу, оскільки програмісту необхідно тільки знати схему виклику функцій і необхідні параметри для її виконання.
В асемблерних програмах для виклику сервісних функцій MS DOS використовується команда INT 21H (програмне переривання по вектору 21H), крім того, для реалізації деяких специфічних функцій управління відповідними командами INT можна передавати безпосередньо Базовій системі вводу -виводу (BIOS); наприклад, через INT 10H реалізовуються функції управління дисплеєм, відсутні в наборі сервісних функцій DOS. Нижче пояснюються особливості роботи з файлами в ассемблерних програмах.
Файл являє собою сукупність розташованих на диску в логічної послідовності записів, кожному з яких поставлений у відповідність номер, причому нумерація ведеться з нуля. Таким чином, указавши ім'я файла і номер запису, можна однозначно ідентифікувати деякий конкретний запис, щоб прочитати або записати його. Є два способи доступу до записів: послідовний і довільний. У разі послідовного доступу покажчик читання/запису файла встановлюється автоматично на наступну позицію при виконанні кожної операції читання або запису. При відкритті файла цей покажчик встановлюється на початок файла. При довільному доступі необхідно перед операцією читання (або запису) спочатку зробити позиціонування покажчика читання/запису файла на необхідний запис, а потім здійснювати безпосередньо операцію. Крім функцій читання і запису при роботі з файлами потрібні і деякі інші функції, такі як створення файла, якщо його ще немає на диску або відкриття його для роботи, якщо він раніше вже був створений. По закінченні роботи файл необхідно закрити. При виконанні операцій читання і запису в режимі прямого доступу потрібна також функція позиціонування покажчика читання/запису файла. Іноді може виявитися корисною функція читання або зміни атрибутів файла. У такому випадку в інструкції по MS DOS рекомендується замість FCB- орієнтованого управління файлами використати так званий Handle- орієнтоване управління файлами (через описувачі файла), яке спрощує програмування операцій з файлами і дозволяє здійснювати обмін інформацією між прикладною програмою і файлами за допомогою одних і тих же функцій, незалежно від природи файлів, зокрема під файлом може матися на увазі стандартний пристрій вводу/виводу типу CON: або PRN:. Зручність складається і в тому, що прикладна програма при створенні (або відкритті існуючого) файла передає DOS повне ім'я файла у вигляді символьного рядка, натомість отримує від DOS описувач файла у вигляді 16- розрядного числа і потім всі подальші операції з файлом проводить через цей описувач. При завантаженні MS DOS відкриває п'ять стандартних файлів (пристроїв) з фіксованими описувачами:
0 - пристрій вводу (клавіатура),
1 - пристрій виводу (екран дисплея),
2 - пристрій виводу (завжди CON: - екран дисплея),
3 - зовнішній пристрій AUX (асинхронний адаптер СОМ1),
4 - принтер (перший паралельний порт принтера LPT1).
Нижче приводиться короткий опис основних файлових функцій. При виклику будь-який з них код функції повинен бути вміщений в регістр АН, додаткові параметри звичайно розташовуються в регістрах AL, BX, CX, DX. Значення, що повертаються у вигляді інформації про файл або помилки звичайно вміщуються в регістри AX і DX. Ознакою успішного закінчення будь-якої операції служить прапор CF, який встановлюється в 0 при нормальному завершенні операції і в 1 при виникненні помилки. При цьому в регістрі АХ повертається код помилки.
АН = 3сН Створення файла
DS:DX - адреса символьного рядка специфікації файла
СХ - атрибут файла
Повернення: АХ - описувач файла (якщо немає помилки)
код помилки (CF = 1)
АН = 3dН Відкриття файла
DS:DX - адреса символьного рядка специфікації файла
AL - режим відкриття файла
Повернення: АХ - описувач файла (якщо немає помилки)
код помилки (CF = 1)
АН = 3еН Закриття файла
ВХ - описувач файла
Повернення: АХ - код помилки (CF = 1)
АН = 41Н Знищення файла
DS:DX - адреса символьного рядка специфікації файла
Повернення: АХ - код помилки (CF = 1)
АН = 42Н Встановити покажчик у файлі
ВХ - описувач файла
СХ:DX - величина зміщення покажчика (СХ * 65535) + DX
AL - код зміщення покажчика: 0 - від початку файла
1 - від поточної позиції
2 - від кінця файла
Повернення: DX:АХ - нова позиція покажчика файла (якщо немає помилки)
AX - код помилки (CF = 1)
АН = 3fH Читання з файла - 39
BX - описувач файла
DS:DX - адреса буфера для прийому даних
СХ - кількість байтів, що читаються
Повернення: АХ - кількість прочитаних байтів (якщо немає помилки)
код помилки (CF = 1)
АН = 40Н Запис в файл
BX - описувач файла
DS:DX - адреса буфера з даними для запису в файл
СХ - кількість байтів, що записуються
Повернення: АХ - кількість записаних байтів (якщо немає помилки)
код помилки (CF = 1)
Приклад використання файлових функцій на прикладі фрагмента програми, яка виконує перекодування заданого текстового файла з ім'ям, заданим користувачем, з рядкових в прописні букви.
LEA DX, Prompt; Завантаження адреси повідомлення
MOV AH, 9
INT 21h; запит імені файла
LEA DX, File_Name; Завантаження адреси приймача
MOV AH, 0Ah
INT 21h; Ввід імені файла у формі: ім”я.розширення
; Підготувати ASCII-рядок з ім'ям файла
ADD DX, 2; DX - адреса поч.текста імені файла
MOV BL, File_Name+1; BL - довжина введеня імені
SUB BH, BH
MOV BYTE PTR [BX-1], 0; записати 0 в кінець рядка
MOV AX, 3D02h; доступ для читання і запису
INT 21h; Відкрити файл
JC Error
MOV BX, AX; зберегти описувач файла
; Цикл читання (послідовний доступ),
; перекодування і записи (прямий доступ)
; Набути поточного значення покажчика читання/запису перед читанням
R_Seek: SUB CX, CX
MOV DX, CX; CX:DX = 0
MOV AX, 4201h; поточна позиція покажчика
INT 21h
JC Error
PUSH DX
PUSH AX; поточна позиція покажчика в стек
; Читання чергових 128 байт з файла
MOV CX, 128
LEA DX, Buffer
MOV AH, 3Fh
INT 21h
JC Error
OR AH, AL
JZ End_File; кінець файла
CMP AX, CX
JE Okey
SUB AH, AH; ознака кінця файла
Okey: MOV CL, AL; лічильник обробки
MOV DI, CX; зберегти лічильник
SUB SI, SI
; Обробка прочитаної в буфер інформації
Conv: MOV AL, Buffer[SI]; взяти символ
CMP AL, 'a'
JB Next; якщо не рядкова
CMP AL, 'z'
JA Next; буква, то продовжити
AND Buffer[SI], 01011111b; інакше перетворити
Next: INC SI
LOOP Conv
MOV SI, AX
POP DX; покажчик
POP CX; файла в CX:DX
; Встановити покажчик файла на те місце, звідки було читання
MOV AX, 4200h
INT 21h
JC Error
; Запис буфера в файл
LEA DX, Buffer
MOV CX, DI; довжина запису
MOV AH, 40h
INT 21h
JC Error
MOV AX, SI
OR AH, AH
JNZ R_Seek; якщо не кінець файла, то продовжити
End_File: MOV AH, 3Eh; інакше закрити файл
INT 21h
JC Error
MOV AX, 4D00h
INT 21h; завершення програми
; Обробка помилок
Error: CMP AL, 9
JBE Know_Err
MOV AL, 10
Know_Err: SUB AH, AH
SHL AX, 1
LEA BX, Err_Table-2
ADD BX, AX
MOV DX, [BX]; вибрати адресу тексту помилки
MOV AH, 9
INT 21h; виводу помилки
MOV AX, 4D00h
INT 21h; завершення програми
;
File_Name DB 20,0,21 DUP (?)
LF EQU 10
CR EQU 13
EOM EQU '$'
Prompt DB ' Введіть ім'я текстового файла: ', CR, LF, EOM
Err1 DB ' Невірний номер функції', CR, LF, EOM
Err2 DB ' Файл не знайдений', CR, LF, EOM
Err3 DB ' Шлях не знайдений', CR, LF, EOM
Err4 DB ' Дуже багато відкритих файлів', CR, LF, EOM
Err5 DB ' Доступ заборонено', CR, LF, EOM
Err6 DB ' Невірний описувач', CR, LF, EOM
Err7 DB ' Зруйновані блоки управління пам\'яттю', CR, LF, EOM
Err8 DB ' Недостатньо пам\'яті', CR, LF, EOM
Err9 DB ' Невірна адреса блоку пам\'яті', CR, LF, EOM
Err10 DB ' Невстановлена помилка', CR, LF, EOM
Err_Table DW Err1, Err2, Err3, Err4, Err5, Err6, Err7, Err8, Err9, Err10
Buffer DB 128 DUP (?)
END