Автор: Пользователь скрыл имя, 26 Апреля 2012 в 23:49, контрольная работа
Мета: Ознайомитися та засвоїти особливості роботи з потоками вводу/виводу та
написання програм для опрацювання потокових даних.
Міністерствоосвіти і науки України
Національнийуніверситет„Львівс
КафедраЕОМ
Звіт
З розрахункової роботи
здисципліни:“Засоби системного програмування”
на тему:“ОПРАЦЮВАННЯ ПОТОКОВИХ ДАНИХ
ЗАСОБАМИ МОВИ АСЕМБЛЕР.”
Виконав:ст.гр.КІ-25
Грицюк П.О.
Прийняв
Торубка Т.В.
Львів 2012
Мета: Ознайомитися та засвоїти особливості роботи з потоками вводу/виводу та
написання програм для опрацювання потокових даних.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Основні принципи роботи з потоками вводу/виводу
Одне з основних призначень дискової операційної системи (DOS) було забезпечити
доступ до дисків та файлів, які на них зберігаються. Перші версії DOS підтримували лише
файлову систему FAT. Дана файлова система оперує файлами та директоріями, які
можуть мати будь-яке ASCII символьне ім’я в форматі 8.3 (8 ASCII символів назви і 3
ASCII символи розширення розділені крапкою). Останні версії DOS забезпечують
підтримку також і VFAT – модифікації FAT, яка підтримує довгі імена (до 255 символів).
Кожен файл або директорія має байт атрибутів. Призначення бітів цього байту наступне:
біт 7: резервний і завжди має бути рівним 0;
біт 6: резервний і завжди має бути рівним 0;
біт 5: архівний (визначає чи елемент FAT підлягає архівуванню);
біт 4: директорія (вказує чи елемент FAT є файлом або директорією);
біт 3: мітка тому (спеціальний атрибут, який мають лише унікальні файли
нульового розміру в кореневій директорії, ім’я яких вважається міткою тому)
біт 2: системний
біт 1: прихований
біт 0: тільки для читання
При роботі з файлами і директоріями в запущеній на виконання програмі (процесі)
одночасно можуть бути відкритими кілька файлів. Для їх ідентифікації використовується
двохбайтний дескриптор файлу (ідентифікатор). Перші 5 дескрипторів зарезервовані за
стандартними потоками вводу/виводу. Стандартні потоки вводу/виводу в ОС - це потоки
процесу, що мають номер (дескриптор) і є зарезервовані для деякої «стандартної»
функціональності. Стандартними дескрипторами (ідентифікаторами) потоків і
відповідними їм назвами є:
0 : STDIN - стандартний потік вводу (зазвичай клавіатура);
1 : STDOUT - стандартний потік виводу (зазвичай екран);
2 : STDERR - стандартний потік помилок (завжди екран);
3 : AUX - потік послідовного порту (зазвичай СОМ1);
4 : PRN - потік паралельного порту (зазвичай LPT1).
Розглянемо відмінності між файлами та потоками. У системі вводу/виводу, яку
забезпечує DOS, підтримується єдиний інтерфейс, що не залежить від того, до якого
конкретного пристрою здійснюється доступ (за винятком пристроїв обмін даними з якими
відбувається лише за допомогою інструкцій IN та OUT). Тобто в цій системі між
програмою й пристроєм перебуває щось загальніше, ніж сам пристрій. Такий
узагальнений пристрій вводу або виводу (пристрій більше високого рівня абстракції)
називається потоком, у той час як конкретний пристрій називається файлом.
Файлова система DOS призначена для роботи із різними пристроями, у тому числі
терміналами, дисководами, дисками й накопичувачами на магнітній стрічці. Навіть якщо
якийсь пристрій сильно відрізняється від інших, буферизована файлова система
представить його у вигляді логічного пристрою, що називається потоком. Всі потоки
4
мають схожу поведінку. І тому, що вони в основному не залежать від фізичних пристроїв,
то та ж функція, що виконує запис у дисковий файл, може здійснювати запис і у інший
пристрій, наприклад, у консоль чи у пристрій, що підключений через COM порт.
Взаємодія потоків і файлів реалізується шляхом зв’язування потоку із певним
файлом виконанням операції відкривання файлу. Як тільки файл відкритий, можна
проводити обмін інформацією між ним і програмою.
Але не у всіх файлів однакові можливості. Наприклад, до дискового файлу прямий
доступ можливий, у той час як до деяких принтерів - ні. Таким чином, ми прийшли до
важливої особливості системи вводу/виводу DOS: всі потоки однакові, а файли - ні.
Якщо файл може підтримувати запити на місце розташування (покажчик поточної
позиції), то при відкритті такого файлу покажчик поточної позиції у файлі встановлюється
в початок. При читанні з файлу (або запису в нього) кожного символу покажчик поточної
позиції збільшується, забезпечуючи тим самим просування по файлі.
Файл від'єднується від
потоком) за допомогою операції закривання. При закритті файлу, відкритого з метою
виводу, уміст (якщо він є) пов'язаного з ним буферу записується на зовнішній пристрій.
Цей процес, що звичайно називають дозаписом потоку, гарантує, що ніяка інформація
випадково не залишиться в буфері файлу.
Робота з файлами засобами мови асемблер принципово мало чим відрізняється від
роботи з файлами засобами мови С. Перед тим як працювати файлом (потоком) його
попередньо необхідно відкрити або створити, в результаті чого отримується дескриптор
файлу (потоку). Для цього використовуються функції 21 переривання DOS: 3Ch – функція
створення файлу, 3Dh – функція відкривання існуючого файлу (потоку), 5Bh – функція
створення та відкривання нового файлу, 5Ah – функція створення та відкривання
тимчасового файлу.
Після одержання дескриптора файлу (потоку) можна: читати вміст файлу (функція
3Fh), переміщувати вказівник по вмісту файлу (функція 42h), записувати у файл (функція
40h), записувати вміст файлових буферів DOS в потік (функція 68h) та записувати вміст
всіх буферів в потік (функція 0Dh).
Після завершення роботи з файлом (потоком) його треба закрити (функція 3Еh) та,
при потребі, видалити (функція 41h).
Існує також набір функцій для пошуку елементів FAT (файлів та папок). Для цього
використовуються функції DOS 4Eh, 1Ah, 4Fh.
Основні функції для роботи з файлами та потоками
Функція 3Ch (Створити файл)
Вхід: АН = 3Ch
CX = атрибут файлу:
біт 7: файл можна відкривати різним процесам в Novell Netware
біт 6: не використовується
біт 5: архівний біт (1, якщо файл має архівуватися засобами архівації)
біт 4: директорія (повинен бути 0 для функції 3Сh)
біт 3: мітка тому (ігнорується функцією 3Сh)
біт 2: системний файл
біт 1: прихований файл
біт 0: файл тільки для читання
DS:DX = адреса ASCIZ-рядка з шляхом до файлу (ASCIZ - це рядок ASCII-
символів, що кінчається нулем)
5
Вихід:
CF=0 і АХ = дескриптор файлу
CF=1 і АХ = 3, якщо шлях не знайдений
CF=1 і АХ = 4, якщо занадто багато відкритих файлів
CF=1 і АХ = 5, якщо доступ заборонений
Зауваження: DS:DX вказує на рядок, у якому прописано шлях до файлу. Якщо диск
і/або шлях не зазначений, вони приймаються за замовчуванням (для файлів - поточна
директорія запущеного процесу). Якщо файл уже існує, ця функція всеодно відкриває
його, встановлюючи йому нульову довжину. Щоб уникнути цього, треба скористатися
функцією 5Вh.
Функція яяяяяя_3Dh (Відкрити існуючий файл або потік)
Вхід:
АН = 3Dh
AL = режим доступу:
біти 0 і 1: 00 - відкрити для читання
01 – відкрити для запису
10 - відкрити для читання і запису
біт 2: зарезервований (0)
біт 3: зарезервований (0)
біт 6-4: режим доступу для інших процесів:
000: режим сумісності (інші процеси також повинні відкривати цей
файл у режимі сумісності)
001: всі операції заборонені
010: запис заборонений
011: читання заборонене
100: заборон немає
біт 7: файл не успадковується породжуваними процесами
DS:DX = адреса ASCIZ-рядка з шляхом до файлу або потоку
CL = маска атрибутів файлу
Вихід:
CF=0 і АХ = дескриптор файлу(потоку)
CF=1 і АХ = 2, якщо файл не знайдений
CF=1 і АХ = 3, якщо шлях не знайдений
CF=1 і АХ = 4, якщо занадто багато відкритих файлів
CF=1 і АХ = 5, якщо доступ заборонений
CF=1 і АХ = 0Сh, неправильний режим доступу
Зауваження: DS:DX вказує на рядок, у якому прописано шлях до файлу або потоку.
Якщо диск і/або шлях не зазначений, вони приймаються за замовчуванням. Файл повинен
існувати. Стандартні потоки вводу/виводу завжди відкриті.
Функція 3Fh (Читання з потоку)
Вхід:
АН = 3Fh
BX = дескриптор потоку
CX = кількість байтів, які необхідно прочитати
DS:DX = адреса буфера для прийому даних (має бути не меншим, ніж кількість
байтів, які необхідно прочитати)
6
Вихід:
CF=0 і АХ = число прочитаних байтів
CF=1 і АХ = 05h, якщо доступ заборонений
CF=1 і АХ = 6, якщо неправильний ідентифікатор
Зауваження: Якщо при читанні з файлу число фактично прочитаних байтів в АХ
менше, ніж бажана кількість в СХ, то був досягнутий кінець файлу. Кожна наступна
операція читання, так само як і запису, починається не з початку файлу, а з того байта, на
якому зупинилася попередня операція читання/запису. Якщо потрібно прочитати (або
записати) у довільну ділянку файлу, то для цього використають функцію 42h для переходу
до цієї ділянки файлу.
Необхідно завжди порівнювати значення, яке повертається в АХ (число
прочитаних байтів) із вмістом СХ (бажане число байтів):
якщо АХ = СХ і CF = 0 - читання було коректним і без помилок
якщо АХ = 0 і CF = 0 - досягнуть кінець файлу (EOF)
якщо AX < CX (але не нульовий) і CF = 0, то:
при читанні з пристрою - вхідний рядок має довжину АХ байт
при читанні з файлу - у процесі читання досягнуть EOF
Якщо відбувається читання із пристрою, то АХ повертає довжину прочитаного
рядка з урахуванням завершального символу повернення каретки CR (ASCII 0Dh).
Функція 40h (Запис у потік)
Вхід:
АН = 40h
BX = дескриптор потоку
DS:DX = адреса початку рядка
CX = бажане число байт для запису
Вихід:
CF =0 і AX = число записаних байтів, якщо запис відбувся коректно
CF =1 і AX = код помилки, у випадку виникнення помилок
Зауваження: Потрібно завжди порівнювати значення, яке повертається в АХ (число
записаних байтів) з СХ (бажане число байт для запису):
якщо АХ = СХ і CF =0, то запис був успішним
якщо АХ < СХ і CF =0, то трапилася помилка (швидше за все переповнення)
Ця функція може виводити на екран символ $.
Функція 42h (Перемістити вказівник у файлі)
Вхід:
АН = 42h
BX = дескриптор потоку
CX:DX = знакові числа, що визначають відстань на яку необхідно перемістити
вказівник: (CX * 65536) + DX
AL = переміщення:
0 – від початку файлу
1 – від поточної позиції
2 – від кінця файлу
7
Вихід:
CF =0 і CX:DX = нове значення вказівника (в байтах від початку файлу)
CF =1 і AX = 06, якщо не правильний ідентифікатор.
Зауваження: Вказівник можна встановлювати за реальними межами файлу: в
негативне число, тоді наступна операція читання/запису згенерує помилку; в позитивне
число, більше, ніж довжина файлу, тоді наступна операція читання/запису збільшить
розмір файлу.
Для одержання довжини файлу в парі регістрів DX:AX, яку слід інтерпретувати за
формулою: Довжина = (DX * 65536) + AX, - необхідно викликати цю функцію з
параметрами: AL=2, CX=0, DX=0.
Функція 3Eh (Закрити файл або потік)
Вхід:
АН = 3Eh
BX = дескриптор потоку
Вихід:
CF= 0, якщо не відбулася помилка
CF= 1 і АХ = 6, якщо BX містить неправильний ідентифікатор
Зауваження: Якщо файл був відкритий для запису, то всі файлові буфери
скидаються на диск, встановлюється час зміни файлу й записується його нова довжина.
Функція 41h (Видалити файл)
Вхід:
АН = 41h
DS:DX = адреса ASCIZ-рядка з шляхом до файлу
Вихід:
CF=0, якщо файл видалено
CF=1 і АХ = 02h, якщо файл не знайдений
CF=1 і АХ = 03h, якщо шлях не знайдений
CF=1 і АХ = 05h, якщо доступ заборонений
Зауваження: Видалити файл можна тільки після того, як він буде закритий, інакше
DOS продовжить виконання запису в неіснуючий файл, що може привести до
РУЙНУВАННЯ ФАЙЛОВОЇ СИСТЕМИ. Функція 42h не дозволяє використати маски
(символи * і ? в імені файлу)
для видалення відразу
Функція 39h (Створити директорію)
Вхід:
АН = 39h
DS:DX = адреса ASCIZ-рядка зі шляхом, у якому всі директорії, крім останньої,
існують. Для DOS 3.3 і попередніх версій довжина рядка не повинна перевищувати
64 байта.
Вихід:
CF=0, якщо директорія створена
CF=1 і АХ = 3, якщо шлях не знайдений
CF=1 і АХ = 5, якщо доступ заборонений
8
Функція 3Аh (Видалити директорію)
Вхід:
АН = 3Ah
DS:DX = адреса ASCIZ-рядка зі шляхом, де остання директорія буде видалена
(тільки якщо вона порожня, не є поточною, не зайнята командою SUBST).
Вихід:
CF=0, якщо директорія видалена
CF=1 і АХ = 3, якщо шлях не знайдений
CF=1 і АХ = 5, якщо доступ заборонений
CF=1 і АХ = 10h, якщо видаляє директорія, що, - поточна
Функція 3Вh (Змінити поточну директорію)
Вхід:
АН = 3Bh
DS:DX = адреса 64-байтного ASCIZ-буфера зі шляхом, що стане поточною
директорією
Вихід:
CF=0, якщо директорія змінена
CF=1 і АХ = 3, якщо шлях не знайдений
Функція 47h (Визначити поточну директорію)
Вхід:
АН = 47h
DL = номер диска (00h - поточний, 01h - A і т.д.)
DS:SI = 64-байтний буфер для
першого й останнього символів ‘\’)
Информация о работе Опрацювання потокових даних засобами Мови Асемблер