Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
labs&konspeckts / SP_ukr / asm_14_доперевести.doc
Скачиваний:
15
Добавлен:
12.05.2015
Размер:
408.06 Кб
Скачать

Робота з файлами

Мета роботи: Вивчення способів вводу інформації в програму з файлів на диску, а також виводу з програми в файли на диску засобами операційної системи 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

Соседние файлы в папке SP_ukr