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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    20,71 Кб
  • Опубликовано:
    2016-04-26
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Інтерпретатор функцій 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

Том в пристрої D має мiтку PROGRAMS

Вмiст папки D:\Asm\kursova\new

. <ПАПКА> 23/06/2003 08:06:20

.. <ПАПКА> 23/06/2003 08:06:20.BAT 46 14/06/2003 22:23:44

....EXE 491808 10/06/1992 03:10:00.EXE 53414 07/05/1990 02:00:00

файлiв 829203 байт

папок 788350976 байт вiльно

Якщо викликати з параметрами, то програма виведе список файлів та каталогів у вказаній директорії.:\Asm\kursova\new>dir c:

Том в пристрої C має мiтку System

Вмiст папки c:

DOCUME~1 <ПАПКА> 07/03/2003 18:36:56

....SYS 150994944 23/06/2003 07:42:14

файлiв 151250900 байт

5 папок 49414144 байт вiльно

При виклику команди MD без параметрів виводиться підказка::\Asm\kursova\new>md

Створення директорії[диск:]шлях:\Asm\kursova\new>

Якщо директорію створити не вдалося, виводиться відповідне повідомлення з причиною.:\Asm\kursova\new>md newfol\new

Вказаний шлях не знайдено:\Asm\kursova\new>md newfol:\Asm\kursova\new>md newfol\new:\Asm\kursova\new>md newfol

Немає доступу до каталогу, або вiн вже iснує

Команда RD працює аналогічно попередній команді

D:\Asm\kursova\new>rd

Видалення директорiї[диск:]шлях:\Asm\kursova\new>rd newfol

Немає доступу до каталогу, або вiн не пустий:\Asm\kursova\new>rd newfol\new:\Asm\kursova\new>rd newfol:\Asm\kursova\new>rd d:\asm\kursova\new

Каталог є поточним

При виклику команди CD без параметрів виводиться поточний каталог.:\Asm\kursova\new>cd:\Asm\kursova\new

Якщо вказати каталог на іншому диску, то команда встановить його, але активним залишить цей диск. Щоб перейти в цю папку потрібно змінити диск.:\Asm\kursova\new>cd c:\winnt:\Asm\kursova\new>c::\WINNT>

Щоб перейти на 1 директорію вверх потрібно ввести CD.. або CD .., щоб перейти в кореневий каталог потрібно ввести CD\ або CD \:\Asm\kursova\new>cd ..:\Asm\kursova>cd..:\Asm>cd\:\>

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

"copy" не є правильною командою

Вихід з програми здійснюється викликом команди EXIT.

ВИСНОВКИ

В результаті проведеної роботи я склав програму-інтерпретатор функцій DOS: TIME, DATE, DIR, CD, MD, RD. Програма написана на мові Асемблера. Всі команди, поставлені в завданні реалізовані та виконуються без помилок. Програма має стандартний інтерфейс, аналогічний як у програмі command.com. Під час тестування програми помилок не виникало.

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

Дана програма може бути основою для написання більш складніших програм, з більшою кількістю команд. Для цього потрібно лише добавити нову процедуру.

СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ

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

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

ДОДАТОК А

Лістинг програми

.model small100h

.386macro text ; макрос для виводу стрічки на екранah, 9hdx, text21h

macro chars, text ; макрос для виводу строки на екранbxah, 40h ; функція DOS запису в файл або на пристрійbx, 1h ; стандартний пристрій виводуcx, chars ; кількість символів для виводуdx, text21hbx

macro char, repeat, string ; макрос для запису в стрічкуal, char ; символу char repeat разівcx, repeatdi, stringstosb

.data= 256dw ?db MaxStringLength dup (?)db 4 dup (?)db MaxStringLength dup (?)dw 0,0,0,0db '" не є правильною командою', 13, 10, 13, 10, "$"db MaxStringLength dup (?)db 21 dup (0) ; описуємо структуру DTAdb 0 ; атрибут файлуdw 0 ; час створення файлуdw 0 ; дата створення файлуdd 0 ; розмір файлуdb 13 dup (0); ім'я файлу з розширеннямdb 13, 10, "$" ; перевід курсору на наступну стрічку

db "Iнтерпретатор функцiй MS-DOS: date, time, dir, cd, md, rd.",

, 10, 'Курсовий проект. Стахов Є., 2003.', 13, 10, 10, "$"db "Вказаний шлях не знайдено", 13, 10, "$"

db "Створення директорiї", 13, 10, 10, " MD [диск:]шлях", 13,

"$"

db "Видалення директорiї", 13, 10, 10, " RD [диск:]шлях", 13,

, 10, "$"db "Виникла невiдома помилка", 13, 10, 10, "$"db "Вказаний шлях не знайдено", 13, 10, 10, "$"db "Немає доступу до каталогу, або вiн не пустий", 13, 10, 10,

"$"db "Каталог є поточним", 13, 10, 10, "$"

dw 0,0,0,0 ; число/місяць/рік/день тижняdb "Поточна дата: Пн 00.00.0000", 13, 10, "$"db "Введiть нову дату (дд-мм-рр): $"db "Вказана недопустима дата", 13, 10, "$"

dw 0,0,0,0 ; години/хвилини/секунди/соті долі секундиdb "Поточний час: 00:00:00,00", 13, 10, "$"db "Введiть новий час: $"db "Вказаний недопустимий час", 13, 10, "$"db "НдПнВтСрЧтПтСб"

db "Введено недопустиме число", 13, 10, 10, "$"db "Системi не вдається знайти вказаний диск", 13, 10, 10,

"$"db "Вивiд списку файлiв та каталогiв", 13, 10, 10, "$"db " Том в пристрої має мiтку $"db " Том в пристрої не має мiтки$"db " Вмiст папки $"db " <ПАПКА> $"db " $"dd 0dd 0db " $"db 0 ; зберігається кількість файлів в каталозіdb 0 ; зберігається кількість підкаталогів в каталозіdb "00/00/0000$"db "00:00:00$"db ?, ":\*.*", 0db " файлiв "db " "" байт", 13, 10db " папок "db " "" байт вiльно", 13, 10, 10, "$"

.code:ax, @datads, axes, ax

About:CurrentPathDrive ; вивід поточного шляху

eax, eaxebx, ebxecx, ecxedx, edx

GetString ; зчитуємо команду з параметрамиAnalyseString ; виділяємо окремо команду і параметри

lea si, Command ; оприділяємо введену командуal, aheax, 16al, aheax, "exit"exiteax, "md"command1proc_md:eax, "rd"command2proc_rd:eax, "cd"command3proc_cd:eax, "dir"command4proc_dir:eax, "time"command5proc_time:eax, "date"command6proc_date:eax, "cd\"command7proc_root:eax, "cd.."command8proc_updir:eax, 0FFheax, ":"command9proc_drive:WrongCommand:ah, 4Ch21h

;--------------------------------------------------:

;-------------------- Процедури ---------------:

;::::::::::::::::::::::::::::::::::::::::::

;: Зчитуємо стрічку з стандартного вводу ::

;::::::::::::::::::::::::::::::::::::::::::procah, 3Fh ;читаємо з файла (фактично - з клавіатури)bx, 0hcx, MaxStringLengthdx, InputString21hax, 2begin ; якщо не введено жодного символу, то перехід на початокInputStringLength, ax ; зберігаємо кількість введених символівcx, axsi, InputString:di, si; перевіряємо кожен символal, "/"NotSlashal, "\" ; заміняємо всі символи "\" на "/":NextLetterendp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::

;: Виділяємо з введеної стрічки команду та параметр ::

;:::::::::::::::::::::::::::::::::::::::::::::::::::::proc0, 8, StringTab ; обнулюємо 8 байтів починаючи з 0, 4, Command ; очищуємо командуcx, InputStringLengthcxdi, InputStringal, 20h ; шукаємо перший символ, не рівний 0scasbEndString ; перехід якщо досягнуто кінець стрічкиbx, discasb ; шукаємо перший символ, який дорівнює 0dx, didxdx, bxStringTab, dx ; зберігаємо зміщення, з якого починається командаdxdx, 4StringTab+2, dx ; зберігаємо довжину командиStringTab, 4NormalLength ; якщо довжина >4, то команда не правильнаWrongCommand:cxdicx, StringTabsi, InputStringsi, StringTab+2di, Command+3movsb ; записуємо команду з права на лівоcx, 4hsi, Command:di, si; перев_ряємо кожен символ

; Переводимо великі літери в маліal, "A" ; якщо менше ANotChange ; то літера не великаal, "Z" ; якщо більше ZNotChange ; то літера не великаal, 20h:NextLetterCommanddicxEndString ; якщо cx=0, то параметрів немаєscasb ; шукаємо початок параметрівEndString ; якщо досягнуто кінця, то параметрів немаєdx, didx, 3StringTab+4, dx ; зберігаємо зміщення, з якого починаються

параметриscasb ; шукаємо кінець параметрівdi, dxdi, 3StringTab+6, di ; зберігаємо довжину параметрівcx, disi, InputStringsi, dxdi, Pathmovsb ; переписуємо їх в Pathal, 0h ; дописуємо в кінець 0:endp

;:::::::::::::::::::::::::::::::

;: Оприділяє поточний каталог ::

;:::::::::::::::::::::::::::::::procah, 19h ; зчитуємо поточний диск DOS21hal ; номер поточного диску (1 - A; 2 - B; 3 - C і т.д.)dl, aldi, Driveal, 40hax, "\:"

ax, 7147h ; зчитуємо поточну директоріюdl, 0hsi, Drive+321hdi, Drivecx, MaxStringLengthal, 0hscasb ; зрегігаємо її в Drivediax, "$>" ; завершуємо стрічку символами ">" та "$"endp

;:::::::::::::::::::::::::::::::

;: Визначає готовність диску::

;:::::::::::::::::::::::::::::::procdl, aldl, 60h ;1 - A:, 2 - B:  т.д.dxaxbxah, 36h ;функція визначення вільного місця на диску21hax, 0FFFFh ;AX - число секторів в кластер -1IsDrive ;вихід якщо нема диску або диск не готовийErrorDrivebxaxdxbegin:bxaxdxendp

;:::::::::::::::::::::::::::::::::::::

;: Якщо введена неправильна команда ::

;:::::::::::::::::::::::::::::::::::::procah, 2h ; виводимо 1 символ на дисплейdl, '"'21h

mov cx, StringTabah, 40h ; Функція виводу строки на екранbx, 1hdx, InputString+1dx, StringTab+2dx, cx21hErrorCommandbeginendp

;:::::::::::::::::::::::::::::::::::::

;: Друкує інформацію про директорію ::

;:::::::::::::::::::::::::::::::::::::procAttrFile, 00010000b ; встановлюємо 4 бітAttrFile, 10h ; провіряємо атрибут: якщо 10h, то каталогExitPrintDir

NumDir13, NameFile ; виводимо ім'я директоріїDirStrPrintDate ; виводимо дату останньої зміниPrintTime ; виводимо час останньої зміни директоріїCRLF ; встановлюємо курсор на нову стрічку:0, 13, NameFile ; очищуємо поле для імені файлуendp

;:::::::::::::::::::::::::::::::

;: Друкує інформацію про файл ::

;:::::::::::::::::::::::::::::::procNumFile13, NameFile ; виводимо ім'я файлу

20h, 12, FileSize ; очищуємо поле для запису розміру

файлуeax, SizeFileTotalFileSize, eaxdi, FileSize+10ExtendConvToASCII ; переводимо розмір в ASCII форматFileSize

PrintDatePrintTimeCRLF0, 13, NameFileendp

;::::::::::::::::::::::::::::::::::::::::::

;: Друкує дату зміни файлу чи директорії ::

;::::::::::::::::::::::::::::::::::::::::::proc30h, 2, FileDate30h, 2, FileDate+330h, 4, FileDate+6ax, DateFileax, 0000000000011111b; залишаємо тільки числоdi, FileDate+1ConvToASCII

ax, DateFileax, 0000000111100000b; залишаємо тільки місяцьax, 5di, FileDate+4ConvToASCII

ax, DateFile; залишаємо тільки рік (з 1980)ax, 9ax, 1980di, FileDate+9ConvToASCII

FileDateSpaceendp

;:::::::::::::::::::::::::::::::::::::::::

;: Друкує час зміни файлу чи директорії ::

;:::::::::::::::::::::::::::::::::::::::::proc30h, 2, FileTime30h, 2, FileTime+330h, 2, FileTime+6ax, TimeFileax, 11 ; будемо працювати з годиноюdi, FileTime+1ConvToASCII

ax, TimeFileax, 0000011111100000b; залишаємо тільки хвилиниax, 5di, FileTime+4ConvToASCII

ax, TimeFileax, 0000000000011111b; залишаємо тільки секунди/2ax, 1di, FileTime+7ConvToASCII

FileTimeendp

;:::::::::::::::::::::::::::::::::::::::::::::::::

;: Підраховує кількість вільних байтів на диску ::

;:::::::::::::::::::::::::::::::::::::::::::::::::procsi, CurrDrive; візьмемо поточний дискdl, aldl, 60h ;1 - A:, 2 - B: _ т.д..ah, 36h ;функція оприділення вільного місця на диску21hax, 0FFFFh ;AX - число секторів в кластері -1IsDrive1 ;вихід якщо нема диску або диск не готовийErrorDrivebegin:cx ; кількість секторів на кластер * кількість байтів на секторbx ; домножимо ще на кількість вільних кластерів

word ptr FreeSize, axword ptr FreeSize+2, dxendp

;::::::::::::::::::::::::::::::::::::::::

;: Переводить число з ASCII в двійкове ::

;: Вхід: si - адрес строки ::

;: cx - кількість символів ::

;: Вихід: al - результат ::

;::::::::::::::::::::::::::::::::::::::::procax, axdx, dxbx, 10:cxbxcl, [si]cl, 30hErrNumbercl, 39hErrNumbercl, 30hal, clcxsiConvBinary:ErrorNumberbeginendp

;::::::::::::::::::::::::::::::::::::::::::

;: Переводить число з двійкового в ASCII ::

;: Вхід: di - адрес строки ::

;: ax - число ::

;::::::::::::::::::::::::::::::::::::::::::

;: Переводить число з двійкового в ASCII ::

;: Вхід: di - адрес строки ::

;: eax - число ::

;::::::::::::::::::::::::::::::::::::::::::procecx, 10edx, edx:ecxdl, 30h[di], dledx, edxdieax, 0ExtendConvASCIIendp

;::::::::::::::::::::::::::::::::::::::::

;: Змінює поточний каталог на вказаний ::

;::::::::::::::::::::::::::::::::::::::::_cd procStringTab+6, 0CheckPath ; якщо були введені параметриdi, Drivecx, MaxStringLengthal, "$"scasbdi, 2DriveCRLFCRLFCurrentPathbegin:si, Path+1ax, 003Ah; " :"GoToPathsi, PathCheckDrive ; перевіряємо чи доступний дискdi, Driveal, 20hal, 40hdl, alax, 7147h ; зчитуємо поточний шляхsi, Drive+321hdi, Drivecx, MaxStringLengthal, 0hscasb ; шукаємо кінецьdial, "$"; дописуємо в кінець "$"DriveCurrentPathCRLFCRLFbegin:di, Pathdi, StringTab+6al, 0hax, 713Bh ; встановлюємо Path поточною директорієюdx, Path21hal, 2hNoCDErrCDError:CRLFCurrentPathbegin_cd endp

;:::::::::::::::::::::::::::::::::::::::::

;: Змінює поточний каталог на кореневий ::

;:::::::::::::::::::::::::::::::::::::::::_root procdi, Drive+3al, 0hax, 713Bh ; встановлюємо поточним кореневий каталогdx, Drive21hal, 2hNoCDRootErrCDError:CRLFCurrentPathbegin_root endp

;::::::::::::::::::::::::::::::::::::::::::::

;: Змінює поточний каталог на батьківський ::

;::::::::::::::::::::::::::::::::::::::::::::_updir procdi, Drivecx, MaxStringLengthal, "$"scasb ; шукаємо кінець стрічкиal, "\"cx, MaxStringLengthscasb ; шукаємо з права на ліво перший символ "\"dial, 0h; замість нього записуємо 0ax, 713Bhdx, Drive21hCRLFCurrentPathbegin_updir endp

;::::::::::::::::::::::::::

;: Створює новий каталог ::

;::::::::::::::::::::::::::_md procStringTab+6, 0MDIsPath ; якщо було введено ім'я нової папкиMDAboutbegin:dx, Path ;ds:dx вказують на шляхax, 7139h21hMDIsError ; якщо виникли помилкиCRLFbegin:ax, 3h ; шлях не знайденоMDErr1MDError1begin:ax, 5h ; немає доступу, або каталог вже існуєMDErr2MDError2begin:MDError ; інша помилкаbegin_md endp

;:::::::::::::::::::::::::::::

;: Видаляє існуючий каталог ::

;:::::::::::::::::::::::::::::_rd procStringTab+6, 0RDIsPath ; якщо було введено ім'я папки для видаленняRDAboutbegin:dx, Pathax, 713Ah21hRDIsError ;oбpoбка помилокCRLFbegin:ax, 2h ;RDErr1RDError1begin:ax, 91h ; немає доступу до каталогуRDErr2RDError2begin:ax, 7Bh ; каталог є поточним, або не пустимRDErr3RDError3begin:RDError ; інша помилкаbegin_rd endp

;:::::::::::::::::::::::::::::::::::::::::::

;: Виводить список файлів та підкаталогів ::

;:::::::::::::::::::::::::::::::::::::::::::_dir procah, 1Ahdx, DTA ; встановлюємо вказівник на свою область DTA21h

StringTab+6, 0IsParameter ; якщо команда була з параметрамиdi, Drivecx, MaxStringLengthbx, cxal, "$"scasb ; знаходимо кінець стрічкиbx, cxbx ; знаходимо її довжинуGetLabel:cx, StringTab+6bx, cxsi, Pathdi, Drivemovsb ; переписуємо з Path в Drivesial, "\"IsSlashal, "\"; дописуємо "\" якщо немаєbx:al, "$"; дописуємо "$":si, Drive; зчитуємо букву дискуal, 00100000b ; перетворюємо її в малуCheckDrivedi, CurrDriveal, 11011111b ; перетворюємо її в великуdi, LabelMess+16di, NoLabelMess+16ah, 4Eh ; Шукаємо перший файлcx, 8h ; з атрибутом 08h, тобто мітку томуdx, CurrDrive21hAttrFile, 8hNoLabel ; якщо немає міткиLabelMess13, NameFile0, 13, NameFileFileList:NoLabelMess:CRLFCRLF

di, Drive-1di, bxal, "$"

FolderMessDriveCRLFCRLF

di, Drive-1di, bxax, "*\" ; вводимо маску пошуку *.*ax, "*."al, 0

NumDir, 0 ; обнуляємо кілікість директорійNumFile, 0 ; файлівTotalFileSize, 0 ; загальний розмір файлів

ah, 4Eh ; знаходимо перший каталогdx, Drivecx, 00110111b ; в CX - атрибут каталогу21hSearchFile ; якщо ні одного каталога немає, шукаємо файлиPrintDir:ah, 4Fh ; шукаємо наступний каталог21hSearchFilePrintDir ; виводимо найдений каталогFindNextDir ; переходимо на пошук наступного

:ah,4Eh ; шукаємо перший файлcx, 00100111b ; в CX - атрибут файлу - (RO+Hid+Sys+Arc)dx, Drive21hNoFile ; якщо файлів нема, то на вихідPrintFile ; виводимо ім'я файлу:ah,4Fh ; продовжуємо пошук файлів21hNoFilePrintFile ; виводимо ім'я файлуFindNextFile

:0, 11, TotalFiles0, 11, TotalFolders0, 9, TotalFileSizeASCII0, 9, FreeSizeASCIIal, NumFileah, ahdi, TotalFiles+10ConvToASCIIal, NumDirah, ahdi, TotalFolders+10ConvToASCII

GetFreeSpace ; обраховуємо вільне місце на дискуeax, FreeSizedi, FreeSizeASCII+9ExtendConvToASCII

eax, TotalFileSizedi, TotalFileSizeASCII+9ExtendConvToASCIITotalFiles ; виводимо загальну кількість файлів та каталогівbegin_dir endp

;:::::::::::::::::::::::::::::

;: Встановлює поточний диск ::

;:::::::::::::::::::::::::::::_drive procsi, Command+2; зчитуємо букву диску, який потрібно зробити активнимCheckDrive ; перевіряємо чи доступний дискdlah, 0Eh21hCRLFbegin_drive endp

;:::::::::::::::::::::::::::::::::

;: Зчитує та встановлює час DOS ::

;:::::::::::::::::::::::::::::::::_time procah, 2Ch ; зчитуємо час21hbyte ptr Time, ch ; годиниbyte ptr Time+2, cl ; хвилиниbyte ptr Time+4, dh ; секундиbyte ptr Time+6, dl ; соті долі секундиdi, CurTime+24ax, Time+6ConvToASCIIdi, CurTime+21ax, Time+4ConvToASCIIdi, CurTime+18ax, Time+2ConvToASCIIdi, CurTime+15ax, TimeConvToASCII

CurTime:NewTime

ah, 3Fh ;читаемо з файла (фактично - з клавіатури)bx, 0h ;файловий хендл клавіатуриcx, MaxStringLengthdx, InputString21hax, 2IsTimeCRLFbegin:InputStringLength, axax, 8hCheckTimeTimeErrorInputTime:si, InputStringcx, 2hConvToBinaryTime, axsicx, 2hConvToBinaryTime+2, axsicx, 2hConvToBinaryTime+4, ax

ch, byte ptr Timecl, byte ptr Time+2dh, byte ptr Time+4dl, 0hah, 2Dh ; встановлюємо новий час21hal, 0ffh ;пpoвіpяємо пpaвильніcть знaчeнняNoTimeErrTimeError:CRLFbegin_time endp

;::::::::::::::::::::::::::::::::::

;: Зчитує та встановлює дату DOS ::

;::::::::::::::::::::::::::::::::::_date procah, 2Ah ; зчитуємо дату21hbyte ptr Date, dl ; числоbyte ptr Date+2, dh ; місяцьDate+4, cx ; рік починаючи з 1980al, 1 ; день тижняbyte ptr Date+6, aldi, CurDate+26ax, Date+4ConvToASCIIdi, CurDate+21ax, Date+2ConvToASCIIdi, CurDate+18ax, DateConvToASCIIsi, Daysi, Date+6di, CurDate+14

CurDate:NewDate

ah, 3Fhbx, 0hcx, MaxStringLengthdx, InputString21hax, 2IsDateCRLFbegin:InputStringLength, axax, 0AhCheckDateDateErrorInputDate:si, InputStringcx, 2hConvToBinaryDate, axsicx, 2hConvToBinaryDate+2, axsicx, 4hConvToBinaryDate+4, ax

dl, byte ptr Datedh, byte ptr Date+2cx, Date+4ah, 2Bh ; встановлюємо нову дату21hal, 0ffh ;пpoвіpяємо пpaвильніcть знaчeнняNoDateErrDateError:CRLFbegin_date endp

;-----------------------------------------:start

ДОДАТОК Б

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


Похожие работы на - Інтерпретатор функцій DOS: DATE, TIME, DIR, CD, MD, RD

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!