![]() |
Читання даних з файла або від пристрою
Для пересилання заданої кількості байтів у буфер із файла або пристрою символьної обробки (клавіатури) використовується функція 3Fh переривання INT 21h. Для виклику цієї функції необхідно помістити у регістри таку інформацію: На вході: AH = 3Fh; BX = номер каналу відкритого файла; СХ = кількість байтів, що передаються; DS:DX = адреса буфера для даних. На виході: АХ = кількість переданих байтів або код помилки, якщо передача даних не відбулася.
Запис даних у файл або на пристрій Для пересилання заданої кількості байтів із буфера у файл або на пристрій символьної обробки (дисплей) використовується функція INT 40h переривання 21h. Для виклику цієї функції необхідно помістити таку інформацію у регістри: На вході: AH = 40h; BX = номер каналу відкритого файла; СХ = кількість байтів, що передаються; DS:DX = адреса буфера для даних. На виході: АХ = кількість переданих байтів або код помилки, якщо передача даних не відбулася.
Вилучення файла Файл може бути вилучено функцією 41h переривання 21h. Специфікація цієї функції наведена нижче. На вході: AH = 41h; DS:DX = ASCIІ-рядок з іменем файла; CL = атрибути файла, що вилучається. На виході: якщо прапорець CF = 1, тоді AX містить код помилки: АХ = 2 – файл не знайдено; АХ = 3 – невірно задано шлях; АХ = 5 – відказано в доступі. Функція 41h не дозволяє вилучати файли з атрибутом “тільки для читання”. В цьому випадку слід змінити атрибути файла, що вилучається, за допомогою функції 43h.
Приклад програми роботи з файлом
Нехай, наприклад, необхідно створити файл FILE3.DAT у підкаталозі Е:\ТОМ і записати в нього п’ять однорозрядних чисел, розділених пропусками. Для розв'язання вказаної задачі необхідно спочатку створити файл, потім переслати в нього 9 символів (цифри разом із пропусками), а після цього закрити файл. Така програма буде мати вигляд, наведений нижче. NAME PROG2 SSTACK SEGMENT STACK DB 128 DUP (?) SSTACK ENDS DATA SEGMENT ADDR DB “E:\TOM\FILE3.DAT”,0 BUF DB “3 5 7 9 1” DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:SSTACK START PROC FAR PUSH DS SUB AX,AX PUSH AX MOV AX, DATA MOV DS, AX CALL MAIN RET START ENDP MAIN PROC MOV AH, 03Ch MOV CX, 0 MOV DX, OFFSET ADDR INT 21h MOV BX, AX MOV AH, 40h MOV CX, 9 MOV DX, OFFSET BUF INT 21h MOV AH, 03Fh INT 21h RET MAIN ENDP CODE ENDS END START Методи доступу до файлів Існує два основних методи доступу до файлів: послідовний і прямий. У файлах із послідовним методом доступу (їх називають також послідовними файлами) елементи даних (рядки) можуть бути змінної довжини і розділятися між собою парою символів: спочатку символом CR повернення каретки (ASCII-код - 13), а потім символом LF переведення рядка (ASCII-код – 11). У файлах з прямим доступом заздалегідь відводять фіксоване місце під кожний елемент даних. Якщо деякий елемент не займає все відведене під нього місце, то залишок заповнюється пропусками. У цьому випадку, знаючи розмір, який відводиться під елемент даних, досить легко визначити місце розташування будь-якого елемента даних за його номером. Для пошуку потрібного елемента даних використовується файловий покажчик, який може бути встановлений у потрібну позицію за допомогою функції 42h переривання INT 21h. Для виклику цієї функції необхідно заповнити регістри такою інформацією: На вході: AH = 42h; AL = вид доступу: 0 – абсолютне зміщення від початку файла; 1 – зміщення від поточної позиції; 2 – зміщення відносно кінця файла; СХ = старший байт зміщення; DX = молодший байт зміщення; ВХ = номер каналу файла. На виході: DX = перший байт поточної позиції покажчика, АХ = молодший байт покажчика або код помилки при невиконанні функції. За допомогою цієї функції можна визначити розмір файла, що досить корисно для послідовних файлів.
Алгоритм запису даних у послідовний файл
Для запису даних у послідовний файл слід виконати такі дії: 1) Створити файл за допомогою функції 3Сh. 2) Ввести дані (з клавіатури або з іншого файла) в область буфера: BUF DB 30 DUP (?), 13, 10 (тут під елемент відводиться 30 байтів). 3) Виконати запис даних у файл за допомогою функції 40h. 4) Закрити файл за допомогою функції 3Eh. Для додавання даних в існуючий файл необхідно виконати такі дії: 1) Відкрити файл за допомогою функції 3Dh. 2) Установити покажчик файла в його кінець за допомогою функції 42h; 3) Ввести дані в область буфера. 4) Виконати запис даних у файл за допомогою функції 40h. 5) Закрити файл за допомогою функції 3Eh.
Алгоритм читання даних із послідовного файла При читанні даних із послідовного файла необхідно виконати таку послідовність дій: 1) Відкрити файл за допомогою функції 3Dh. 2) Визначити довжину файла за допомогою функції 42h шляхом встановлення покажчика на його кінець. 3) Встановити покажчик файла на його початок за допомогою функції 42h. 4) Переслати дані з файла в область буфера за допомогою функції 3Fh. 5) Вивести дані з буфера на пристрій або в інший файл за допомогою функції 40h. 6) Закрити файл за допомогою функції 3Eh. Якщо потрібно здійснити операцію введення-виведення в середину послідовного файла, тоді n-й елемент даних знаходиться методом підрахунку n розділювачів CR/LF.
Операції читання та запису даних У файлах прямого доступу
Операції читання та запису даних у файлах прямого доступу відрізняється від аналогічних операцій з послідовними файлами лише способом пошуку потрібного елемента даних. Позиція n-го елемента даних дорівнює добутку розміру місця, що відводиться під елемент даних, на число (n-1).
Приклад програми читання даних із послідовного файла Нехай, наприклад, необхідно вивести на екран дисплея вміст файла D:\TOM\PRIM.ASM. Така програма буде мати вигляд, наведений нижче. NAME PROG3 SSTACK SEGMENT STACK DB 128 DUP (?) SSTACK ENDS DATA SEGMENT ADDR DB “D:\TOM\PRIM.ASM”,0 BUF DB 1000 DUP (?) HANDLE DW ? SIZE1 DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:SSTACK START PROC FAR PUSH DS SUB AX, AX PUSH AX MOV AX, DATA MOV DS,AX CALL MAIN RET START ENDP MAIN PROC ; відкриття файла MOV AH, 03Dh MOV AL, 0C2h MOV DX, OFFSET ADDR INT 21h MOV HANDLE, AX ; визначення розміру файла MOV BX, AX MOV AH, 42h MOV AL, 2 MOV CX, 0 MOV DX, 0 INT 21h MOV SIZE1, AX ; установлення покажчика на початок файла MOV AH, 42h MOV AL, 0 MOV CX, 0 MOV DX, 0 INT 21h ; пересилання даних із файла у буфер MOV AH, 03Fh MOV CX, SIZE1 MOV SX, OFFSET BUF INT 21h ; виведення даних із буфера на екран дисплея MOV BX, 1 MOV AH, 040h MOV CX, SIZE1 MOV DX, OFFSET BUF INT 21h ; закриття файла MOV BX, HANDLE MOV AH, 03Fh INT 21h RET MAIN ENDP CODE ENDS END START
Дана програма по суті виконує команду DOS, яка видає вміст файла PRIM.ASM на екран дисплея:
TYPE D:\TOM\PRIM.ASM
Робота з атрибутами файлів Операційна система дозволяє отримати для аналізу і при необхідності змінити ім’я файла, атрибути файла, дату і час його останньої модифікації. Для цього призначені функції 43h, 56h, 57h переривання 21h. При цьому для функції 43h підфункція 00 призначена для отримання, а підфункція 01 – для встановлення слова атрибутів файла. Аналогічно для функції 57h підфункції 00 та 01 дозволяють отримати та змінити дату і час відповідно. Отримання атрибутів файла На вході: AX = 4300h; DS:DX = ASCII-рядок з повним іменем файла. На виході: якщо прапорець CF = 0, тоді в регістрі CX слово атрибутів файла, причому його формат такий: 7-й біт – розділяється в NovellNetWare; 6-й біт – не використовується; 5-й біт – архівний; 4-й біт – каталог; 3-й біт – мітка тома; 2-й біт – системний; 1-й біт – прихований; 0-й біт – тільки для читання. якщо CF = 1, тоді AX містить код помилки: АХ = 1 – невірне значення в AL; АХ = 2 – файл не знайдено; АХ = 3 – вказаний шлях не існує; АХ = 5 – доступ заборонено. Наведемо фрагмент коду, що демонструє отримання атрибутів файла. . . . .data fname db "MyFile.asm" Address dd fname . . . .code . . . lds dx, ADDRESS mov ax,4300h ;номер функції DOS int 21h jc exit ;Перехід у випадку помилки . . . ; Тепер в CX – атрибути файла . . . exit: . . . Встановлення атрибутів файла На вході: AX = 4301h; CX = нове слово атрибутів файла; DS:DX = ASCII-рядок з повним іменем файла. На виході: якщо прапорець CF = 1, тоді AX містить код помилки: АХ = 1 – невірне значення в AL; АХ = 2 – файл не знайдений; АХ = 3 – вказаний шлях не існує; АХ = 5 – доступ заборонений. Перейменування файла На вході: AH = 56h; DS:DX = ASCII-рядок з іменем існуючого файла; ES:DI = ASCII-рядок з іменем нового файла; На виході: якщо прапорець CF = 0, тоді перейменування файла виконано успішно; якщо прапорець CF = 1, тоді AX містить код помилки: АХ = 1 – невірне значення в AL; АХ = 2 – файл не знайдений; АХ = 3 – вказаний шлях не існує; АХ = 5 – доступ заборонений; АХ = 11h – у разі, якщо пристрої для нового і старого файлів не збігаються. Дана функція дозволяє здійснити переміщення між каталогами, не змінюючи пристрою. Наведемо фрагмент коду, що демонструє переміщення між каталогами, не змінюючи пристрою.
. . . .data OLDNAME db "Myfile1.asm",0 addrold dd oldname newname db "e:\myfile1.asm",0 addrnew dd newname . . . .code . . . lds dx, addrold les di, ADDRnew mov ah,56h int 21h jc exit ;Перехід у випадку помилки . . . exit: . . . Отримання дати і часу створення або останньої модифікації файла
На вході: AX = 5700h; BX = дескриптор файла. На виході: якщо прапорець CF = 0, тоді в CX і DX інформація про час і дату (табл.12): CX = час; DX = дата. якщо прапорець CF = 1, тоді AX містить код помилки: AX = 1 – заборонений номер підфункції в AL; АХ = 6 – заборонений дескриптор.
Таблиця12 – Формат часу і дати створення або модифікації файла
Встановлення дату і час створення або останньої модифікації файла На вході: AX = 5701h; BX = дескриптор файла; CX = новий час; DX = нова дата. На виході: якщо прапорець CF = 0, тоді в CX і DX інформація про встановлені час і дату: CX = час; DX = дата. якщо прапорець CF = 1, тоді AX містить код помилки: AX = 1 – недопустимий номер підфункції в AL; АХ = 6 – недопустимий дескриптор. |
|||||||||||||||||||
|