7315

Керування пам’яттю в ОС. Простий безперервний розподіл і розподіл з перекриттям. Розподіл пам’яті статичними й динамічними розділами

Лекция

Информатика, кибернетика и программирование

Тема: Керування памяттю в ОС. Простий безперервний розподіл і розподіл з перекриттям. Розподіл памяті статичними й динамічними розділами План Основна память. Вимоги до адрес, використовуваних у програмах...

Украинкский

2013-01-20

121.5 KB

22 чел.

Тема: Керування пам’яттю в ОС. Простий безперервний розподіл і розподіл з перекриттям. Розподіл пам’яті статичними й динамічними розділами

План

  1.  Основна пам’ять.

 1.1  Вимоги до адрес, використовуваних у програмах.

  1.  Поняття віртуальної пам’яті.

    2.1 Проблеми реалізації віртуальної пам'яті. Фрагментація пам'яті.

    2.2 Логічна і фізична адресація пам'яті.

     3.   Простий безперервний розподіл і розподіл з перекриттям.

   3.1 Оверлейні структури.

4.   Розподіл пам'яті статичними й динамічними розділами.

    4.1 Розділи з фіксованими границями.

    4.2 Розділи з рухливими границями.

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

Різні види пам'яті організовані в ієрархію. На нижніх рівнях такої ієрархії перебуває дешевша і повільніша пам'ять більшого обсягу, а в міру просування ієрархією нагору пам'ять стає дорожчою і швидшою (а її обсяг стає меншим). Найдешевшим і найповільнішим запам'ятовувальним пристроєм є жорсткий диск комп'ютера. Його називають також допоміжним запам'ятовувальним пристроєм (secondary storage). Швидшою й дорожчою є оперативна пам'ять, що зберігається в мікросхемах пам’яті, встановлених на комп'ютері, - таку пам'ять називатимемо основною пам’яттю (main memory). Ще швидшими засобами зберігання даних є різні кеші процесора, а обсяг цих кешів ще обмеженіший.

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

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

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

До адрес, використовуваних у програмах, ставляться такі вимоги.

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

Поняття віртуальної пам'яті

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

Завдяки віртуальній пам'яті фізична пам'ять адресного простору процесу може бути фрагментованою, оскільки основний обсяг пам'яті, яку займає процес, більшу частину часу залишається вільним. Є так зване правило «дев'яносто до десяти», або правило локалізації, яке стверджує, що 90 % звертань до пам'яті у процесі припадає на 10 % його адресного простору. Адреси можна переміщати так, щоб основній пам'яті відповідали тільки ті розділи адресного простору процесу, які справді використовуються у конкретний момент.

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

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

Проблеми реалізації віртуальної пам'яті. Фрагментація пам'яті

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

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

Зовнішня зводиться до того, що внаслідок виділення і наступного звільнення пам'яті в ній утворюються вільні блоки малого розміру — діри (holes). Через це може виникнути ситуація, за якої неможливо виділити неперервний блок пам'яті розміру N, оскільки немає жодного неперервного вільного блоку, розмір якого S > N, хоча загалом обсяг вільного простору пам'яті перевищує N.

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

Логічна і фізична адресація пам'яті

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

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

Фізична адреса — адреса, якою оперує мікросхема пам'яті. Прикладна програма в сучасних комп'ютерах ніколи не має справи з фізичними адресами. Спеціальний апаратний пристрій MMU (memory management unit - пристрій керування пам'яттю) відповідає за перетворення логічних адрес у фізичні. Сукупність усіх доступних фізичних адрес становить фізичний адресний простір. Отже, якщо в комп'ютері є мікросхеми на 128 Мбайт пам'яті, то саме такий обсяг пам'яті адресують фізично. Логічно зазвичай адресують значно більше пам'яті.

Простий безперервний розподіл і розподіл з перекриттям

Загальні принципи керування пам'яттю в однопрограмних операційних системах

Простий безперервний розподіл - це найпростіша  схема, відповідно до якої вся пам'ять умовно може бути розділена на три області:

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

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

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

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

Якщо виникає  необхідність створити програму, логічний адресний простір якої повинне бути більше, ніж вільна область пам'яті, або навіть більше, ніж весь можливий обсяг оперативної пам'яті, то використається розподіл з перекриттям - так звані оверлейні  структури (від overlay - перекриття, розташування поверх чогось). Цей метод розподілу припускає, що вся програма може бути розбита на частині - сегменти. Кожна оверлейна програма має одна головну (maіn) частина й кілька сегментів (segments), причому в пам'яті машини одночасно можуть перебувати тільки її головна частина й один або декілька сегментів, що не перекриваються.

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

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

Розподіл пам'яті статичними й динамічними розділами

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

Методи нерозривного розподілу пам'яті. 

Найпростіша  схема розподілу пам'яті між декількома завданнями припускає, що пам'ять, не зайнята ядром операційної системи, може бути розбита па кілька безперервних частин - розділів (partіtіons, regіons). Розділи характеризуються ім'ям, типом, границями (як правило, вказуються, початок розділу і його довжина). Розбивка пам'яті на декілька безперервних (нерозривних) розділів може бути фіксованим (статичним) або динамічним (тобто  процес виділення нового розділу пам'яті відбувається безпосередньо з появою нового завдання). Спочатку розглянемо статичний розподіл пам'яті на розділи.

Розділи з фіксованими границями

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

Рис. 1. Розподіл пам'яті розділами з фіксованими границями

Приклад розподілу пам'яті на кілька розділів наведений на рис. 1. У кожному розділі в кожний момент часу може розташовуватися по одній програмі (завданню). У цьому випадку стосовно   кожного розділу можна застосувати всі ті методи створення програм, які використаються для однопрограмних систем. Можливе використання оверлейних структур, що дозволяє створювати більші складні програми й у той же час підтримувати коефіцієнт мультипрограмування (Під коефіцієнтом мультипрограмування (t) розуміють кількість паралельно виконуваних програм. Звичайно на практиці для завантаження центрального процесора до рівня 90 % необхідно, щоб коефіцієнт мультипрограмування був не менш 4-5. А для того щоб найбільше повно використати й інші ресурси системи, бажано мати t на рівні 10-15.) на належному рівні. Перші мультипрограмні операційні системи будувалися за цією схемою. Використалася ця схема й через багато років при створенні недорогих обчислювальних систем, оскільки є нескладною й забезпечує можливість паралельного виконання програм. Іноді в деякому розділі розміщалося по декілька  невеликих програм, які постійно в ньому й перебували. Такі програми називалися ОЗУ - резидентними (або просто резидентними).

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

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

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

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

  •  виділяти розділ рівно такого обсягу, що потрібний під поточне завдання;
  •  розміщати завдання не в одній безперервній області пам'яті, а в декількох областях.

Друге рішення було реалізовано в декількох способах організації віртуальної пам'яті.

Розділи з рухливими границями

Щоб позбутися від фрагментації, можна спробувати розміщати в оперативній пам'яті завдання щільно, одну за інший, виділяючи рівно стільки пам'яті, скільки завдання вимагає. Однієї з перших операційних систем, у якій був реалізований такий спосіб розподілу пам'яті, була OS MVT (Multіprogrammіng wіth a Varіable number of Tasks - мультипрограмування зі змінним числом завдань). У цій операційній системі спеціальний планувальник (диспетчер пам'яті) веде список адрес вільної оперативної пам'яті. З появою нового завдання диспетчер пам'яті переглядає цей список і виділяє для завдання розділ, обсяг якої або дорівнює необхідному, або ледве більше, якщо пам'ять виділяється не осередками, а якимись дискретними одиницями. При цьому модифікується список вільних областей пам'яті. При звільненні розділів диспетчер пам'яті намагається об'єднати розділи, що звільнилися з однією з вільних ділянок, якщо така є суміжної.

При цьому список вільних ділянок пам'яті може бути впорядкований або по адресах, або по обсязі. Виділення пам'яті під новий розділ може здійснюватися одним із трьох основних способів:

1. перша підходяща ділянка;

2. сама підходяща ділянка;

3. сама невідповідна ділянка.

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

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

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

Література:

Шеховцов В.А. Операційні системи. – К.: Видавнича група BHV, 2005. – 576 с. [5],183-188

Гордеев А.В. Операционные системы: Учебник для вузов. - 2-е изд. – СПб.: Питер, 2004. – 416 с.  [1],72-86

Контрольні питання:

  1.  В чом полягає суть простого безперервного розподілу і розподілу з перекриттям?
  2.  Що дає використання оверлеїв при розробки DOS додатків?
  3.  Охарактеризуйте методи нерозривного розподілу пам'яті?
  4.  Що таке фрагментація пам’яті?
  5.  Що таке ущільнення пам’яті? Коли воно використовується?


 

А также другие работы, которые могут Вас заинтересовать

15279. Команди і директиви мови Асемблер 122.5 KB
  Лабораторна робота № 4 Тема: Команди і директиви мови Асемблер. Мета роботи: Набути навичок застосування асемблерних команд передачі інформації. Засвоїти способи адресування операндів вказаних груп команд та алгоритми їх виконання.
15280. Застосування асемблерних команд з реалізації арифметичних, логічних операцій і операцій зсуву 156 KB
  Лабораторна робота № 5 Тема: Команди і директиви мови Асемблер. Мета роботи: Набути навичок застосування асемблерних команд з реалізації арифметичних логічних операцій і операцій зсуву. Засвоїти способи адресування операндів вказаних гру
15281. Застосування асемблерних команд передачі управління. Алгоритми їх виконання 110.5 KB
  Лабораторна робота № 6 Тема: Команди і директиви мови Асемблер. Мета роботи: Набути навичок застосування асемблерних команд передачі управління. Засвоїти алгоритми їх виконання. Короткі теорет
15282. Алгоритми функціонування ланцюгових команд та способи формування адреси операнда-джерела і адреси операнда-призначення 145.5 KB
  Лабораторна робота № 7 8 Тема: Команди і директиви мови Асемблер. Мета роботи: Засвоїти алгоритми функціонування ланцюгових команд та способи формування адреси операндаджерела і адреси операндапризначення за якими розташовуються ланцюго
15283. Технологія та прийоми програмування мовою Асемблер 142 KB
  Лабораторна робота № 9 Тема: Технологія та прийоми програмування мовою Асемблер. Мета роботи: Набути навичок роботи з масивами при програмуванні мовою Асемблера. Навчитися описувати одновимірні масиви в програмі; ініціювати масив; орган...
15284. Налагодження програми мовою Асемблер з оброблення двовимірних масивів 149 KB
  Налагодження програми мовою Асемблер з оброблення двовимірних масивів Лабораторна робота № 10 Тема: Технологія та прийоми програмування мовою Асемблер. Мета роботи: Набути навичок роботи з масивами при програмуванні мовою Асемблера.
15285. Налагодження програми мовою Асемблер з використанням циклів та розгалужень 102.5 KB
  Налагодження програми мовою Асемблер з використанням циклів та розгалужень Тема: Технологія та прийоми програмування мовою Асемблер. Мета роботи: набути навичок з реалізації задач мовою Асемблер що містять цикли та розгалуження. Ко...
15286. Налагодження програми мовою Асемблер з використанням арифметичних операцій 76.5 KB
  Налагодження програми мовою Асемблер з використанням арифметичних операцій Лабораторна робота № 13 Тема: Технологія та прийоми програмування мовою асемблера. Мета роботи: Набути навичок з реалізації математичних задач мовою асемблера....
15287. Налагодження програми мовою Асемблер з використанням логічних операцій 76 KB
  Налагодження програми мовою Асемблер з використанням логічних операцій Лабораторна робота № 14 Тема: Технологія та прийоми програмування мовою Асемблера. Мета роботи: Набути навичок застосування логічних команд при програмуванні мов...