Програма емуляції роботи командного процесора операційної системи

Розробка емуляції роботи командного процесора операційної системи, що вміщує точку входу в програму, головну "суперпетлю" (нескінченний інтерактивний цикл очікування дії користувача), модулі команд split, mem, join, dir та реагує на команди exit і help.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 02.04.2010
Размер файла 388,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

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

Вінницький технічний коледж

Спеціальність: 5.091504

Програма емуляції роботи командного процесора операційної системи

Пояснювальна записка до курсового проекту

з дисципліни: "Cистемне програмування"

Виконав: студент групи 4ОК2

Поздняков Д.Є.

Прийняв: Кисюк Д.В.

Вінниця 2010

ЗМІСТ

ВСТУП

1. АНАЛІЗ ТЕХНІЧНОГО ЗАВДАННЯ

2. ТЕОРЕТИЧНА ЧАСТИНА

2.1 Опис принципів роботи, системні ресурси та функції необхідні для створення програми

2.2 Базові типи даних

2.3 Основні оператори

2.4 Функції Асемблеру

2.5 Загальний алгоритм програми

3. ПРАКТИЧНА ЧАСТИНА

3.1 Розробка алгоритму програми

3.2 Опис підходів та системних функцій покладених у їх основу

ВИСНОВОК

ЛІТЕРАТУРА

ВСТУП

Операційна система - це комплекс взаємозв'язаних програм, який діє як інтерфейс між додатками і користувачами з одного боку і апаратурою комп'ютера з іншого боку. Відповідно до цього визначення операційна система виконує дві основні функції:

· надання користувачеві або програмістові замість реальної апаратури розширеної віртуальної машини (яку іноді називають операційне середовище), з якою зручно працювати і яку легко програмувати;

· підвищення ефективності використання комп'ютера шляхом раціонального управління його ресурсами відповідно до деяких критеріїв.

Сучасні відкриті операційні системи, такі як Linux або OPENBSD походять від операційної системи UNIX, що з'явилася на початку 1970-х років і зробила величезний вплив на практичні реалізації операційних систем і розвиток всієї області інформаційних технологій. Тому вивчення будь-якою з сучасних UNIX-подібних операційних систем неможливо без розгляду основних ідей, закладених в оригінальний UNIX.

Всі сучасні комп'ютерні системи побудовані по трьом принципам Джона фон Неймана: програмного управління, однорідності пам'яті і адресності. Ці принципи можна розкрити таким чином: програма, що складається з набору команд, і початкові дані зберігаються в загальній пам'яті, кожен осередок якої має свою адресу (набір всіх адрес, до яких може звертатися програма, називається адресним простором); кожна команда разом з даними вибирається з пам'яті і виконується процесором, вибір команди здійснюється за допомогою спеціального лічильника команд, який містить в собі адресу виконуваної в даний момент команди; команди розташовані в пам'яті один за одним, за рахунок чого організовується послідовна вибірка з пам'яті ланцюжка команд.

На підставі цього можна виділити три основні структурні елементи комп'ютера:

1) Процесор - здійснює контроль за діями комп'ютера, а також виконує функцію обробки даних згідно програмі. У сучасних системах може бути один і більше центральних процесорів.

2) Основна пам'ять - у ній зберігаються програми і дані. Як правило є тимчасовою (інформація зберігається, поки подається живлення).

3) Пристрої введення-виводу - служать для передачі даних між комп'ютером і зовнішнім оточенням, що складається з переферійних пристроїв, до числа яких входять зовнішня пам'ять, комунікаційне устаткування, термінали.

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

Центральний процесор витягує програму з пам'яті, декодує і виконує машинні команди. Зазвичай команди виконуються послідовно, але іноді можливі переходи до інших ділянок програми, наприклад, по заданій умові.

У кожен момент часу процесор може виконувати тільки одну програму. Багато сучасних операційних систем відносяться до багатозадачних, тобто в системі одночасно може виконуватися декілька завдань, число яких заздалегідь невідоме. Оскільки число процесорів кінцеве, необхідні алгоритми, що дозволяють чергувати виконань процесів так, щоб кожен з них отримував процесорний час. Цей підхід називається псевдопараллелізмом: кожному процесу виділяється квант процесорного часу, після закінчення якого управління передається іншому процесу (цю дію називають перемиканням контексту). Також управління може бути передане іншому процесу, якщо виконуваний процес чекає появи якогось системного ресурсу, наприклад, завершення операції введення-виводу.

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

Особливе значення має основна пам'ять - в ній зберігаються програми, що виконуються, і дані до них. Програма може звертатися до будь-якого елементу пам'яті з доступної множини (яке називається адресним простором). Існує декілька видів адресних просторів: реальні (відповідають елементам фізичної пам'яті або портам введення-виводу) і віртуальні (певним чином проектовані на реальні адресні простори). У сучасних операційних системах кожен процес володіє своїм власним адресним простором, так що не може завдати шкоди пам'яті інших процесів.

Загальна архітектура операційної системи

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

Найбільш загальним підходом до структуризації операційної системи є її розділення всіх її модулів на дві групи:

· ядро - модулі, що виконують основні функції операційної системи, вирішальні внутрісистемні завдання організації обчислювального процесу, такі як перемикання контексту, управління пам'яттю, обробка переривань, робота із зовнішніми пристроями і тому подібне

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

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

Архітектура MS DOS

Архітектура MS DOS показана на рисунку 1. Можна говорити про те, що системне програмне забезпечення складається з двох рівнів. Нижній рівень складає Базова Система Введення-Виводу (BIOS), що зберігається в ПЗП. Другий рівень складає власне MS DOS. (Можна сказати, що BIOS є компонентом апаратної частини , але подальші ОС на платформі Intel-pentium майже не використовують функції BIOS). Системні виклики реалізовані в програмних перериваннях. Всього можливі 256 типів (код) переривань. З них переривання з 16-річнимі кодами від 0 до F зарезервовані за апаратурою, переривання з кодами від 10 до 1f - звернення до BIOS, переривання з кодами від 20 до 3f - звернення до MS DOS. Мабуть, спочатку передбачалося, що безпосередньо працювати з апаратурою буде тільки BIOS, MS DOS звертатиметься до BIOS для виконання операцій на апаратурі, а додатки - тільки до MS DOS. Проте в подальших версіях MS DOS перехоплює все більше функцій BIOS. Додаткам доступні не тільки будь-які звернення до MS DOS і до BIOS, але і такі команди, які в інших системах є привілейованими, наприклад, команди введення-виводу, отже, додатки мають доступ до апаратури в обхід ОС і BIOS.

Рисунок 1- Архітектура MS DOS

Оскільки MS DOS спроектована як однозадачна система, засоби взаємодії процесів в ній майже не передбачаються. Для взаємодії резидентних програм застосовуються переривання: резидентна програма перехоплює обробку переривання з певним номером. У специфікаціях MS DOS передбачено два переривання, які можна використовувати для цієї мети (2d, 2f), проте, багато застосувань використовують для цього "незайняті" переривання з номерами, великими 3f.

Командний процесор MS DOS - програма COMMAND.COM - забезпечує виконання команд і утиліт, пов'язаних з управлінням файловою системою, виконанням програм, управлінням параметрами оточення. Забезпечується також перенаправлення стандартного введення-виводу і конвеєрне виконання команд. COMMAND.COM - процесор командного рядка, повсюдно MS DOS використовується з повноекранними оболонками, найбільш популярна з яких - Norton Commander.

1. АНАЛІЗ ТЕХНІЧНОГО ЗАВДАННЯ

В даному курсовому проекті я розробив програму емуляції роботи командного процесора операційної системи. Моя програма містить точку входу в програму, головну "суперпетлю" (нескінченний інтерактивний цикл очікування дії користувача), модуль аналізу команди користувача, модулі команд (згідно варіанту 1 - 3 на мові С++ і 4 на Assembler):

split - розділити текстовий файл на дві частини;

mem - виведення на екран зайняте (вільне) місце пам'яті;

join - з'єднати текстові файли в один;

dir - виводить на екран вміст поточного каталогу.

Крім того, програма реагує на команди exit, за якою вона коректно завершує свою роботу, та help, за якою видається довідка про написану програму. Кожна з команд, реалізована в даному варіанті має такий параметр /?, за яким користувачу надається довідка про дану команду.

2. ТЕОРЕТИЧНА ЧАСТИНА

2.1 Опис принципів роботи, системні ресурси та функції необхідні для створення програми

Функція - це сукупність оголошень і операторів, звичайно призначена для вирішення певного завдання. Кожна функція повинна мати ім'я, яке використовується для її оголошення, визначення і виклику. У будь-якій програмі на С++ повинна бути функція з| ім'ям main (головна функція), саме з цієї функції, в якому б місці програми вона не знаходилася, починається виконання програми.

При виклику функції їй за допомогою аргументів (формальних параметрів) можуть бути передані деякі значення (фактичні параметри), використовувані під час виконання функції. Функція може повертати деяке (одне !) значення. Це повертане значення і є результат виконання функції, який при виконанні програми підставляється в точку виклику функції, де б цей виклик не зустрівся. Допускається також використовувати функції що не мають аргументів і функції що не повертають ніяких значень. Дія таких функцій може полягати, наприклад, в зміні значень деяких змінних, висновку на друк деяких текстів і т.п.

З використанням функцій в мові С++ зв'язані три поняття - визначення функції (опис дій, що виконуються функцією), оголошення функції (завдання форми звернення до функції) і виклик функції.

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

У мові С++ немає вимоги, щоб визначення функції обов'язково передувало її виклику. Визначення використовуваних функцій можуть слідувати за визначенням функції main, перед ним, або знаходиться в іншому файлі.

Проте для того, щоб компілятор міг здійснити перевірку відповідності типів передаваних фактичних параметрів типам формальних параметрів до виклику функції потрібно помістити оголошення (прототип) функції.

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

У програмах на мові С++ широко використовуються, так звані, бібліотечні функції, тобто функції заздалегідь розроблені і записані в бібліотеки. Прототипи бібліотечних функцій знаходяться в спеціальних заголовних файлах, що поставляються разом з бібліотеками у складі систем програмування, і включаються в програму за допомогою директиви #include.

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

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

Відповідно до синтаксису мови С++ визначення функції має наступну форму:

[специфікатор-класа-пам'яті] [специфікатор-типа] функції імені

([список-формальных-параметрів])

{ функції тіла }

Список-формальных-параметрів - це послідовність оголошень формальних параметрів, розділена комами. Формальні параметри - це змінні, використовувані усередині тіла функції і одержуючі значення при виклику функції шляхом копіювання в них значень відповідних фактичних параметрів. Список-формальных-параметрів може закінчуватися комою (,) або комою з багатокрапкою (,…), це означає, що число аргументів функції змінно. Проте передбачається, що функція має, принаймні, стільки обов'язкових аргументів, скільки формальних параметрів задано перед останньою комою в списку параметрів. Такої функції може бути передано більше число аргументів, але над додатковими аргументами не проводиться контроль типів.

Якщо функція не використовує параметрів, то наявність круглих дужок обов'язково, а замість списку параметрів рекомендується вказати слово void.

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

Для формального параметра можна задавати клас пам'яті register, при цьому для величин типу int специфікатор типу можна опустити.

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

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

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

Тіло функції - це складений оператор, що містить операторів, що визначають дію функції.

Всі змінні, оголошені в тілі функції без вказівки класу пам'яті, мають клас пам'яті auto, тобто вони є локальними. При виклику функції локальним змінним відводиться пам'ять в стеку і проводиться їх ініціалізація. Управління передається першому оператору тіла функції і починається виконання функції, яке продовжується до тих пір, поки не зустрінеться оператор return або останній оператор тіла функції. Управління при цьому повертається в крапку, наступну за точкою виклику, а локальні змінні стають недоступними. При новому виклику функції для локальних змінних пам'ять розподіляється знов, і тому старі значення локальних змінних втрачаються.

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

Якщо потрібно викликати функцію до її визначення в даному файлі, або визначення функції знаходиться в іншому початковому файлі, то виклику функції слід передувати оголошенням цієї функції. Оголошення (прототип) функції має наступний формат:

[специфікатор-класа-пам'яті] [специфікатор-типа] функції імені ([список-формальных-параметрів]) [,список-імен|-функцій];

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

Прототип - це явне оголошення функції, яке передує визначенню функції. Тип повертаного значення при оголошенні функції повинен відповідати типу повертаного значення у визначенні функції.

Якщо прототип функції не заданий, а зустрівся виклик функції, то будується неявний прототип з аналізу форми виклику функції. Тип повертаного значення створюваного прототипу int, а список типів і числа параметрів функції формується на підставі типів і числа фактичних параметрів використовуваних при даному виклику.

Таким чином, прототип функції необхідно задавати в наступних випадках:

1) Функція повертає значення типа, відмінного від int.

2) Потрібен проініциалізувати деякий покажчик на функцію до того, як ця функція буде визначена.

Наявність в прототипі повного списку типів аргументів параметрів дозволяє виконати перевірку відповідності типів фактичних параметрів при виклику функції типам формальних параметрів, і, якщо необхідно, виконати відповідні перетворення.

У прототипі можна вказати, що число параметрів функції змінно, або що функція не має параметрів.

Якщо прототип заданий з класом пам'яті static, то і визначення функції повинне мати клас пам'яті static. Якщо специфікатор класу пам'яті не вказаний, то мається на увазі клас пам'яті extern.

Виклик функції має наступний формат:

адресний-вираз ([виразів списку])

Оскільки синтаксично ім'я функції є адресою почала тіла функції, як звернення до функції може бути використано адресний-вираз (у тому числі і ім'я функції або розадресація покажчика на функцію), що має значення адреси функції.

Виразів Списку є списком фактичних параметрів, передаваних у функцію. Цей список може бути і порожнім, але наявність круглих дужок обов'язково.

Фактичний параметр може бути величиною будь-якого основного типа, структурою, об'єднанням, переліком або покажчиком на об'єкт будь-якого типа. Масив і функція не можуть бути використані як фактичні параметри, але можна використовувати покажчики на ці об'єкти.

Виконання виклику функції відбувається таким чином:

1) Обчислюються вирази в списку виразів і піддаються звичайним арифметичним перетворенням. Потім, якщо відомий прототип функції, тип одержаного фактичного аргументу порівнюється з типом відповідного формального параметра. Якщо вони не співпадають, то або проводиться перетворення типів, або формується повідомлення про помилку. Число виразів в списку виразів повинне співпадати з числом формальних параметрів, якщо тільки функція не має змінного числа параметрів. У останньому випадку перевірці підлягають тільки обов'язкові параметри. Якщо в прототипі функції вказано, що їй не потрібні параметри, а при виклику вони вказані, формується повідомлення про помилку.

2) Відбувається привласнення значень фактичних параметрів відповідним формальним параметрам.

3) Управління передається на першого оператора функції.

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

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

2.2 Базові типи даних

В мові C++ всі змінні повинні бути описані до їх використовування, звичайно це робиться на початку функції до першого виконуваного оператора. Якщо ви забудете вставити опис, то одержите діагностичне повідомлення від компілятора. Опис складається з типу і списку змінних, які мають цей тип, як в:

int lower, upper, step

float fahr, сеlsius;

Тип int означає, що всі змінні списку цілі; тип float призначений для чисел з плаваючою крапкою, тобто Для чисел, які можуть мати дробову частину. Точність як int, так і float залежить від конкретної машини, на якій ви працюєте. На PDP-11, наприклад, тип int відповідає 16-бітовому числу із знаком, тобто Числу, що лежить між -32768 і +32767. Число типу float - це 32-бітове число, що має близько семи значущих цифр і лежаче в діапазоні від 10е-38 до 10е+38. В мові С++ передбачено ще інші основні типи даних, окрім int і float:

сhar символ-один байт

short коротке ціле

long довге ціле

double плаваюче з подвійною точністю

2.3 Основні оператори

Оператор while

Тіло оператора while може складатися з одного або більш операторів, укладених у фігурні дужки, або з одного оператора без дужок, як, наприклад:

while (i < j)

i = 2 * i;

В обох випадках оператори, керовані оператором while зсунуті на одну табуляцію, щоб ви могли з першого погляду бачити, які оператори знаходяться усередині циклу. Такий зсув підкреслює логічну структуру програми. Хоча в мові С++ допускається той, що абсолютно довільне розташовує операторів в рядку, відповідний зсув і використовування пропусків значно полегшують читання програм. Ми рекомендуємо писати тільки один оператор на рядку і (звичайно) залишати пропуски навкруги операторів. Той, що розташований в фігурних дужках, менш істотний; ми вибрали один з декількох популярних стилів. Виберіть відповідний для вас стиль і потім використайте його послідовно.

Оператор for

Оператор for - це оператор циклу, узагальнюючий оператор while. Його функціонування повинне стати ясним, якщо ви порівняєте його з раніше описаним оператором while . Оператор for містить три частини, що розділяються крапкою з комою.

Перша частина: fahr=0 виконується один раз перед входом в сам цикл. Друга частина - перевірка, або умова, яка управляє циклом: fahr<=300.

Ця умова перевіряється і, якщо воно істинне, то виконується тіло циклу (в даному випадку тільки функція printf ). Потім виконується крок реаніаціалізації: fahr=fahr+20 умова перевіряється знову. Цикл завершується, коли це умова стає помилковою. Так само, як і у випадку оператора while, тіло циклу може складатися з одного оператора або з групи операторів, укладених в фігурні дужки. Що ініціалізуюча і реаніціалізуюча частини можуть бути будь-якими окремими виразами.

Оператор for звичайно зручний для циклів, в яких ініціалізація і реаніаціалізація логічно зв'язані і кожна задається одним оператором, оскільки в цьому випадку запис більш компактний, ніж при використовуванні оператора while, а оператори управління циклом групуються разом в одному місці.

Оператор if - else

Оператор if - else використовується при необхідності зробити вибір. Формально синтаксис має вигляд:

if (вираз)

оператор-1

else

оператор-2

де частина else є необов'язковою. Спочатку обчислюється вираз; якщо воно "істинне". Значення виразу відмінне від нуля/, то виконується оператор-1. Якщо воно помилкове /значення виразу рівне нулю/, і якщо є частина з else, то замість оператора-1 виконується оператор-2.

Оператор switch

Оператор switch дає спеціальний спосіб вибору одного з багатьох варіантів, який полягає в перевірці збігу значення даного виразу з однією із заданих констант і відповідному галуженні. Формат оператора наступний:

switch (вираз)

{ [об'ява]

:[ case константний-вираз1]: [ список-операторів1]

[ case константний-вираз2]: [ список-операторів2]

[ default: [ список операторів ]] }

Наприклад:

int i=2;

switch (i)

{ case 1: i += 2;

case 2: i *= 3;

case 0: i /= 2;

case 4: i -= 5;

default: ; }

Оператор return

Оператор return служить механізмом для повернення значення з викликаної функції у функцію, яка до неї звернулася. За return може слідувати будь-який вираз:

return (вираз)

Виконуюча функція може ігнорувати значення, що повертається, якщо вона цього побажає. Більш того, після return може не бути взагалі ніякого виразу; в цьому випадку в ту, що викликає програму не передається ніякого значення. Управління також повертається в ту програму, що викликає програму без передачі якого-небудь значення і у тому випадку, коли при виконанні ми "провалюємося" на кінець функції, досягаючи правої фігурної дужки, що закривається. Якщо функція повертає значення з одного місця і не повертає ніякого значення з іншого місця, це не є незаконним, але може бути ознакою якихось неприємностей. У будь-якому випадку "значенням" функції, яка не повертає значення, безперечно сміття. Налагоджувальна програма lint перевіряє такі помилки.

2.4 Функції Асемблеру

Написання асемблерних програм вимагає знань організа всієї системи комп'ютера. У основі комп'ютера лежать поняття біта і байта. Вони є тим засобом, завдяки яким в комп'ютерній пам'яті представлені дані і команди.

Програма в машинному коді складається з різних сегментів для визначення даних, для машинних команд і для сегмента названого стеком, для зберігання адрес. Для виконання ариф дій, пересилки даних і адресації комп'ютер має ряд регістрів. Для цілей стандартизації в мікрокомп'ютерах використовується американський національний стандартний код для обміну інформа ASCII (American National Standard Code for Information Interchange). Саме з цієї причини комбінація біт 01000001 позначає букву A. Наявність стандартного коду полегшує обмін даними між різними пристроями комп'ютера. 8-бітовий розширений ASCII-код, використовуваний в PC забезпечує уявлення 256 символів, включаючи символи для націо алфавітів.

Сегменти

Сегментом називається область, яка починається на межі параграфа, тобто за будь-якою адресою, яка ділиться на 16 без залишку. Хоча сегмент може розташовуватися в будь-якому місці пам'яті і мати розмір до 64 Кбайт, він вимагає стільки пам'яті, скільки необхідне для виконання програми. Є три головні сегменти:

1) Сегмент кодів. Сегмент кодів містить машинні команди, які виконуватимуться. Звичайно перша виконувана команда знаходиться на початку цього сегменту і операційна система передає управління за адресою даного сегменту для виконання програми. Регістр сегменту кодів (CS) адресує даний сегмент.

2) Сегмент даних. Сегмент даних містить певні дані, константи і робочі області, необхідні програмі. Регістр сегменту даних (DS) адресує даний сегмент.

3) Сегмент стека. Стек містить адреси повернення як для програми для повернення в операційну систему, так і для викликів підпрограм для повернення в головну програму. Регістр сегменту стека (SS) адресує даний сегмент.

Ще один сегментний регістр, регістр додаткового сегменту (ES), призначений для спеціального використання. Три сегментні регістри містять початкові адреси відповідних сегментів і кожен сегмент починається на межі параграфа.

Усередині програми всі адреси пам'яті відносні до початку сегменту. Такі адреси називаються зсувом від початку сегменту. Двобайтовий зсув (16-біт) може бути в межах від шістнадцятк. 0000 до шістнадцятк. FFFF або від 0 до 65535. Для звернення до будь-якої адреси в програмі, комп'ютер складає адресу в регістрі сегменту і зсув. Наприклад, перший байт в сегменті кодів має зсув 0, другий байт - 01 і так далі до зсуву 65535.

Регістри

Процесори 8086/8088 мають 14 регістрів, використовуваних для управління програмою, що виконується, для адресації пам'яті і для забезпечення арифметичних обчислень. Кожен регістр має довжину в одне слово (16 біт) і адресується по імені. Біти регістра прийнято нумерувати зліва направо: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Процесори 80286 і 80386 мають ряд додаткових регістрів, деякі з них 16-бітові. Ці регістри тут не розглядаються.

Сегментні регістри CS, DS, SS і ES

Кожен сегментний регістр забезпечує адресацію 64К пам'яті, яка називається поточним сегментом. Як показано раніше, сегмент вирівнюється на межу параграфа і його адресу в сегментному регістрі припускає наявність справа чотирьох нульових бітів. 1) Регістр CS. Регістр сегменту коду містить початкову адресу сегменту коду. Ця адреса плюс величина зсуву в командному покажчику (IP) визначає адресу команди, яка повинна бути вибрана для виконання. Для звичайних програм немає необхідності робити посилання на регістр CS. 2) Регістр DS. Регістр сегменту даних містить початкову адресу сегменту даних. Ця адреса плюс величина зсуву, визначена в команді, указують на конкретний осередок в сегменті даних. 3) Регістр SS. Регістр сегменту стека містить початкову адресу в сегменті стека. 4) Регістр ES. Деякі операції над рядками використовують додатковий сегментний регістр для управління адреси цієї пам'яті. У даному контексті регістр ES пов'язаний з ін регістром DI. Якщо необхідно використовувати регістр ES, асемблерна програма повинна його ініціалізувати.

Регістри загального призначення: AX, BX, CX і DX

При програмуванні на асемблері регістри загального призначення є "робочими конячками". Особливість цих регістрів полягає в тому, що можлива адресація їх як одного цілого слова або як однобайтової частини. Лівий байт є старшою частиною (high), а правий - молодшою частиною (low). Наприклад, двобайтовий регістр CX складається з двох однобайтових: CH і CL, і посилання на регістр можливі по будь-якому з цих трьох імен.

1) Регістр AX. Регістр AX є основним суматором і застосовується для всіх операцій введення-висновку, деяких операцій над рядками і деяких арифметичних операцій. Наприклад, команди множення, ділення і зрушення припускають використання регістра AX. Деякі команди генерують ефективніший код, якщо вони мають посилання на регістр AX.

AX: | AH | AL |

2) Регістр BX. Регістр BX є базовим регістром. Це єдиний регістр загального призначення, який може використовуватися як "індекс" для розширеної адре. Інше загальне застосування його - обчислення.

BX: | BH | BL |

3) Регістр CX. Регістр CX є лічильником. Він необхідний для управління числом повторень циклів і для операцій зрушення вліво або управо. Регістр CX використовується також для обчислень.

CX: | CH | CL |

4) Регістр DX. Регістр DX є регістром даних. Він застосовується для деяких операцій введення/висновку і тих операцій множення і ділення над великими числами, які використовують регістрову пару DX і AX.

DX: | DH | DL |

Будь-які регістри загального призначення можуть використовуватися для складання і віднімання як 8-ми, так і 16-ти бітових значень.

Регістрові покажчики: SP і BP

Регістрові покажчики SP і BP забезпечують системі доступ до даних в сегменті стека. Рідше вони використовуються для операцій складання і віднімання. 1) Регістр SP. Покажчик стека забезпечує використання стека в пам'яті, дозволяє тимчасово зберігати адреси і інколи| дані. Цей регістр пов'язаний з регістром SS для адресації стека. 2) Регістр BP. Покажчик бази полегшує доступ до параметрів: даним і адресам переданим через стек.

Індексні регістри: SI і DI

Обидва індексні регістри можливі для розширеної адресації і для використання в операціях складання і віднімання. 1. Регістр SI. Цей регістр є індексом джерела і застосовується для деяких операцій над рядками. У даному контексті регістр SI пов'язаний з регістром DS. 2. Регістр DI. Цей регістр є індексом призначення і застосовується також для строкових операцій. У даному контексті регістр DI пов'язаний з регістром ES.

Регістр командного покажчика: IP

Регістр IP містить зсув на команду, яка повинна бути виконана. Звичайно цей регістр в програмі не викоримтовується, але він може змінювати своє значення при використанні відладчика DOS DEBUG для тестування програми.

2.5 Загальний алгоритм програми

Рисунок 2 - Загальний алгоритм програми

3. ПРАКТИЧНА ЧАСТИНА

3.1 Розробка алгоритму програми

Для реалізації почергового введення команд організуємо цикл, вихід з якого відбувається при введені команди "exit". Підчас виконання циклу буде виконуватись очікування, зчитування та обробка потрібної команди.

Для зчитування команди я використовую бібліотечну функцію gets(temp) . У змінну "temp" записується введений рядок, потім за допомогою функції sscanf(temp,"%s %s %s",kmd,oprd,oprd2) ділимо введений рядок на команду(змінна "kmd") і два операнда(змінні "oprd" і "oprd2").

Потім введена команда порівнюється з усіма можливими, і якщо така команда існує викликається відповідно створена функція. Порівняння здійснюється за допомогою функції strcmp(kmd,"split"). При не вірному введені команди виводиться повідомлення про помилку. Після виконання команди знову проводиться зчитування команди. Далі приводиться лістинг головної програми main(void):

void main(void)

{

char kmd[255],oprd[255],oprd2[255],temp[255],dn[255],tmp[255];

clrscr();

puts("Поздняков Д. 4ОК2. All right reserved ©\n");

strcpy(tmp,getcwd(dn,255));

strcat(tmp,"\\dir2.exe");

while(strcmp(kmd,"exit")!=0) {

strcpy(temp,"");

strcpy(kmd,"");

strcpy(oprd,"");

strcpy(oprd2,"");

printf("%s>",getcwd(dn,255));

gets(temp);

strlwr(temp);

sscanf(temp,"%s %s %s",kmd,oprd,oprd2);

if (strcmp(kmd,"split")==0) split(oprd);

else if (strcmp(kmd,"join")==0) join(oprd,oprd2);

else if (strcmp(kmd,"mem")==0) mem(oprd);

else if (strcmp(kmd,"dir")==0) dir(oprd,tmp);

else if (strcmp(kmd,"cd")==0) chdir(oprd);

else if (strcmp(kmd,"mkdir")==0) mkdir(oprd);

else if (strcmp(kmd,"rmdir")==0) rmdir(oprd);

else if (strcmp(kmd,"clrscr")==0) clrscr();

else if (strcmp(kmd,"disk")==0)setdisk((int)oprd[0]-97);

else if (strcmp(kmd,"help")==0) help();

else if (strcmp(kmd,"exit")==0) ;

else if (strcmp(kmd,"")==0)continue;

else printf("Команда \"%s\" не є стандартною командою\nДля допомоги використовуйте команду \"help\".\nАбо використовуйте параметр \" /?\"\n",kmd);

} }

Лістинг 1 - Реалізація основного циклу програми

Опис підходів та системних функцій покладених у їх основу

Для організації поділу файлу на дві частини використовуємо функцію split(oprd). Параметр oprd - це ім'я файлу, який треба поділити. Нижче наводиться лістинг(з поясненнями) і алгоритм роботи функції:

void split(char oprd[255])

{ char temp[255]; long siz; int ch;

if(strcmp(oprd,"/?")==0){printf("Роздiлити текстовий файл на 2 частини.\nSPLIT\t[ив\'я файлу]\n");return;}

if((in=fopen(oprd,"rb"))==NULL){perror("Помилка при вiдкритi файлy, або він не iснує!\n");return;}

fseek(in,0L,SEEK_END); //встановлення позиції в кінець файлу

siz=ftell(in)/2;//встановлення розміру файлу

rewind(in);//повернення на початок файлу

strcpy(temp,"001-"); //зміна імені файлу

int i=0;

while(i++<2)

{strcat(temp,oprd);

out=fopen(temp,"wb");//відкриття файлу

while(ftell(in)!=siz) //поки положення не дор. половині розміру

{ ch=getc(in); //зчитування символу з файлу

putc(ch, out);}//запис символу в файл

fclose(out);// закриття

strcpy(temp,"002-");//зміна імені файлу

siz*=2; }

fcloseall();// закриття

printf("Файл роздiлено успiшно! Створено файли: \n001-%s\n002-%s\n",oprd,oprd);};//поділ успішний

Лістинг 2 - Реалізація функції split

Рисунок 3 - Алгоритм функції split

Для організації з'єднання двох частин файла використовуємо функцію join(oprd,oprd2). Параметр oprd і oprd2- це імена файлів, які треба з'єднати. Нижче наводиться лістинг(з поясненнями) і алгоритм роботи функції:

void join(char oprd[255],char oprd2[255])

{

int ch;

if(strcmp(oprd,"/?")==0){printf("З\'єднати файли в один.\nJOIN\t[_ив\'я першої частини файлу] [_ив\'я другої частини файлу]\n");return;}

if ((out=fopen(oprd2,"rb"))==NULL||(in=fopen(oprd,"ab"))==NULL)

{ perror("Помилка при вiдкритi _иведе, або вoнu не iснують!");

return; // якщо не має таких файлів - помилка }

while((ch=getc(out))!=EOF) //поки не зчитано все

putc(ch, in); //записати зчитаний символ в файл

fcloseall();//закриття файлів

printf("З\'єднання завершено успiшно\n"); };//виконано успішно

Лістинг 3 - Реалізація функції join

Рисунок 4 - Алгоритм функції join

Для організації виведення вільного місця в оперативній памяті використовуємо функцію mem(oprd). Параметр oprd - для виведення допомоги по команді. Нижче наводиться лістинг(з поясненнями) і алгоритм роботи функції:

void mem(char oprd[255])

{ MEMORYSTATUS stat; //використання структури MEMORYSTATUS

if(strcmp(oprd,"/?")==0){printf("Вивести на екран зайняте мiсце в оперативнiй памятi.\nMEM\t[]\n");return;}//допомога

else if(strcmp(oprd,"")!=0) {puts("Забагатопараметрів");return;}

GlobalMemoryStatus (&stat); // виклик функції статусу памяті

printf("Загальний розмiр оперативної памятi:\t\t%lu kбайт\n", stat.dwTotalPhys/1024); //вивід отриманої інформації з структури MEMORYSTATUS

printf("Кiлькiсть не використаної оперативної памятi:\t%lu kбайт (%lu\%)\n", stat.dwAvailPhys/1024,100-stat.dwMemoryLoad) ;

};

Лістинг 4 - Реалізація функції mem

Рисунок 5 - Алгоритм функції mem

Також моя програма при введенні команди Help виводить на екран коротку справку про всі команди які існують в цій програмі, цю підпрограму можна побачити у лістингу:

void help()

{

printf("\nКоманда\tОпис\n");

printf("SPLIT\tРоздiлити текстовий файл на 2 частини\n");

printf("JOIN\tЗ\'єднати файли в один\n");

printf("MEM\tВивести на екран зайняте мiсце в оперативнiй памятi\n");

printf("DIR\tВивести на екран вмiст каталогу\n");

printf("EXIT\tЗавершення роботи\n");

printf("HELP\tВиведення на екран допомоги\n\n");

};

Лістинг 5 - Реалізація функції help

Для організації виведення вмісту каталогу використовуємо функцію dir(oprd). Параметр oprd - для виведення допомоги по команді. Нижче наводиться лістинг(з поясненнями) і алгоритм роботи функції:

WIN32_FIND_DATA STRUC ; ініціалізація структури

dwFlleAttributes dd ?

ftCreationTime dd 2 DUP(?)

ftLastAccessTime dd 2 DUP(?)

ftLastWritetime dd 2 DUP(?)

NfileSizeHigh dd ?

NfileSizeLow dd ?

dwReserved0 dd 0

dwReserved1 dd 0

cFileName db 78 dup(?),"$"

cAlternateFileName db 14 dup(?)

WIN32_FIND_DATA ends

.model small

.stack 100h

.data

find_ WIN32_FIND_DATA <>

point_find_ dd find_

f_name_pattern db `*.*',0; маска пошуку

point_f_name_pattern dd f_name_pattern

handle dw 0

nw db 10,"$"

rrr db 78 dup(0)

.code

start:

mov ax,@data

mov ds,ax

mov cl, 10h

mov ch, 0h ;атрибути

lds dx, point_f_name_pattern ;вказівник на маску пошуку

les di,point_find_ ;вказівник на структуру де зберігаються атрибути

mov ax, 714eh ;функція пошуку

int 21h

jc exit

;************************************************************

mov handle, ax ;вказівник на файл

prod:

mov dx,offset find_.cFileName ;друк імені файлу

mov ah, 09h

int 21h

;************* очистка змінної з іменем файлу

cld

lea di,find_.cFileName

lea si,rrr

mov cx, 78

rep movsb

mov dx,offset nw

int 21h

;***************** пошук наступного файлу

mov bx, handle

les di,point_find_

mov ax, 714fh

xor si,si

int 21h

jnc prod

;**************** закінчення пошуку і вихід з програми

exit:

mov ax, 71a1h

mov bx, handle

int 21h

mov ax, 4c01h

int 21h

end start

Лістинг 6 - Реалізація функції dir

Рисунок 6 - Алгоритм функції dir

ВИСНОВОК

В цьому курсовому проекті була розроблена програма емуляції роботи командного процесора операційної системи. Ця програма містить точку входу в програму, головний нескінченний інтерактивний цикл очікування дії користувача, модуль аналізу дій користувача, модулі команд. Дана програма виконує такі команди як: ділення файлу навпіл (команда "split"), з'єднання файлів в один (команда "join"), визначення кількості вільного місця в оперативній пам'яті (команда "mem"), виведення вмісту каталогу (команда "dir").

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

І хоча C++ називають "мовою системного програмування", оскільки на ньому зручно писати компілятори і операційні системи, він такий же зручний і для написання великих прикладних програм в самих різних областях застосування.

Під час даної роботи був одержаний цінний досвід по написанню програм на мові програмування С++ і Assembler, також були закріплені знання одержані на заняттях.

ЛІТЕРАТУРА

1. В.В. Подбельский. Язык C: Учебное пособие. - Москва: Финансы и статистика, 1995. 560с.

2. Джесс Либерти .Освой Самостоятельно C за 21 день.

3. Джесс Либерти .C++ Энциклопедия Пользователя .

4. Стенли Б. Липпман. C++ для начинающих: Пер. с англ. 2тт. - Москва: Унитех; Рязань: Гэлион, 1992, 304-345сс.

5. Язык С++ в cистеме UNIX .Богатырев, 1996

6. Мюррэй Хилл & Нью Джерси .Язык C++


Подобные документы

  • Значення операційної системи - програми, яка завантажується при включенні комп'ютера. Компоненти Windows, передача параметрів у мові С++. Системні ресурси та принципи їх роботи. Розробка алгоритму програми емуляції роботи командного процесора ОС.

    курсовая работа [37,5 K], добавлен 18.06.2010

  • Історія розвитку, особливості та принципи роботи операційної системи WINDOWS XP. Настройка панелі завдань та параметрів екрана операційної системи. Установка дати, часу, мови і регіональних стандартів. Організація робочих місць користувачів комп'ютерів.

    курсовая работа [5,5 M], добавлен 24.09.2011

  • Методи отримання довідки щодо використання команди операційної системи. Варіанти перенесення операційної системи на новий диск. Методи зміни атрибутів файлу за допомогою команд операційної системи. Сутність фрагментації файлів і способів їх усуннення.

    контрольная работа [17,3 K], добавлен 19.07.2010

  • Складові частини операційної системи та їх призначення. Вказівки для роботи з каталогами. Команди MS DOS для роботи з файлами. Текстовий редактор MS-DOS Editor. Перенаправлення операцій вводу-виводу. Створення командних файлів та інсталяційних пакетів.

    лабораторная работа [16,2 K], добавлен 11.05.2009

  • Використання операційної системи для ефективного використання комп'ютерних ресурсів та для створення умов для ефективної роботи користувача. Історія створення середовища Windows. Коротка характеристика різних конфігурацій операційної системи Windows.

    реферат [25,9 K], добавлен 07.01.2010

  • Розробка програми-інтерпретатора функцій командного процесора DOS: TIME, DATE, DIR, CD, MD, RD на мові Асемблера. Функціональні модулі, процедури та макроси, які використовуються в програмі. Опис алгоритму розв’язання задачі, його програмна реалізація.

    курсовая работа [42,6 K], добавлен 26.04.2016

  • Основні команди операційної системи Linux. Інтерфейс та робота в режимі командного рядка. Системи управління програмою на основі меню. Посилання в текстовому режимі. Список файлів і каталогів, зупинених і фонових завдань. Права доступу до файлів.

    лабораторная работа [196,8 K], добавлен 02.06.2011

  • Дослідження логічних схем, їх побудови і емуляції роботи в різних програмних засобах, призначених для цього. Electronics Workbench 5 – розробка фірми Interactive Image Technologies, її можливості. Рівні бази Multisim. Ключові особливості Proteus.

    курсовая работа [2,0 M], добавлен 23.08.2014

  • Операційна система MicroDSP-RTOS, їх загальна характеристика та призначення, оцінка можливостей і інструментарій. Управління завданнями в даній операційній системі, синхронізація та взаємодія задач. Підтримка MicroDSP-RTOS в MetaDSP різними програмами.

    контрольная работа [832,8 K], добавлен 21.05.2010

  • Багатозадачна операційна система Linux. Поняття операційної системи і дистрибутиву. Команди операційної системи та файлова система Linux. Розгляд структури каталогів та основні команди. Інформація про поточний каталог, створення, зміна та знищення.

    реферат [20,0 K], добавлен 15.03.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.