Міністерство освіти і наукиУкраїни
Національний університет “Львівська політехніка”
Кафедра САПР
Курсова робота
З дисципліни
“Системне програмування та операційні системи”
На тему :
“Інтерпретатор командної мови”
Львів 2008р
Анотація
Курсова робота з курсу “Системного програмування та операційні системи”.
Інтерпретатор командної мови/ Іващук Т.О., Львів: Національний університет “Львівська політехніка”, 2008.-36 с.
Обсяг даної курсової роботи включно із кодом програм становить 36 сторінок. Курсова робота складається з 5-ти розділів, у яких наведено основні теоретичні відомості про інтерпретатор командної мови. Описано основні функції та алгоритм.
Курсова робота ставить ціль – розробити командний інтерпретатор.
Кафедра ” Системи автоматизованого проектування ”
Дисципліна Сиситемне програмування і операційні системи
Спеціальність Комп’ютерні науки
Курс 2 Група КН-213 Семестр 4 .
Завдання
на курсовий проект студента
/прізвище, ім’я, по - батькові/
1. Тема проекту /роботи/ Розробка інтерпретатора командної мови
2. Термін здачі студентом закінченого проекту /роботи/ 19.05.2008 р.
3. Вихідні дані для проекту /роботи/
Загальна характеристика інтерпретатора
Основні команди та функції для написання інтерпретатора
4. Зміст розрахунково-пояснювальної записки /перелік питань, які підлягають розробці/
Вступна частина
Аналіз інтерпретатора в загальному
Аналіз складання алгоритму
Реалізація програми
Висновки
5. Перелік графічного матеріалу / з точним зазначенням обов’язкових креслень/
Блок схема алгоритму
Загальна структура програми
6. Дата видачі завдання 24.02.2008 р.
№ п/п
Назва етапів курсового проекту ( роботи )
Термін виконання етапів проекту ( роботи )
Примітки
1.
Отримання завдання
24.02.2008 р.
2.
Уточнення завдання
10.03.2008 р.
3.
Аналіз книжки ”С для професіоналів”
2 тиждні
4.
Оформлення вступної частини
24.03.2008 р.
5.
Розробка 2 розділу пояснювальної записки „Аналіз інтерпретатора в загальному”
7.04.2008 р.
6.
Розробка 3 розділу пояснювальної записки „Аналіз складання алгоритму”
21.04.2008 р.
7.
Розробка 4 розділу пояснювальної записки „Реалізація програми”
5.05.2008 р.
8.
Попередній перегляд проекту викладачем і виправлення помилок
12.05.2008 р.
9.
Здача курсового проекту
19.05.2008 р.
Студент
( підпис )
( прізвище, ім’я, по-батькові )
Керівник
Фармага Ігор Вірославович
( підпис )
( прізвище, ім’я, по-батькові )
____________________2008 р
Національни університет ” Львівська політехніка”
/назва вищого учбового закладу/
Зміст
Вступ 6
Анвліз інтерпретатора взагальному 7
Аналіз складання алгоритму 11
Структура програми 11
Визначення біжучої директорії 13
Створення файлу 13
Створення нового каталогу 14
Вивід на екран вміс файлу 14
Копіювання файлів 15
Видалення файлу 16
Запис інформації у файл 16
Зміна біжучого диску 17
Текст програми 18
Загальна структура програми 31
Блок схема 32
Висновок 36
ВСТУП.
Моя програма написана на мові програмування Ассемблер. Працює вона наступним чином : ми вибираємо відповідний пункт меню і виконується відповідна команда. У цій пояснювальній записці я описала наступні розділи : Аналіз інтерпретатора в загальному. У даному розділі детально описується що таке інтерпретатор, особливості застосквання. Наступним розділом є аналіз складання алгоритму – тут детально описані усі методи, функції і їх особливості, які я використала для написання цієї програми. Наступним пунктом є написання блок-схеми. По блок –схемі написати програму легше. До того ж якщо є блок-схема, то програму можна написати на будь-якій мові програмування. Принцип ж однаковий. Різниця тільки в синтаксисі самої мови. Далі описується сам тест програми. Наступний розділ це загальна структура програми. І в кінці зроблено певні висновки.
Аналіз інтерпретатора взагальному
Інтерпретатор — це програма, яка сприймає початкову програму на вхідній мові і виконує її. Основна відмінність інтерпретаторів від трансляторів і компіляторів полягає в тому, що інтерпретатор не породжує результуючу програму, а просто виконує початкову програму.
Термін «інтерпретатор» (intегргеtег), як і «транслятор», означає «перекладач». З погляду термінології ці поняття схожі, але з погляду теорії формальних мов і компіляції між ними існує принципова різниця. Якщо поняття «транслятор» і «компілятор» майже невиразні, то з поняттям «інтерпретатор» їх плутати ніяк не можна. Простим способом реалізації інтерпретатора можна було б вважати варіант, коли початкова програма спочатку повністю транслюється в машинні команди, а потім відразу ж виконується. У такій реалізації інтерпретатор, по суті, мало чим відрізняється від компілятора з тією лише різницею, що результуюча програма в нім недоступна користувачеві. Недоліком такого інтерпретатора є те, що користувач повинен чекати компіляції всієї початкової програми перш, ніж почнеться її виконання. По суті, в такому інтерпретаторі не було б ніякого особливого сенсу - він не давав би ніяких переваг в порівнянні з аналогічним компілятором.
Тому переважна більшість інтерпретаторів діють так, що виконують початкову програму послідовно, у міру її надходження на вхід інтерпретатора. Тоді користувачеві не треба чекати завершення компіляції всієї початкової програми. Більш того, він може послідовно вводити початкову програму і тут же спостерігати результат її виконання у міру надходження.
При такому порядку роботи інтерпретатора виявляється істотна особливість, яка відрізняє його від компілятора, — якщо інтерпретатор виконує команди у міру їх надходження, то він не може виконувати оптимізацію початкової програми. Отже, фаза оптимізації в загальній структурі інтерпретатора буде відсутня. У іншому ж структура інтерпретатора мало відрізнятиметься від структури аналогічного компілятора. Слід тільки врахувати, що на останньому етапі — генерації коду - машинні команди не записуються в об'єктний файл, а виконуються у міру їх породження. Відсутність кроку оптимізації визначає ще одну особливість, характерну для багатьох інтерпретаторів: як внутрішнє представлення програми в них дуже часто використовується зворотний польський запис. Ця зручна форма представлення операцій володіє тільки одним істотним недоліком — вона погано піддається оптимізації. Але в інтерпретаторах це якраз і не потрібно. Далеко не всі мови програмування допускають побудову інтерпретаторів, які могли б виконувати початкову програму у міру надходження команд. Для цього мова повинна допускати можливість існування компілятора, що виконує розбір початкової програми за один прохід. Крім того, мова не може інтерпретуватися у міру надходження команд, якщо він допускає появу звернень до функцій і структур даних раніше їх безпосереднього опису. Тому таким методом не можуть інтерпретуватися такі мови, як С і Раsсаl.
Відсутність кроку оптимізації веде до того, що виконання програми за допомогою інтерпретатора є менш ефективним, чим за допомогою аналогічного компілятора. Крім того, при інтерпретації початкова програма повинна наново розбиратися всякий раз при її виконанні, тоді як при компіляції вона розбирається тільки один раз, а після цього завжди використовується об'єктний файл. Також очевидно, що об'єктний код виконуватиметься завжди швидше, ніж відбувається інтерпретація аналогічної початкової програми. Таким чином, інтерпретатори завжди програють компіляторам в продуктивності.
Перевагою інтерпретатора є незалежність виконання програми від архітектури цільової обчислювальної системи. В результаті компіляції виходить об'єктний код, який завжди орієнтований на певну цільову обчислювальну систему. Для переходу на іншу цільову обчислювальну систему початкову програму потрібно відкомпілювати наново. А для інтерпретації програми необхідно мати тільки її початковий текст і інтерпретатор з відповідної мови.
Інтерпретатори довгий час значно поступалися в поширеності компіляторам. Як правило, інтерпретатори існували для обмеженого кругу щодо простих мов програмування (таких, наприклад, як Ваsic). Високопродуктивні професійні засоби розробки програмного забезпечення будувалися на основі компіляторів.
Новий імпульс розвитку інтерпретаторів додало розповсюдження глобальних обчислювальних мереж. Такі мережі можуть включати в свій склад комп'ютери різної архітектури, і тоді вимога одноманітного виконання на кожному з них тексту початкової програми стає визначальною. Тому з розвитком глобальних мереж і розповсюдженням всесвітньої мережі Інтернет появилося багато нових систем, що інтерпретують текст початкової програми. Багато мов програмування, вживані у всесвітній мережі, припускають саме інтерпретацію тексту початкової програми без породження об'єктного коду.
У сучасних системах програмування існують реалізації програмного забезпечення, що поєднують в собі і функції компілятора, і функції інтерпретатора — залежно від вимог користувача початкова програма або компілюється, або виконується (інтерпретується). Крім того, деякі сучасні мови програмування припускають дві стадії розробки: спочатку початкова програма компілюється в проміжний код (деяка мова низького рівня), а потім цей результат компіляції виконується за допомогою інтерпретатора даної проміжної мови.
Історія інтерпретаторів поки не така багата, як історія компіляторів. Як вже було сказано, спочатку їм не надавали великого значення, оскільки майже по всіх параметрах вони поступаються компіляторам. З відомих мов, що припускали інтерпретацію, можна згадати хіба що Ваsiс, хоча більшості зараз відома його компільована реалізація Visuаl Ваsiс, зроблена фірмою Microsoft.
Проте зараз ситуація дещо змінилася, оскільки питання про переносимість програм і їх апаратнo-платформеної незалежності набуває великої актуальністі з розвитком мережі Інтернет (детальніше про принципи переносимості програмного забезпечення і про програмування для глобальних мереж розказано далі в розділі 6 «Сучасні системи програмування»). Широко поширеним прикладом мови, що інтерпретується, може служити НТМL (Нуреrtext Маrkuр Lаnguage) - мова опису гіпертексту. На його основі в даний час функціонує практично вся структура мережі Інтернет. Інший приклад - мови Java і JavaScript поєднують в собі функції компіляції і інтерпретації (текст початкової програми компілюється в деякий проміжний код, не залежний від архітектури цільової обчислювальної системи, цей код розповсюджується по мережі і інтерпретується на приймаючій стороні).
Аналіз складання алгоритму.
Структура програми.
Дана програма буде exe-програмою. Нагадаю, що ехе-програма – це програма, для якої відсутнє обмеження розміру в 64 Кб. Для написання ехе-програми потрібно використати модель пам”яті SMALL. У цій моделі пам”яті код програми розміщується в одному сегменті, а дані і стек – в іншому.
Наступним сегментом йде сегмент стеку. Стеком називають область програми для тимчасового зберігання довільних даних. По замовчуванню розмір стеку задається 1 Кб. У даній програмі я визначила розмір стеку 256 Кб.
Після цього йде опис сегменту даних. У цьому сегменті описуються усі змінні, повідомлення, константи, які в подальшому будуть використовуватися в програмі. Я описав у цьому сегменті пункти майбутнього меню програми,змінні , які я буду використовувати для роботи з файлами і повідомлення, які будуть видаватися на дисплеї, якщо будуть помилки.
Наступним іде сегмент коду. Він може бути описаний директивою .Code або наступним способом :
cseg segment 'code'
. . . . .
cseg ends
Кодовий сегмент описує основний сегмет коду. Тут міститься тест програми, процедури. Після цього іде директива ASSUME. Вона вказує ассемблеру з яким сегментом чи групою сегментів заязаний той чи інший сегментний регістр. Синтаксис ціє директиви такий:
assume ss:sseg, ds:dseg, cs:cseg
Ассемблер не накладає на процедури ніяких обмежень – у будь-якому місці програми можна передати управління на процедуру командою CALL. Процедури на ассемблері можуть бути типу NEAR і FAR, тоді відповідно всі команди RET будуть змінені на RETN і RETF. По замовчуванню всі процедури є типу NEAR. Структура опису процедури є наступною :
Мітка proc near (Far)
. . . . . .
retn (retf)
Мітка endp
Закінчується будь-яка програма наступною директивою:
End start_label
Тут start_label – визначає адрес, з якого починалося виконання програми.
Порядок завантаження сегментів описано, і тепер я перейду до опису алгоритму самої програми.
Після того, як я описала сегмет стеку і сегмен даних, в мене починається опис кодового сегменту. Як вже згадувалося, кодовий сегмент починається з мітки, яка вказує на адрес, з якого починається виконання програми. Після цього я описую сегмент і екстрасегмет даних. Виконується це за допомогою таких команд :
mov ax,dseg
mov ds,ax
mov es,ax
Я вже згадувала, що при запуску програми на дисплеї з’явиться меню програми. Пункти цього меню я описала у сегменті даних, і тепер мені потрібно вивести його на дисплей. Щоб це зробити потрібно використати функцію 09h int 21h переривання. Але перед цим я використовую ще одну функцію int 10h. Так як ми після кожного виконаного пункту меню повертаємося назад у це ж меню, потрібно щоб екран був. До того ж ця функція встановлює потрібний нам режим. Синтаксис команди :
Функция Bios 00h (int 10h)
Ввід:
АН = 00hAL= режим
Вихід:
AL = 24h (код останнього символа)
Функция DOS 09h (int 21h)
Ввід:
АН = 09hDS:DX = адрес стрічки, який закінчується символом $ (24h)
Вихід:
AL = 24h (код останнього символа).
Так як пунктів меню в мене не одне, то цю функцію мені потрібно застосувати не один раз, при цьому я вказую адресу того меню яке мені потрібно вивести. Меню вивели. Тепер потрібно якимось чином вибрати це пункт меню. Щоб вибрати потрібно ввести символ від 0 до 9 Я використовую функцію 01h int 21h.
Функція Dos 01h – зчитування символа з клавіатури
Вхід : AH= 01h
Вихід: AL= ASCII- код символа.
Після того як ввели символи пртрібно порівняти цей символ з ASCII- кодами символів від 0 до 9. Якщо цей символ співпав з якимось кодом. То відбувається перехід на відповідну мітку. Якщо ж введений символ не співпав з жодним з кодів, то видається помилка про неправильний ввід.
Тепер розглянемо структуру кожного пункту меню детальніше.
„Визначити біжучу директорію”
Отже, пункт перший – „Визначити біжучу директорію”
В цьому пункті визначається директорія в якій знаходиться наша програма.
Для цього я використовую функцію Dos 47h int 21h.
Функція Dos 47h – Визначення біжучої директорії
Вхід : AH= 47h
DL= номер диску (00-біжучий; 01-А;02-В і т.д)
DS:DI= 64 байтний буфер для біжучого шляху
Вивід: CF=0, AX=0100h – операція виконана
CF=1, AX- код помилки: 0Fh- вказаний неіснуючий диск
Щоб взнати чи ця функція виконалась, потрібно після того як викликали переривання первірити прапорець CF. Для цього потрібно використати команду :
Jc error
Error – це мітка на перевірку можливих помилок при роботі з файлами та директоріями.
Візьмемо для прикладу, що наша програма знаходиться на диску
C:\Distr\Program\Assembler\kursova.asm,
Тоді при виклику цього пункту меню нам видасть повідомлення:
Bigucha directory is : Distr\Program\Assembler
„Створення файлу”
Наступний пункт меню це – „Створення файлу”. Забігаючи на перед скажу, що при створенні файлу йому присвоюється якийсь ідентифікатор. Цей ідентифікатор не може бути однаковий у багатьох файлах одночасно. Ідентифікатор зникає тільки після того як ми закриваємо файл. Тоді цей ідентифікатор може бути присвоєний іншому файлу.
У даному пункті меню я використала функцію Dos 3Сh int 21h
Функція Dos 3Ch – створення і відкриття нового файлу
Вхід : AH= 3Ch
CX=атрибути файла [CX=0]
біт 7: файл можна відкривати різним процесам
біт 6: не використовується
біт 5: архівний біт
біт 4: каталог
біт 3: мітка тома
біт 2: системний файл
біт 1: прихований файл
біт 0: файл тільки для читання
DS:DX=адреса ASCIZ стрічки з повним іменем файла
Вивід: CF=0, AX=ідентифікатор файла
CF=1, AX=код помилки :
03h - шлях не найдений;
04h - багато відкритих файлів;
05h – доступ заборонений
Стрічку з повним іменем я вводжу з клавіатури, використовуючи функцію 01h int 21h.. Ввід закінчується нажиманням клавіші Enter.
Для прикладу покажу як вона буде працювати:
При виклику появиться повідомлення
Vvedit directory: c:\tetjana.txt
„Створення нового каталогу”
Третій пункт меню – це „Створення нового каталогу”
На відміну від файлів, каталогам не присвоюється ідентифікатор.
Для створення нового каталогу я використовую функцію Dos 39h int 21h
Створити каталог.
Ввід: AH=39h
DS:DX=адреса ASCIZ стрічки шляху (в кінці ім'я нового каталога)
Вивід: CF=0 каталог створений
CF=1, AX=код помилки:
03h – шлях не найдений
05h – доступ заборонений
„Вивід на екран вміст файлу”
Четвертий пунк меню це – „Вивід на екран вміст файлу”
Все починається з того, що потрібно ввести шлях до файлу, вміст якого потрібно вивести. Нступний крок це відкриття цього файлу для читання. Для цього потрібно виористати функцію Dos 3Dh int 21h
Відкрити існуючий файл.
Ввід: AH=3Dh
AL=режим доступу: 0 - відкрити для читання
1– відкрити для запису
2– відкрити для запису і читання
DS:DX=адресаASCIZ стрічки з повним іменем файла
Вивід: CF=0, AX=ідентифікатор файла
CF=1, AX=код помилки:
02h – файл не найдений
03h – шлях не найдений
04h – багато відкритих файлів
05h – доступ заборонений
0Ch – неправильний режим доступу
В AL потрібно встановити 0. Коли ми його відкрили, потрібно прочитати інформацію. Для цього використаємо функцію Dos 3fh int 21h
Читання з файла чи пристрою
Ввід: AH=3Fh
BX=ідентифікатор
CX=кількість бітів
DS:DX=адреса буфера для даних
Вивід: CF=0, AX=кількість прочитаних байтів
CF=1, AX=код помилки:
05h – доступ заборонений
06h – неправильний ідентифікатор
Прочитана інформація заноситься в буфер описаний в сегменті даних. Щоб вивести цю інформацію, використаємо функцію 09h int 21h. Інформація буде виводитись до знаку $. Після того як все було виконано потрібно закрити файл. Для цього тут і далі буду використовувати функцію Dos 3eh int 21h
Закрити файл.
Ввід: AH=3Eh
BX=ідентифікатор
Вивід: CF=0 помилки немає
CF=1, AX=код помилки
06h – неправильний ідентифікатор
„Копіювання файлів”.
П”ятий пункт меню це „Копіювання файлів”.
Для копіювання я використа функцію Dos 56h int 21h.
Працює ця функція так : вказуємо шлях того файла з якого будем копіювати і шлях файлу в який будемо копіювати. У даній програмі ці шляхи я вводжу з клавіатури. Особливість даної функції полягає в тому, що після копіювання інформації, файл з якого копіювали знищується.
Синтаксис функції:
Ввід: AH=56h
DS:DX – шлях старого файла
ES:DI – шлях нового файлу
Вивід: CF=0 помилки немає
CF=1, AX=код помилки
Для прикладу продемонструю як працює дана функція:
Появляється повідомлення :
Input old directory: C:\tetjana.txt
Після того як ввели шлях до файлу, появляється нове повідомленя:
Input new directory: C:\Ivastchuk\Tetjana\myfile.txt
Після цього інформація яка була в першому файлі копіюється в новий файл і перший файл автоматично знищується.
„Видалення файлу”
Шостий пункт меню це „Видалення файлу”
Як і в попереднх 5-ти пунктах, шлях до файлу я вводжу з клавіатури. Далі я викликаю функцію Dos 41h int 21h.
Видалити файл.
Ввід: AH=41h
DS:DX=адреса ASCIZ стрічки з повним іменем файла
Вивід: CF=0 файл видалений
CF=1, AX=код помилки:
02h – файл не найдений
03h – шлях не найдений
05h – доступ заборонений
Думаю, що демонструвати як працює ця функція на прикладі не потрібно.
„Записати інформацію у файл”
Сьомий пункт меню „Записати інформацію у файл”
Для того, щоб записати щось у файл його потрібно спочатку створити. Тут я використала іншу функцію для створення файлу ніж у пункті 2. Я використала функцію Dos 5Вh int 21h.
Створити і відкрити новий файл.
Ввід: AH=5Bh
CX=атрибут файла
біт 7: файл можна відкривати різним процесам
біт 6: не використовується
біт 5: архівний біт
біт 4: каталог
біт 3: мітка тома
біт 2: системний файл
біт 1: прихований файл
біт 0: файл тільки для читання
DS:DX=адреса ASCIZ стрічки з повним іменем файла
Вивід: CF=0, AX=ідентифікатор файла
CF=1, AX=код помилки:
03h – шлях не найдений
04h – багато відкритих файлів
05h – доступ заборонений
50h – файл вже існує
Відмінність цієї функції від функції використаної у пункті 2 полягає в тому, що дана функція створює файл який ще не існує. Якщо при створенні файлу у даній директорії вже буде файл з таким іменем, то ця функція видасть помилку. Отже, файл створений. Далі я вводжу потрібну мені інформацію і викликаю функцію Dos 40h int 21h.
Запис у файл чи пристрій.
Ввід: AH=40h
BX=ідентифікатор
CX=кількість байтів
DS:DX=адреса буфера з даними
Вивід: CF=0, AX=кількість записаних байтів
CF=1, AX=код помилки:
05h – доступ заборонений
06h – неправильний ідентифікатор
Одне зауваження : у регістр ВХ потрібно записати ідентивікатор того фаллу в який будете записувати інормацію. Після усього цього потрібно закрити файл. Щоб перевірити чи інформація була записана вірно, можна скористатися пунктом 4 даної програми, тобто вивести вміст файлу.
Приклад роботи даного пункту:
Please input new directory: C:\Ivastchuk\Tetjana\file\kursova.txt
Please input information:
My name is Tetjana, and it is my course project.
Вкінці вводу потрібно нажати Enter.
„Зміна біжучого диску”
Восьмий пункт це „Зміна біжучого диску”
Для зміни біжучого диску я використовую функцію Dos 0еh int 21h
Ввід: AH=0еh
DL= номер диску який буде встановлений
Вивід: AL= загальна кількість дисків в системі.
Так як цю програму я розробляkf під комп”ютери в яких кількість дисків більше ніж 2, то зробив програму на 6 дисків. Тобто, є шість функціональних клавіш, при натиску яких відбувається перевірка і перехід на відповідну мітку.
Текст програми
.186
sseg segment stack
db 256 dup(?)
sseg ends
dseg segment 'data'
a db 10, '1.Vuznachutu directoriju',0ah,0dh,'$'
b db '2.Create file',0ah,0dh,'$'
c db '3.Create new folder',0ah,0dh,'$'
d db '4.Display file',0ah,0dh,'$'
e db '5.Copy file',0ah,0dh,'$'
f db '6.Delete file',0ah,0dh,'$'
p db '7.Writing file',0ah,0dh,'$'
l db '8.Chang disk',0ah,0dh,'$'
k db '0.EXIT',0ah,0dh,'$'
sym db ?
dta db 128 dup(0)
tmp db 40
buf db 64 dup(0)
buff1 db 0
q1 db 40 dup (0)
s db 64 dup(0)
q db 40 dup (0)
buff db 0
buffer1 db 512 dup (?)
buffer2 db 128 dup (?)
buffer4 db 512 dup (?)
filehand dw 0
filehand1 dw 0
filehand3 dw ?
errm1 db 'ERROR OPEN\CREATE',7,0ah,0dh,'$'
errm2 db 'ERROR <Fajl ne znajdeno>',7,0ah,0dh,'$'
errm3 db 'ERROR <Shljah ne znajdeno>',7,0ah,0dh,'$'
errm4 db 'ERROR <Bagato vidkrutuh files>',7,0ah,0dh,'$'
errm5 db 'ERROR <Dostyp zaboroneno>',7,0ah,0dh,'$'
errm6 db 'ERROR <Nepravulnuj identifikator>',7,0ah,0dh,'$'
errm db 'ERROR',7,0ah,0dh,'$'
errm50 db 'ERROR <File vze isnue>',7,0ah,0dh,'$'
errm0ch db 'ERROR <Nepravulnuy rezum dostupu>',7,0ah,0dh,'$'
errm0fh db 'ERROR <Vkazanuy neisnuychuy disk>',7,0ah,0dh,'$'
text db 'Kursova robota','$'
text1 db 'Interpretator komandnoi movu','$'
text2 db 'Made by Іvastchuk Tetjana (c)','$'
clf db 0ah,0dh,'$'
message7 db 'Vuberit punk menu: ','$'
message db 'Enter source file name',0ah,0dh,'$'
message1 db 'Enter new file name',0ah,0dh,'$'
message2 db 'Vvedit direktory: ','$'
message3 db 'File was create a a successful and correct ','$'
message4 db 'New directory was create a successful and correct','$'
message5 db 'Information was read','$'
message6 db 'Bigucha directory is: ','$'
message8 db 'Vkazit novu durectory: ','$'
message9 db 'File was delete!','$'
message10 db 'Please input information ','$'
message11 db 'Operation complete','$'
message12 db 'Please to choose a disk (1-a;2-c;3-d;4-e;5-f;6-g): ','$'
message13 db 'Nepravulna komanda','$'
dseg ends
cseg segment 'code'
assume ss:sseg, ds:dseg, cs:cseg
start: mov ax,dseg
mov ds,ax
mov es,ax
menu: mov ax,0003h
int 10h
mov bp,offset text
mov dh,0
mov dl,30
mov bl,00000010b
mov cx,14
mov ah,13h
mov al,1
int 10h
mov bp,offset text1
mov dh,1
mov dl,30
mov bl,00000010b
mov cx,28
mov ah,13h
mov al,1
int 10h
mov bp,offset text2
mov dh,2
mov bl,10000001b
mov dl,30
mov cx,23
mov ah,13h
mov al,1
int 10h
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset a
int 21h
mov ah,09h
mov dx,offset b
int 21h
mov ah,09h
mov dx,offset c
int 21h
mov ah,09h
mov dx,offset d
int 21h
mov ah,09h
mov dx,offset e
int 21h
mov ah,09h
mov dx,offset f
int 21h
mov ah,09h
mov dx,offset p
int 21h
mov ah,09h
mov dx,offset l
int 21h
mov ah,09h
mov dx,offset k
int 21h
mov ah,09h
mov dx,offset message7
int 21h
;--------------------------------------------
d1: mov ah,0ch
mov al,1
int 21h
cmp al,30h
je ex
cmp al,31h
je a1
cmp al,32h
je b1
cmp al,33h
je c1
cmp al,34h
je k1
cmp al,35h
je e1
cmp al,36h
je f1
cmp al,37h
je p1
cmp al,38h
je l1
jne o1
o1: mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message13
int 21h
mov ah,08h
int 21h
jmp menu
;---------------------------------------------
a2:
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message6
int 21h
mov ah,47h ;opr dir
xor dl,dl
mov si,offset buf
int 21h
jc er
mov buf[62],0ah
mov buf[63],0dh
mov buf[64],'$'
mov ah,09h
mov dx,offset buf
int 21h
jmp d1
;---------------------------------------------
ex: jmp exit
a1: jmp a2
b1: jmp b2
c1: jmp c2
k1: jmp d2
e1: jmp e2
f1: jmp f2
p1: jmp p2
l1: jmp l2
;----------------------------------------------
c2:
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message2
int 21h
xor si,si
mitka9: mov ah,01h
int 21h
cmp al, 0Dh
je Dali9
mov buffer1[si],al
inc si
jmp mitka9
Dali9: mov buffer1[si], 00h
mov ah,39h
mov dx,offset buffer1
int 21h
jc er
mov ah,09
mov dx,offset message4
int 21h
mov ah,08h
int 21h
jmp menu
;----------------------------------------------
er: jmp error
;----------------------------------------------
b2:
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message2
int 21h
xor si,si
m4: mov ah,1
int 21h
cmp al,0dh
je m5
mov buff[si],al
mov buff1[si],al
inc si
jmp m4
m5: mov buff[si],0
mov buff1[si],0
mov ah,3ch ;create F
xor cx,cx
mov dx,offset buff
int 21h
mov filehand1,ax
jc er
mov ah,09
mov dx,offset message3
int 21h
mov ah,08h
int 21h
jmp menu
;---------------------------------------------
d2: mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message2
int 21h
xor si,si
mitka2: mov ah,01h
int 21h
cmp al, 0Dh
je Dali2
mov buffer1[si],al
inc si
jmp mitka2
Dali2: mov buffer1[si], 00h
mov ah,3dh
mov dx,offset buffer1 ;open read F
xor al,0
xor cl,cl
int 21h
mov filehand,ax
jc er
mov ah,3fh ;read F
mov bx,filehand
mov cx,512
mov dx,offset s
int 21h
jc ex2
mov s[512],'$'
mov ah,09h
mov dx,offset s
int 21h
mov ah,3eh ;close F
mov bx,filehand
int 21h
jc ex2
xor ah,ah
int 16h
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09
mov dx,offset message5
int 21h
mov ah,08h
int 21h
jmp menu
;---------------------------------------------
ex2: jmp error
;---------------------------------------------
e2:
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message2
int 21h
xor si,si
mitka5: mov ah,01h
int 21h
cmp al, 0Dh
je Dali5
mov buffer1[si],al
inc si
jmp mitka5
Dali5: mov buffer1[si], 00h
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message8
int 21h
xor si,si
mitka6: mov ah,01h
int 21h
cmp al, 0Dh
je Dali6
mov buffer2[si],al
inc si
jmp mitka6
Dali6: mov buffer2[si], 00h
mov ah,56h
mov dx,offset buffer1
mov di,offset buffer2
int 21h
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09
mov dx,offset message4
int 21h
mov ah,08h
int 21h
jmp menu
;----------------------------------------------
f2:
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message2
int 21h
xor si,si
m12: mov ah,1
int 21h
cmp al,0dh
je m13
mov buff[si],al
mov buff1[si],al
inc si
jmp m12
m13: mov buff[si],0
mov buff1[si],0
mov ah,41h
mov dx,offset buff
int 21h
mov filehand1,ax
jc ex5
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message9
int 21h
mov ah,08h
int 21h
jmp menu
;---------------------------------------------
ex5: jmp error
;---------------------------------------------
p2: mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message2
int 21h
xor si,si
mitka7: mov ah,01h
int 21h
cmp al, 0Dh
je Dali7
mov buffer1[si],al
inc si
jmp mitka7
Dali7: mov buffer1[si], 00h
mov ah,5Bh
mov cx,00h
mov dx,offset buffer1
int 21h
jc ex5
mov filehand3,ax
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message10
int 21h
xor si,si
mitka8: mov ah,01h
int 21h
cmp al, 0Dh
je Dali8
mov buffer4[si],al
inc si
jmp mitka8
Dali8: mov buffer4[si], 00h
mov ah,40h
mov bx,filehand3
mov cx,32
mov dx,offset buffer4
int 21h
jc ex5
mov filehand3,ax
mov ah,3Eh
mov bx,filehand3
int 21h
mov ah,09h
mov dx,offset clf
int 21h
mov ah,09
mov dx,offset message11
int 21h
mov ah,08h
int 21h
jmp menu
;---------------------------------------------
l2: mov ah,09h
mov dx,offset clf
int 21h
mov ah,09h
mov dx,offset message12
int 21h
mov ah,01h
int 21h
cmp al,31h
je disk_a
cmp al,32h
je disk_c
cmp al,33h
je disk_d
cmp al,34h
je disk_e
cmp al,35h
je disk_f
cmp al,36h
je disk_h
disk_a: mov ah,0eh
mov dl,00h
int 21h
jmp menu
disk_c: mov ah,0eh
mov dl,02h
int 21h
jmp menu
disk_d: mov ah,0eh
mov dl,03h
int 21h
jmp menu
disk_e: mov ah,0eh
mov dl,04h
int 21h
jmp menu
disk_f: mov ah,0eh
mov dl,05h
int 21h
jmp menu
disk_h: mov ah,0eh
mov dl,06h
int 21h
jmp menu
;---------------------------------------------
error: jmp error1
;---------------------------------------------
error1:
cmp ax,02h
je error_2
cmp ax,03h
je error_3
cmp ax,04h
je error_4
cmp ax,05h
je error_5
cmp ax,06h
je error_6
cmp ax,0Ch
je error0Ch
cmp ax,50h
je error50
cmp ax,0Fh
je error0Fh
;---------------------------------------------
error_2:
mov ah,09h
mov dx,offset errm2
int 21h
mov ah,08h
int 21h
jmp menu
error_3:
mov ah,09h
mov dx,offset errm3
int 21h
mov ah,08h
int 21h
jmp menu
error_4:
mov ah,09h
mov dx,offset errm4
int 21h
mov ah,08h
int 21h
jmp menu
error_5:
mov ah,09h
mov dx,offset errm5
int 21h
mov ah,08h
int 21h
jmp menu
error_6:
mov ah,09h
mov dx,offset errm6
int 21h
mov ah,08h
int 21h
jmp menu
error50:
mov ah,09h
mov dx,offset errm50
int 21h
mov ah,08h
int 21h
jmp menu
error0ch:
mov ah,09h
mov dx,offset errm0ch
int 21h
mov ah,08h
int 21h
jmp menu
error0fh:
mov ah,09h
mov dx,offset errm0fh
int 21h
mov ah,08h
int 21h
jmp menu
;---------------------------------------------
exit: mov ah,4Ch
int 21h
cseg ends
end start
Загальна структура програми
ВИСНОВОК:
У даній курсовій роботі я розробила інтерпретатор командної мови на мові програмування Ассемблер. У своїй роботі я використала функції Dos для роботи з файлами і дисками, цим самим показавши свої знання і вміння роботи з цими функціями. Дана програма може використовуватися як навчальна програма для роботи з файлами.