Курсовая работа (т): Інтерпретатор функцій DOS: DATE, TIME, DIR, CD, MD, RD

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Інтерпретатор функцій DOS: DATE, TIME, DIR, CD, MD, RD

Міністерство освіти і науки України

Тернопільська академія народного господарства

Інститут комп’ютерних інформаційних технологій

Кафедра спеціалізованих комп’ютерних систем






Курсова робота

з дисципліни «Системне програмування»

на тему:

Інтерпретатор функцій DOS: DATE, TIME, DIR, CD, MD, RD



Виконав: Стахов Євген

студент групи. КСМ-21

Перевірив: к.т.н. Сегін А.І.





м. Тернопіль - 2003 р.

ЗАВДАННЯ НА КУРСОВИЙ ПРОЕКТ

Група КСМ-21

Студент Стахов Євген Валерійович

Тема курсового проекту: Інтерпретатор функцій DOS: DATE, TIME, DIR, CD, MD, RD

Основні розділи:

1. Опис алгоритму розв’язання задачі

2.      Програмна реалізація алгоритму

.        Тестування програми

Графічна частина:

.   Блок-схема програми

Рекомендована література:

1. Абель П. Язык Ассемблера для IBM PC и программирования: Пер. с англ. - М.: Высшая школа, 1992

2. Юров В., Хорошенко С. Assembler: учебный курс - СПБ: Издательство

"Питер", 1999

ЗМІСТ

Вступ

Розділ 1. Опис алгоритму розв’язання задачі

Розділ 2. Програмна реалізація алгоритму

2.1 Функції, які використовуються в програмі

.2 Процедури, які використовуються в програмі

.3 Макроси, які використовуються в програмі

Розділ 3 Тестування програми

Висновки

Список використаної літератури

Додаток А. Лістинг програми

Додаток Б. Блок-схема програми

ВСТУП

Розповсюдження мікропроцесорів стало причиною перегляду ставлення до мови Асемблера. Це відбулось із-за двох основних причин: програми, написані на мові Асемблера потребують значно менше пам’яті та часу виконання; знання мови Асемблера і розуміння результуючого машинного коду дає розуміння архітектури машини, що неможливо досягти користуючись мовами вищого рівня. Навіть незважаючи на величезну швидкодію сучасних комп’ютерів, при написанні програм, що пов’язані з використанням графіки, значна частина коду пишеться на мові Асемблера.

У даному курсовому проекті необхідно розробити програму на мові Асемблера, яка реалізує функції командного процесора DATE, TIME, DIR, CD, MK, RD. Тобто програма повинна виводити поточну дату і час, змінювати їх, виводити список файлів та піддиректорій вказаної директорії, змінювати поточну директорію, створювати та видаляти каталог. Під час створення або видалення каталогу вносяться зміни в таблицю розміщення файлів (FAT) для того щоб сектори, які використовуються цим підкаталогом були доступні іншим файлам.

Для написання даного курсового проекту я використовував компілятор Turbo Assembler 3.2 та програму Turbo Link 3.0 для лінкування. Для відладки коду я використовував Turbo Debugger v.3.1.

Розділ 1. Опис алгоритму розв’язання задачі

Аналізуючи завдання курсового проекту, я вирішив використати метод програмування, який передбачає розбиття програми на окремі функціональні модулі, які потім викликаються з основної програми в процесі її роботи. Це значно спрощує читання програми і дозволяє використовувати одні і ті ж функції кілька разів.

В основі розробки такої програми лежить низхідне програмування - тобто спочатку розробляється основна програма. В даному випадку розроблялася програма, яка зчитувала з клавіатури символи та обробляла їх. При введенні тої чи іншої команди викликалася відповідна функція, але на початковому етапі розробки програми замість цих підпрограм були „заглушки” - прості підпрограми, які або нічого не виконували, або виводили на екран повідомлення, яке свідчило про правильну роботу основної програми. По мірі подальшої розробки ці „заглушки” замінялися програмами, які виконували вже конкретну функцію. Для того щоб визначити яку команду ввів користувач, я склав алгоритм. Кожна команда може мати не більше 4 символів. Тому для цього можна використати регістр EAX. Завантажуємо в цей регістр символи таким чином:

lea si, Command

lodsw

xchg al, ah

shl eax, 16

lodsw

xchg al, ah

Наприклад розберемо команду EXIT. Команда LODSW завантажить в регістр AX символи в зворотному порядку ("XE"). Тому потрібно поміняти їх місцями. Після цього зсовуємо вліво на 16 біт (записуємо їх в розширену частину) і завантажуємо наступні 2 символи. Тепер регістр EAX містить "EXIT". Якщо команда має менше символів, то в старші біти записуються 0.

Розділ 2. Програмна реалізація алгоритму

.1 Функції, які використовуються в програмі

Основне переривання, яке використовується в програмі, це переривання int 21h (переривання DOS). В програмі використовуються такі функції цього переривання [1-2]:

функція 9h - вивести строку на дисплей

Вхідні параметри:= 9h:DX = адреса строки, яка закінчується символом "$"

Вихідні параметри: немає

функція 0Eh - встановити поточним диск DOS

Вхідні параметри:= 0Eh= номер диску (0 - A; 1 - B; 2 - C і т.д.)

Вихідні параметри:= загальна кількість дисководів в системі

функція 19h - зчитати поточний диск DOS

Вхідні параметри:= 19h

Вихідні параметри:= номер поточного диску (0 - A; 1 - B; 2 - C і т.д.)

функція 1Ah - встановити адрес DTA

Вхідні параметри:= 1Ah:DX = адрес для DTA

Вихідні параметри: немає

функція 2Ah - зчитати дату DOS

Вхідні параметри:= 2Ah

Вихідні параметри:= день тижня (0 - неділя, 1 - понеділок, і т.д.)= рік (1980-2099)= місяць (0-12)= число (0-31)

Вхідні параметри:= 2Bh= рік (1980-2099)= місяць (0-12)= число (0-31)

Вихідні параметри:= 0 якщо дата встановлена

функція 2Ch - зчитати час DOS

Вхідні параметри:= 2Ch

Вихідні параметри:= години (0-23)= хвилини (0-59)= секунди (0-59)= соті долі секунди (0-99)

функція 2Dh - встановити час DOS

Вхідні параметри:= 2Dh= години (0-23)= хвилини (0-59)= секунди (0-59)= соті долі секунди (0-99)

Вихідні параметри:= 0 якщо час встановлено

функція 36h - зчитати вільну пам’ять диску

Вхідні параметри:= 36h= номер диску (0 - поточний; 1 - A; 2 - B і т.д.)

Вихідні параметри:= 0FFFFh якщо DL містить невірний номер диску, в іншому випадку - кількість секторів на кластер= кількість доступних кластерів= кількість байтів на сектор= кількість кластерів на диску

функція 39h - створити новий каталог

Вхідні параметри:= 39h:DX = адреса ASCIIZ строки з ім’ям каталогу

Вихідні параметри:= код помилки якщо встановлений CF

функція 3Ah - видалити каталог, що існує і є пустим

Вхідні параметри:= 3Ah:DX = адреса ASCIIZ строки з ім’ям каталогу

Вихідні параметри:= код помилки якщо встановлений CF

функція 3Bh - встановити поточний шлях

Вхідні параметри:= 3Bh:DX = адреса ASCIIZ строки з шляхом

Вихідні параметри:= код помилки якщо встановлений CF

функція 3Fh - читати файл через описувач

Вхідні параметри:= 3Fh= описувач файла (0 - читати з клавіатури):DX = адреса буфера, куди записувати зчитані дані= кількість байтів для читання

Вихідні параметри:= код помилки якщо встановлений CF або кількість реально зчитаних байтів

функція 40h - запис в файл через описувач

Вхідні параметри:= 40h= описувач файла (0 - вивід на дисплей):DX = адреса буфера, який містить дані для запису= кількість байтів для запису

Вихідні параметри:= код помилки якщо встановлений CF= кількість реально зчитаних байтів

функція 47h - зчитати поточну директорію

Вхідні параметри:= 47h:SI = адреса буфера для шляху= номер диску (0 - поточний; 1 - A; 2 - B і т.д.)

Вихідні параметри:= код помилки якщо встановлений CF

функція 4Сh - завершити програму

Вхідні параметри:= 4Сh

Вихідні параметри: немає

функція 4Eh - знайти перший файл, що відповідає масці

Вхідні параметри:= 4Eh:DX = адреса ASCIIZ строки з ім’ям файлу= атрибут файлу

Вихідні параметри:= код помилки якщо встановлений CF= заповнена даними якщо не було помилки

функція 4Fh - знайти наступний файл, що відповідає масці

Вхідні параметри:= 4Fh:DX = адреса даних, які були записані функцією 4Eh

Вихідні параметри:= код помилки якщо встановлений CF= заповнена даними якщо не було помилки

.2 Процедури, які використовуються в програмі

Процедура GetString - зчитує з клавіатури введені символи до натискання Enter. Якщо кількість введених символів рівна 2 (перевід на наступну стрічку та повернення каретки - при натисканні Enter), то символів введено не було і керування передається на початок програми. В іншому випадку заміняються всі символи "/" на "\".

Процедура AnalyseString - шукає перший символ, який не рівний пробілу. Це для того, щоб оприділити команду, якщо вона була введена після кількох пробілів. Після цього шукаємо довжину команди і записуємо в пам’ять адресу початку команди та її довжину. Тепер переписуємо цю команду в пам’ять так, щоб якщо команда займає менше 4 символів, то праві залишалися нулями. В записаній команді переводимо всі великі літери в малі. Після цього шукаємо адресу початку параметрів та довжину, якщо вони є.

Процедура CurrentPath - щоб оприділити поточний шлях потрібно зчитати поточний диск функцією DOS 19h і, викликавши функцію 47h (7147h - для довгих імен) з вказаним диском в DL, в пам’яті, на яку вказує DS:SI будемо мати шлях без диску.

Процедура CheckDrive - оприділяє готовність диску. Якщо викликати команду DOS 36h з номером диску в DL, і якщо диск не готовий, то AL=0FFFFh, в іншому випадку в регістри запишеться інформація про вільну пам’ять диску.

Процедура WrongCommand - якщо команда, введена користувачем, неправильна, то ця процедура виводить повідомлення про помилку з виведенням неправильної команди.

Процедура PrintDir - якщо 4 біт встановлений в 1, то це означає, що знайдено директорію. Збільшує лічильник директорій і виводить ім’я папки, час і дату останньої зміни папки.

Процедура PrintFile - аналогічно процедурі PrintDir, але викликається лише тоді, коли знайдено файл.

Процедура PrintDate - переводить числа з війкового в ASCII і формує стрічку FileDate. При цьому при цьому подвійне слово, яке міститься в DateFile має таку структуру:


Процедура PrintTime - переводить числа з війкового в ASCII і формує стрічку FileTime. При цьому при цьому подвійне слово, яке міститься в TimeFile має таку структуру:


Процедура GetFreeSpace - за допомогою функції DOS 36h оприділяємо вільне місце на диску. Для цього множимо вміст регістрів AX*BX*DX.

Процедура ConvToBinary - переводить число з ASCII формату в двійковий. Для цього множимо вміст регістру AX на 10, зчитуємо наступну цифру, віднімаємо від неї 30h, додаємо до попереднього значення.

Процедура ConvToASCII - переводить число з війкового в ASCII формат. Для цього число, що знаходиться в AX ділимо на 10 і записуємо остачу в стрічку зліва-направо доти, поки AX не дорівнює нулю.

Процедура ExtendConvToASCII - аналогічна попередній, тільки використовується для переводу великих чисел (до 32-біт).

Процедура proc_cd - якщо команда введена без параметрів, то виводиться поточний шлях. Якщо ж ні, то перевіримо чи введено диск. Якщо так, то треба перевірити чи він доступний. Після цього функцією DOS 3Bh пробуємо встановити вказаних шлях поточним. Якщо CF не встановлений в 1 - то новий шлях встановлено.

Процедура proc_root - подібна до попередньої, але зразу встановлює поточним каталогом кореневий каталог диску.

Процедура proc_updir - змінює каталог на батьківський. Для цього знаходимо з кінця стрічки перший символ "\", замість нього записуємо 0 і функцією DOS 3Bh встановлюємо батьківський каталог поточним.

Процедура proc_md - для створення директорії. Якщо після виклику функції DOS 39h прапорець CF=0, то директорія створена, в іншому випадку AX містить код помилки.

Процедура proc_rd - для видалення директорії. Якщо після виклику функції DOS 3Ah прапорець CF=0, то директорія видалена, в іншому випадку AX містить код помилки.

Процедура proc_dir - виводить список файлів та каталогів. Для цього спочатку потрібно встановити адресу DTA на локальний буфер та задати маску пошуку (*.* - для всіх файлів та папок). Щоб отримати мітку диску, потрібно викликати функцію DOS 4Eh з атрибутом в CX=8h. Тепер шукаємо перший каталог. Задаємо атрибути: 00110111b, де

біт 0 - файл тільки для читання;

біт 1 - прихований файл;

біт 2 - системний файл;

біт 3 - мітка

біт 4 - каталог;

біт 5 - архівний файл.

Тепер шукаємо наступний каталог функцією DOS 4Fh. Повторюємо доти, поки прапорець CF=0. Після цього цими ж самими функціями шукаємо всі файли, лише 4 біт атрибутів встановлюємо в 0.

Процедура proc_drive - використовується для зміни активного диску. Для цього спочатку перевіряємо чи доступний новий диск, а потім функцією DOS 0Eh встановлюємо.

Процедура proc_time - зчитує системний час і виводить його на екран. Після цього програма знаходиться в режимі зчитування символів з клавіатури. Якщо були введені символи, то відбувається спроба встановити новий час, в іншому випадку відбувається передача керування на початок програми.

Процедура proc_date - аналогічна попередній, тільки виводить системну дату і день тижня. Після виклику функції DOS 2Ah в AL знаходиться день тижня, починаючи з неділі. Щоб вивести день тижня за допомогою букв, треба помножити вміст регістру на 2 і додати це число до адреси, за якою міститься стрічка з днями тижня.


Для зручності і спрощення читання програми я написав 3 макроси:

PrintStr - макрос виводить на екран стрічку за допомогою функції DOS 9h. Вхідним параметром є мітка, за якою в пам’яті розміщена стрічка. Стрічка повинна закінчуватись символом "$".

OutToScreen - макрос для виводу строки на екран. Використовує функцію DOS запису у файл або пристрій 40h. Вхідними параметрами є chars - кількість символів для виводу; text - мітка, за якою в пам’яті розміщена стрічка.

WriteToString - макрос для запису в стрічку символів. Використовується для стирання попередніх даних шляхом запису пробілів для тексту та нулів (30h) для стрічок з цифровими даними. Вхідними параметрами є char - символ, який потрібно записати; repeat кількість байтів для запису; string - мітка, за якою в пам’яті розміщена стрічка.

програма інтерпретатор процесор асемблер

Розділ 3. Тестування програми

Програма розроблялася так, щоб мати інтерфейс аналогічний програмі command.com. При запуску програми вона виводить повідомлення:нтерпретатор функцiй MS-DOS: date, time, dir, cd, md, rd.

Курсовий проект. Стахов Є.В., 2003.:\Asm\kursova\new>

Щоб виконати будь-яку з команд потрібно в командній стрічці ввести її ім’я та параметри якщо необхідно. При введенні команди TIME програма виводить системний час і чекає вводу нового часу. Ніякий додаткових параметрів вводити непотрібно.:\Asm\kursova\new>time

Поточний час: 17:57:53,85

Введiть новий час:

Якщо час введено неправильно, то виводиться повідомлення про помилку::\Asm\kursova\new>time

Поточний час: 17:57:53,85

Введiть новий час: er:fg:df

Введено недопустиме число

При виклику команди DATE програма виводить системну дату:\Asm\kursova\new>date

Поточна дата: Нд 15.06.2003

Введiть нову дату (дд-мм-рр):

При введенні недопустимої дати виводитися повідомлення про помилку::\Asm\kursova\new>date

Поточна дата: Нд 15.06.2003

Введiть нову дату (дд-мм-рр): 45.15.2003

Вказана недопустима дата

Команда DIR може викликатися як без параметрів так і з ними. Якщо викликана без параметрів, то програма виводить вміст поточного каталогу.:\Asm\kursova\new>dir

Источник: https://www.bibliofond.ru/detail.aspx?id=864114