Міністерство освіти і науки України
Національний університет "Львівська політехніка"
Кафедра "Інформаційні системи та мережі "
Р О З Р А Х У Н К О В А Р О Б О Т А
з дисципліни
" Сиcтемне програмування та операційні системи "
на тему:
«Робота з файлами на мові Intel Assembler»
" Сиcтемне програмування та операційні системи "
студенту групи КН-27 Зубику В.І.
Завдання:
Створити файл записів: дата, температура, погода (хмарно, сонячно,дощ, сніг). Визначити місяць з найбільшою середньою температурою. Після виконання операцій задати атрбут файлу тільки для читання.
ЗМIСТ ЗАВДАННЯ ТА КАЛЕНДАРНИЙ ПЛАН ЙОГО ВИКОНАННЯ
1.
Провести вивчення лiтературних джерел по заданій темі.
2.
Розробити алгоритм розв’язування задачі
3
Написати програму на мові Assembler
4.
Підготувати вхiднi дані для контрольного прикладу, реалізувати та вiдлагодити програму
5.
Оформити записку до розрахункової роботи згідно вимог
Міжнародних стандартів, дотримуючись такого змісту:
- вступ;
- формулювання задачі;
- алгоритм розв'язування задачі
- опис програми;
- інструкція користувачеві;
- контрольний приклад та аналіз результатів;
- висновки;
- література;
- додатки
ЗАВДАННЯ ПРИЙНЯТО ДО ВИКОНАННЯ: ____________
пiдпис студента
Керівник роботи: _______________ Кравець П.О.
Формулювання задачі.
Формулювання задачі:
Створити файл записів: дата, температура, погода (хмарно, сонячно,дощ, сніг). Визначити місяць з найбільшою середньою температурою. Після виконання операцій задати атрбут файлу тільки для читання.
Програма може виконуватися на операційній системі DOS, та її емуляцією під Windows. Для її виконання потрібні мінімальні характеристики комп’ютера, головне обладнання: клавіатура, пристрій виведення інформації, та будь-який носій даних (з файловою системою FAT для операційної системи DOS). Вхідні дані передаються в програму за допомогою клавіатури, введення супроводжується підказками. Числові дані вводяться в десятковій системі.
Методи та засоби розв’язування задачі.
Для розв'язку задачі я використав компілятор TASM 4.1. Розробляв та запускав у операційній систмі Windows XP SP3. Для набирання програми використав текстовий редактор “Bred3” Для компіляції я використовував наступний BAT-файл:
del %1.exe
tasm /zi %1.asm
tlink /v %1.obj
del %1.obj
del %1.map
Теорія, порібна для розвязування задачі:
Структури:
Директива STRUC дозволяє визначити структуру даних аналогічно структурам в мовах високого рівня. Послідовність директив
ім'я struc
поля
ім'я ends
де поля — будь-який набір псевдокоманд визначення змінних або структур, встановлює, але не ініціалізовує структуру даних. Надалі для її створення в пам'яті використовують ім'я структури як псевдокоманда:
мітка ім'я <значення>
Для читання або запису в елемент структури використовується оператор «.» (крапка). Для доступу до структур можна використовувати індексну та базово-індексну адресацію. Наприклад:
mov st[si].info,1 - індексна адресація та mov [bx + si].info,1 – базово-індексна адресація
Макроси:
Один з найпотужніших мовних засобів асемблера — макровизначення. Макровизначенням (або макросом) називається ділянка програми, якій привласнено ім'я і який асемблюється кожен раз, коли асемблер зустрічає це ім'я в тексті програми. Макрос починається директивою MACRO і закінчується ENDM.
Ім’я macro параметри
<тіло>
endm
Зрозуміло, можна оформити цю ж ділянку коду у вигляді процедури і викликати її командою CALL — якщо процедура викликається більше одного разу, цей варіант програми займе менше місця, але варіант з макровизначенням стане виконуватися швидше, оскільки в ньому не буде зайвих команд CALL і RET. Проте швидкість виконання — не головна перевага макросів. На відміну від процедур макровизначення можуть викликатися з параметрами, отже, залежно від ситуації, код, що включається, дещо відрізнятиметься.
Процедури:
Процедурою в асемблері є все те, що в інших мовах називають підпрограмами, функціями, процедурами і т.д. Асемблер не накладає на процедури ніяких обмежень — на будь-яку адресу програми можна передати управління командою CALL, і воно повернеться до процедури, що викликала, як тільки зустрінеться команда RET. Така свобода виразу досить легко може призвести до важкочитаємих програм, і в мову асемблера були включені директиви логічного оформлення процедур:
мітка proc мова тип USES регістри ; TASM
або
мітка proc тип мова USES регістри ; Masm/wasm
...
ret
мітка endp
Всі операнди PROC необов'язкові.
Тип може приймати значення NEAR і FAR, і якщо він вказаний, всі команди RET в тілі процедури будуть замінені відповідно на RETN і RETF. За замовчуванням розуміється, що процедура має тип NEAR в моделях пам'яті TINY, SMALL і COMPACT.
Операнд мова діє аналогічно такому ж операнду директиви .MODEL, визначаючи взаємодію процедури з мовами високого рівня. У деяких асемблерах директива PROC дозволяє також перерахувати параметри, що передаються викликаючою програмою. В цьому випадку вказівка мови необхідна, оскільки різні мови високого рівня використовують різні способи передачі параметрів.
USES — список регістрів, значення яких змінює процедура. Асемблер поміщає в початок процедури набір команд PUSH, а перед командою RET — набір команд POP, так що значення перерахованих регістрів будуть відновлені.
Робота з файлами:
Можливо, основна функція DOS як операційної системи — організація доступу до дисків як до файлів та каталогів. DOS підтримує тільки один тип файлової системи — FAT і, починаючи з версії 7.0 (Windows 95), його модифікацію VFAT з довгими іменами файлів. Первинний набір функцій для роботи з файлами, запропонований в MS-DOS 1.0, виявився дуже незручним: кожен відкритий файл описувався 37-байтной структурою FCB (блок управління файлом), адреса якої був потрібен для всіх файлових операцій, а передача даних здійснювалася через структуру даних DTA (область передачі даних). Вже в MS-DOS 2.0, разом з удосконаленням FAT (наприклад, появою вкладених каталогів), з'явився набір UNIX-подібних функцій роботи з файлами, що використовують для опису файлу всього одне 16-бітове число, ідентифікатор файлу або пристрою. Решта всіх функцій роботи з файлами використовує потім тільки це число. Перші п'ять ідентифікаторів ініціалізувалися системою таким чином:
0: STDIN — стандартний пристрій введення (зазвичай клавіатура)
1: STDOUT — стандартний пристрій виведення (зазвичай екран)
2: STDERR — пристрій виведення повідомлень про помилки (завжди екран)
3: AUX — послідовний порт (зазвичай Сом1)
4: PRN — паралельний порт (зазвичай Lpt1)
Отже функції читання/запису (а також скидання буферів на диск) файлів можна так само застосовувати і до пристроїв.
Функції для роботи з файлами:
Функція DOS 3ch — Створити файл
Вхід:
AX = 3ch
СХ = атрибут файлу:
біт 7: файл можна відкривати різним процесам в Novell Netware
біт 6: не використовується
біт 5: архівний біт (1, якщо файл не зберігався)
біт 4: каталог (повинен бути 0 для функції 3ch)
біт 3: мітка тому (ігнорується функцією 3ch)
біт 2: системний файл
біт 1: прихований файл
біт 0: файл тільки для читання
Ds:dx = адреса ASCIZ-рядка з повним ім'ям файлу (ASCIZ-рядок ASCII-символів, що закінчується нулем)
Вихід:
CF = 0 і АХ = ідентифікатор файлу, якщо не відбулася помилка
CF = 1 і АХ = 03h, якщо шлях не знайдений
CF = 1 і АХ = 04h, якщо дуже багато відкритих файлів
CF = 1 і АХ = 05h, якщо доступ заборонений
Якщо файл вже існує, функція 3ch все одно відкриває його, привласнюючи йому нульову довжину. Щоб цього не відбулося, слід користуватися функцією 5bh.
Функція DOS 3dh — Відкрити існуючий файл
Вхід
AX = 3dh
AL = режим доступу
Біти 0 – : права доступу
00: читання
01: запис
10: читання і запис
біт 1: відкрити для запису
біти 2 – 3: зарезервовані (0)
біти 6 – 4: режим доступу для інших процесів
000: режим сумісності (решта процесів також повинна відкривати цей файл в режимі сумісності)
001: всі операції заборонені
010: запис заборонений
011: читання заборонене
100: заборон немає
біт 7: файл не успадковується породжуваними процесами
Ds:dx = адреса ASCIZ-рядка з повним ім'ям файлу
CL = маска атрибутів файлів
Вихід:
CF = 0 і АХ = ідентифікатор файлу, якщо не відбулася помилка
CF = 1 і АХ = код помилки (02h — файл не знайдений, 03h — шлях не знайдений, 04h — дуже багато відкриті файли, 05h — доступ заборонений, 0ch — неправильний режим доступу)
Функція DOS 3fh — Читання з файлу або пристрою
Вхід:
АН = 3fh
ВХ = ідентифікатор
СХ = число байт
Ds:dx = адреса буфера для прийому даних
Вихід:
CF = 0 і АХ = число прочитаних байт, якщо не відбулася помилка
CF = 1 і АХ = 05h, якщо доступ заборонений, 06h, якщо неправильний ідентифікатор
Якщо при читанні з файлу число фактично прочитаних байт в АХ менше, ніж вказане число в СХ, при читанні був досягнутий кінець файлу. Кожна наступна операція читання, так само як і записи, починається не з початку файлу, а з того байта, на якому зупинилася попередня операція читання/запису.
Функція DOS 40h — Запис у файл або пристрій
Вхід:
АН = 40h
ВХ = ідентифікатор
СХ = число байт
Ds:dx = адреса буфера з даними
Вихід:
CF = 0 і АХ = число записаних байт, якщо не відбулася помилка
CF = 1 і АХ = 05h, якщо доступ заборонений, 06h, якщо неправильний ідентифікатор
Якщо при записі у файл вказати СХ = 0, файл буде обрізаний по поточному значенню вказівника. При записі у файл насправді відбувається запис в буфер DOS, дані з якого скидаються на диск при закритті файлу або якщо їх кількість перевищує розмір сектора диска. Для негайного скидання буфера можна використовувати функцію 68h.
Функція DOS 3eh — Закрити файл
Вхід
АН = 3eh
ВХ = ідентифікатор
Вихід:
CF = 0, якщо не відбулася помилка
CF = 1 і АХ = 6, якщо неправильний ідентифікатор
Якщо файл був відкритий для запису, всі файлові буфера скидаються на диск, встановлюється час модифікації файлу і записується його нова довжина.
Алгоритм розв'язування задачі.
Основний алгоритм розв’язування задачі:
Зчитуємо вхідні дані – температура, погода
Записуємо дані в файл
Закриваємо файл
Відкриваємо файл для читання
Зчитуємо дані і визначаємо середнє значення температури
Порвнюємо сережнє значення температури поточного місяця із значенням місяця з максимальною середньою температурою
Виводимо на екран назву місяця з максимальною середньою температурою
Закриваємо файл
Задаємо атрибут файлу «тільки для читання»
Оскільки у завданні є робота з файлами мною були написані процедури для створення файлу, запис у файл, читання з файлу, задання атрибуту тільки для читання, процедура закриття файлу.
Також згідно з завданням деякі зчитані з клавіатури дані повинні оправцьовуватись як числа. Для цього я написав процедуру переведення стрічки в число.
Написання програми я почав з підключення мікропроцесора 8087 (Для роботи з дійсними числами). Вибрав модель пам’яті small. Оголосив сегмент стеку. Далі оголосив сегмент даних. В сегменті даних оголосив такі змінні:
Buffer DB 80, ?, 80 DUP (' ')
Для читання з файлу і клавіатури
Handle DW ?
Для зберігання дескриптора файлу
PathName DB 'ZV.ZAP',0
Ім’я файлу для запису і читання даних
message1DB 'Введiть данi:',0dh,0ah,'$'
Повідомленя
message2 DB 'Error!!',0dh,0ah,'$'
Повідомлення про помилку
message0 DB 'Виберiть дiю:',0dh,0ah,'$'
Підказка
punkt1 DB '1.Читати з клавiатури',0dh,0ah,'$'
Ваіант дії
punkt2 DB '2.Читати з файлу',0dh,0ah,'$'
Варіант дії
pomulka DB 'Помилкова дiя.',0dh,0ah,'$'
Повідомлення про помилкову дію
rozd db '-------------------------------------',0dh,0ah,'$'
Роздільник
rozd2 db '=====================',0dh,0ah,'$'
Роздільник
rik DB 'Рiк: 2008 ','$'
Для виведення на екран
mis DB 'Мiсяць: ','$'
Для виведення на екран
den DB ' День: ','$'
Для виведення на екран
temp DB 'Температура: ','$'
Для виведення на екран
pog DB 'Погода: ','$'
Для виведення на екран
message3 DB 'Мiсяць з найбiльшою темп…: ','$'
Повідомлення
CRLF DB 0dh,0ah,'$'
Перехід на новий рядок
r db 4 DUP(' ')
Для читання року
rr db '2008',0dh,0ah
Для запису року в файл
mis1 db 'сiчень',0dh,0ah
Місяць для запису в файл
mis2 db 'лютий',0dh,0ah
Місяць для запису в файл
mis3 db 'березень',0dh,0ah
Місяць для запису в файл
mis4 db 'квiтень',0dh,0ah
Місяць для запису в файл
mis5 db 'травень',0dh,0ah
Місяць для запису в файл
mis6 db 'червень',0dh,0ah
Місяць для запису в файл
mis7 db 'липень',0dh,0ah
Місяць для запису в файл
mis8 db 'серпень',0dh,0ah
Місяць для запису в файл
mis9 db 'вересень',0dh,0ah
Місяць для запису в файл
mis10 db 'жовтень',0dh,0ah
Місяць для запису в файл
mis11 db 'листопад',0dh,0ah
Місяць для запису в файл
mis12 db 'грудень',0dh,0ah
Місяць для запису в файл
des db 0Ah
Однобайтове число 10
dva db 2
Однобайтове число 2
i db 1
Змінна (Використовується в переведенні)
F db 0Fh
Змінна (Використовується в переведенні)
chslo dw 0
Число (Результат процедцри STRTO)
m db 15 DUP (' ')
Змінна для читання місяця з файлу
d db 3 DUP(' ')
Змінна для читання дня з файлу
p db 15 DUP(' ')
Змінна для читання погоди з файлу
t dw ?
Змінна для занесення температури
k dw 0
Змінна для занесення довжини стрічки
mk dw 0
Змінна для занесення довжини місяця
ind db 0
Змінна для занесення порядку читання з файлу
ser dw 0
Сума значень температури
Max dd 0
Максимальна температура
maxk dw ?
Довжина максимального місяця
kdm db 31,29,31,30,31,30,31,31,30,31,30,31
Масив кількості днів місяців
dm db ?
Кількість днів місяця
potdm db 0
Поточний день місяця
pmis dw 0
Поточний місяць
reg dw 0
Змінна для перенесення прапорців
min db 0
Змінна яка відповідає за знак числа
mmin db 0
Знак максимальної температури
dser dd ?
Для занесення середньої температури
maxmis db 15 DUP (' ')
Місяць з максимальною температурою
days db ' 1',' 2',' 3',' 4',' 5',' 6',' 7',' 8',' 9','10','11','12','13','14','15','16','17','18'
,'19','20','21','22','23','24','25','26','27','28','29','30','31'
Масив днів для заису в файл і виведення
Крім змінних я оголосив такі макроси:
puts MACRO str
mov ah, 9h
lea dx, str
int 21h
ENDM
Для виведення стрічки яка закінчується символом ‘$’
dmis MACRO kx,mx,misx,cxx
mov k,kx
lea si, mx
lea bx, misx
mov cx,cxx
call GetM
ENDM
Для формування місяця
Далі оголосив сегмент коду. В сегменті коду я запрограмував меню для вибору дії (Введення даних з клавіатури чи читання з файлу). Та виклик процедур в залежності від вибраної дії. Далі написав такі процедцри:
STRTO proc near
Переведення стрічки в число
AttrFile Proc near
Задання атртбута файлу «Тільки для читання»
Vved Proc Near
Введення стрічки з клавіатури
zap Proc Near
Запис даних у файл
CreateFile Proc Near
Створення файлу
GetM Proc Near
Отримання даних про місяць і перенаправлення в процедуру для запису
copy Proc near
Копіювання стрічки в стрічку
WriteFile Proc Near
Форумавання дані про місяці
CloseFile Proc Near
Закриття файлу
OpenFile Proc Near
Відкривання файлу для читання
MaxTemp Proc Near
Пошук місяця з максимальною температурою
change Proc Near
Вибирання зчитаного значення і запису у змінну
ReadFile Proc Near
Читання з файлу і виведення результату
Error Proc Near
Повідомлення про помилку
Опис програми.
Назва програми:
ROZR.ASM;
Призначення програми:
Формування файлу записів і визначення місяця з максимальною середньою температурою.
Мови програмування на яких написана програма:
Асемблер (assembler) — система програмування, яка включає мову асемблера та транслятор з цієї мови. Є мовою програмування низького рівня. Чим нижчий рівень мови програмування, тим ближча специфіка роботи програми до самого процесора, для якого вона й була написана. Вважається, що мови низького рівня складніші й потребують більш вузької спеціалізації програміста, так як програма написана на асемблері для одного типу процесорів виявиться не завжди придатною для роботи з іншими процесорами. З іншого боку програми написані на асемблері є компактні та швидкі, що теж є немаловажливим.Поки існують процесори, буде існувати й асемблер!
Логічна структура програми:
Дії у програмі оформлені у вигляді окремих процедцр. Є процедура для введення стрічок, перетворення стрічки в число, переписування в змінні. Процедура для задання атрибуту файлу тільки для читання, створення файлу, запису даних у файл, отримання даних про місяць і виклик процедури запису в файл, формування даних про місяці, закривання файлу, вілкривання фійлу для читання, пошук місяця з максимальною температурою, вибір зчитаного значення і запису у відповідну змінну, читання з файлу і виведення на екран результату.
Було вибрано ім’я файлу ZV з розширенням ZAP, який розміщується у тому ж каталозі, що і програма. Після запису файл закривається для збереження даних. Потім файл відкривається для читання даних. Після виконання всіх операцій файл було закрито і задано атрибут «тільки для читання».
Вхідні та вихідні дані:
Вхідними даними є температура і погода. Дату вводити непотрібно вона формується автоматично і записується у файл. Дані можна вводити як латиницею так і кирилицею з допомогою використання програми UKRDOS.
Вихідними даними є назва місяця з найбільшою середньою температурою.
Програмні засоби:
Програма буде працювати під керуванням всіх операційних систем Windows включаючи Windows Vista і операційною системою MSDOS. Для запуску даної програми можна скористатися програмним пакетом DosBox.
Технічні засоби:
Програма буде працювати при мінімальних характеристиках комп’ютера. З Основними технічними засобами комп’ютера: монітор, клавіатура, постійно запам’ятовуючий пристрій, дисковий накопичувач.
Аналіз результатів комп’ютерної реалізації програми.
При тестуванні програми спочатку було введено дані на 2 місяці.
Вони були успішно зчитані з клавіатури і записані в файл. Далі були зчитані. І було виконано пошук місяця з максимальною середньою температурою. Після виконання всіх операцій було встановлено атрибут файлу «тільки для читання». При компіляції програми було виведено помилку про переповнення ділення. Проблема була вирішенна підключенням мікропроцесора 8087, і використанням команд для дійсних чисел.
При повторному тестуванні було введено з клавіатури дані на 12 місяців по 4 дні. Всі етапи програми пройшли успішно. Результатом виконання програми було створення файлу, запис у нього даних, виведення на екран місяця з максимальною середньою температурою і задання атрибуту файлу тільки для читання. Місяць з середньою максимальною температурою було визначено невірно. Проблема було у міеусових числах. Ця проблема була вирішена шляхом представлення відємного числа додатнім і змінною яка відповідала за знак.
Коли програма тестувалась втретє було введено дані на 12 місяцяв з відповідною кількістю днів у місяці. Всі етапи програми пройшли успішно. При компіляції і виконанні помилок не виникло. Місяць з максимальною середньою температурою було визначено вірно.
Програма була ше протестована кілька разів. Файл ZV.ZAP Для економії часу було згенеровано програмою “GENERATOR.exe”, написаною на C++ Builder 6. Всі етапи компіляції і роботи програми пройшли добре. Рузультат було пораховано вірно. В результаті виконання програми отримаємо:
Інструкція користувачу
Після запуску програми на екран буде виведено варанти робити програми:
Вибравши перший пункт, дані будуть зчитані з клавіатури. Вибравши другий пункт, дані будуть читатися з створеного файлу.
Вибравши другий пункт буде завпропоновано ввести дані з клавіатури:
При введенні даних з клавіаткри, для введення даних температури поточного дня можна використовувати цифри, символи знаку «–» і «+» (необовязково). При введенні погоди поточного дня потрібно дотримуватись варантів: хмарно, сонячно, дощ, сніг. Погоду можна вводити як латиницею так і кирилицею (Використавши програму UKRDOS). Підчас введення даних відбудеться запис їх у файл. Після введення файл. Буде закрито для збереження даних, і відкрито для читання з нього даних. Підчас зчитування даних з файлу відбудеться пошук місяця з максимальною середньою температурою. Після завершення програми на екран буде виведено повідомлення в якому буде назва місяця з максимальною середньою температурою.