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


ВСТУП

 

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

З часом з’явились такі мови високого рівня як BASIC та COBOL. Завдяки цим  мовам з’явилась можливість програмувати, використовуючи логічні конструкції  зі слів та речень, наприклад  Let I = 100. Ці команди перекладались на машинну мову інтерпретаторами та компіляторами.

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

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

C++ є мовою програмування загального призначення. Він завжди знаходився в найтіснішому зв'язку з операційною системою Unix, в якій і для якої він і розроблявся, оскільки як сама система, так і більшість працюючих в ній програм написані саме на C++. Проте сама мова не прив'язана жорстко до однієї певної системи або апаратної платформи. І хоча С++ називають “мовою системного програмування”, оскільки на ньому зручно писати компілятори і операційні системи, він такий же зручний і для написання великих прикладних програм в самих різних областях застосування. Мова С++ пропонує широкий асортимент типів. Фундаментальні типи включають символьний, а також цілий і речовинний (з плаваючою крапкою) декількох різних розмірів. Крім того, існує ціла ієрархія похідних типів даних, що створюються за допомогою покажчиків, масивів, структур і об'єднань. З операндів і знаків операцій формуються вирази; будь-який вираз, зокрема привласнення і виклик функції, може бути оператором. Завдяки покажчикам підтримується механізм незалежної адресної арифметики. У мові С++ є всі основні керівники конструкції, необхідні для написання добре структурованої програми: угрупування операторів в блоки, ухвалення рішення по умові (if-else), вибір одного з декількох можливих варіантів (switch), цикли з перевіркою умови завершення на початку (while, for) і в кінці (do), а також примусовий вихід з циклу (break). Функції можуть повертати значення простих типів, структури, об'єднання або покажчики. Будь-яку функцію можна викликати рекурсивно. Локальні змінні функції звичайно є “автоматичними”, тобто створюються при кожному її виклику. Визначення (тіла) функцій не можна вкладати один в одного, проте змінні можна оголошувати в блоково-структурованому стилі. Функції програми на С++ можуть знаходитися в окремих файлах початкового коду, компільованих також окремо. Змінні можуть бути внутрішніми по відношенню до функції, зовнішніми і при цьому видимими тільки в одному файлі коду чи ж видимими у всьому просторі програми. На етапі препроцесорної обробки в тексті програми виконуються макропідстановки, включення додаткових файлів початкового коду і умовна компіляція.

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

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

Сучасні відкриті операційні системи, такі як 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 – виведення на  екран зайняте (вільне) місце пам’яті;

dir – виведення на екран вміст поточного каталогу;

path – вказує поточне місце знаходження програми.

Крім вищезазначених команд дана програма містить ще дві  команди, а саме help та exit. За допомогою цих команд можна отримати довідку про саму програму або за допомогою команди exit коректно завершити свою роботу. Якщо в даному циклі не буде передбачений вихід за допомогою команди exit, то з нього буде можливо вийти лише аварійно.

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

 

 

 

 

 

 

 

 

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.

Оператор return

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

return (вираз);

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

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

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

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

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

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