Інтерпретатор командної мови.

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2008
Тип роботи:
Курсова робота
Предмет:
Системне програмування та операційні системи
Група:
КН-213

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і наукиУкраїни Національний університет “Львівська політехніка” Кафедра САПР Курсова робота З дисципліни “Системне програмування та операційні системи” На тему : “Інтерпретатор командної мови”    Львів 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) Ввід: АН = 00h AL= режим  Вихід: AL = 24h (код останнього символа)  Функция DOS 09h (int 21h) Ввід: АН = 09h DS: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 для роботи з файлами і дисками, цим самим показавши свої знання і вміння роботи з цими функціями. Дана програма може використовуватися як навчальна програма для роботи з файлами.
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

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

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!