Автор: Пользователь скрыл имя, 20 Ноября 2012 в 22:41, курсовая работа
Сучасні відкриті операційні системи, такі як Linux або OPENBSD походять від операційної системи UNIX, що з’явилася на початку 1970-х років і зробила величезний вплив на практичні реалізації операційних систем і розвиток всієї області інформаційних технологій. Тому вивчення будь-якою з сучасних UNIX-подібних операційних систем неможливо без розгляду основних ідей, закладених в оригінальний UNIX.
Відповідно до синтаксису мови С++ визначення функції має наступну форму:
[специфікатор-класа-пам’яті] [специфікатор-типа] функції імені;
([список-формальних-
{ функції тіла };
Список-формальних-параметрів – це послідовність оголошень формальних параметрів, розділена комами. Формальні параметри – це змінні, використовувані всередині тіла функції і значення, які одержуються при виклику функції шляхом копіювання в них значень відповідних фактичних параметрів. Список-формальних-параметрів може закінчуватися комою (,) або комою з трьома крапками (,…), це означає, що число аргументів функції змінно. Проте передбачається, що функція має, принаймні, стільки обов’язкових аргументів, скільки формальних параметрів задано перед останньою комою в списку параметрів. Такої функції може бути передано більше число аргументів, але над додатковими аргументами не проводиться контроль типів.
Якщо функція не використовує параметрів, то наявність круглих дужок обов’язково, а замість списку параметрів рекомендується вказати слово 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 символів, включаючи символи для національних алфавітів.
Информация о работе Програма емуляції роботи командного процесора операційної системи