ТА_Методички / Lec_6
.pdf
Лекція 6
МОДЕЛІ ПАМ'ЯТІ BORLAND C. КОРОТКІ Й ДОВГІ ВКАЗІВНИКИ
Принцип сегментної адресації оперативної пам'яті;
Шість моделей розподілу оперативної пам'яті для коду та даних С-
програм: Tiny, Small, Medium, Compact, Large, Huge;
Короткі та довгі вказівники; модифікатори вказівників: near, far, huge;
Спеціальні короткі вказівники: _cs, _ds, _ss, _es;
Безпосереднє звертання до відеопам'яті у текстових режимах відображення інформації;
Функції бібліотеки Borland C для звертання до внутрішньої та зовнішньої динамічної пам'яті.
Ефективність безпосереднього звертання до даних в оперативній пам'яті пов'язана з урахуванням особливостей апаратно-програмної організації конкретних операційних середовищ. Матеріал даної лекції не належить до стандартних засобів мови С.
Моделі пам'яті, короткі та довгі вказівники, додаткові функції для роботи з динамічною пам'яттю - все це розширення стандарту С, реалізовані в системі програмування Borland C.
За допомогою цих засобів програміст може керувати розподілом ресурсів оперативної пам'яті та встановлювати способи адресації, які забезпечують швидкий доступ до об'єктів програми.
2/37
1. Сегментна організація пам'яті
Операційна система MS DOS, апаратна платформа якої базується на архітектурі мікропроцесорів Intel 8086/8088, використовує сегментну адресацію оперативної пам'яті. Пояснимо коротко її суть. Адреса кожного байта пам'яті зберігається у формі двох складових частин: сегмента адреси (segment) і
зміщення адреси (offset).
Обидві складові є 16-розрядними беззнаковими цілими числами. Коли відбувається звертання до даних у пам'яті, з цих двох складових частин формується єдина 20-розрядна фізична адреса. Формування фізичної адреси здійснюється за такою схемою:
1)значення сегмента розширюється до 20 біт і зсувається вліво на 4 розряди; біти, що звільнилися справа, заповнюються нулями;
2)до отриманої 20-розрядної сегментної адреси додається значення зміщення; якщо виникає переповнення, то його ігнорують.
Повна |
фізична адреса є 20-розрядною, що дає змогу |
адресувати |
220 = 1 Мбайт |
оперативної пам'яті. Цю пам'ять використовує в |
звичайному |
режимі роботи (real тоde) операційна система MS DOS.
3/37
У письмових позначеннях адреси сегмент і зміщення прийнято розділяти двокрапкою – segmen:оffset. Якщо вказуються константні значення складових адреси, то записують у шістнадцятковій формі з літерою h у кінці (від heximal - шістнадцятковий, наприклад: 2C60:OOA5h.
Одну і ту ж фізичну адресу можна отримати з різних значень segmentoffset. Три наступні пари: 0DD0:0008h, 0D00:0D08h і 0320:AB08h адресують один і той самий байт оперативної пам'яті, фізична адреса якого - 0DD08h.
Сегментну компоненту адреси називають також номером параграфа чи просто параграфом адреси, а в мікропроцесорах Intel 8086/8088 параграфом позначають межу пам’яті, кратну 16. Оскільки при формуванні фізичної адреси сегмент зсувається вліво на 4 розряди, то для довільного значення segmenf.0000h відповідна фізична адреса буде містити нулі в останній тетраді, тобто буде кратною 16.
До сегмента додається зміщення, яке є 16-розрядним словом, тому в межах одного сегмента можна адресувати 216 = 65566 - 64 Кбайт оперативної пам'яті.
4/37
Для розташування ехе-коду С-програми та даних, які вона опрацьовує, виділяються окремі сегменти оперативної пам'яті. Кожен сегмент починається з адреси, кратної 16, і має обсяг, що не перевищує 64 Кбайт. Повну фізичну адресу даних і кодів команд програми мікропроцесор формує зі значення сегментної компоненти та значення зміщення.
Для збереження сегментних компонентів адрес використовують чотири системних регістри мікропроцесора, які називають сегментними: CS, DS, SS і ЕS. Призначення їх таке:
•регістр CS (code segment - сегмент коду) задає сегментну частину адрес команд програми; область, яку він адресує, називається сегментом коду програми;
•регістр DS (data segment - сегмент даних) задає сегментну частину адрес глобальних і статичних змінних програми; область, яку він адресує, називається сегментом даних;
•регістр SS (stack segment - сегмент стека) разом з регістром SP (SS, SР) задає адрес область пам'яті, яка називається програмним стеком і використовується для збереження локальних даних функцій. Переважно заповнення стека виконується від його вершини (найбільшої адреси) вниз,
5/37
тому значення SP зменшується після кожного запису даних у стек. Коли ж поточна функція завершує роботу, область її даних звільняється, а значення SP збільшується на відповідну величину;
•регістр ES (extra segment - додатковий сегментний регістр) використовують, коли потрібно окремо задавати сегментну частину адреси даних (це називають переадресацією сегмента), а також для швидкого звертання до оперативної пам'яті, наприклад у разі копіювання даних з однієї ділянки пам'яті в іншу
Якщо всі глобальні та статичні дані програми можна розмістити в одному сегменті, а всі команди вміщаються в один сегмент коду, то в процесі виконання такої програми значення сегментних регістрів не змінюються, а для адресації даних і команд достатньо зберігати тільки зміщення адрес.
Такий розподіл оперативної пам'яті забезпечує компактність команд і високу швидкодію їх виконання. Проте обсяг сегмента обмежений значенням 64 Кбайт, тому для задач з великими обсягами даних і/або об'ємними кодами програм потрібні багатосегментні моделі пам'яті.
6/37
2. Моделі розподілу пам'яті
Середовище Borland C дає користувачеві змогу встановити модель розподілу пам'яті, яка найкраще відповідає обсягам даних і коду програми та забезпечує найбільш раціональні форми адресації даних і команд. Тим самим підтримується висока ефективність процесу виконання програми.
Модель пам'яті є одним із параметрів компіляції, які керують виділенням ресурсів для етапу реалізації програми. Вибір моделі пам'яті здійснюють через пункт головного меню інтегрованого середовища Options/Compiler/Code generation/Model.
Можна вибрати один з шести альтернативних варіантів: Tiny, Small, Medium, Compact, Large і Huge.
Модель пам'яті задає розподіл сегментних блоків оперативної пам'яті для коду і даних програми, а також визначає тип вказівників, обсяг стека програми та вид динамічної пам'яті. Основні характеристики всіх моделей пам'яті зведено в Табл. 1, де вказано, яким є розподіл оперативної пам'яті для коду програми (код), глобальних і статичних даних (дані), локальних даних (стек).
Також зазначено вид динамічної пам'яті (ДП), яку можна використовувати в програмі, та типи вказівників, що будуть встановлені за замовчуванням.
7/37
Таблиця 1 Характеристики моделей пам'яті Borland C
Найменування моделі
Tiny |
мінімальна |
молодші |
|
Small |
мала |
||
|
|||
|
|
|
|
Medium |
середня |
|
|
|
|
||
|
|
|
|
Compact |
компактна |
старші |
|
|
|
||
Large |
велика |
||
|
|||
|
|
|
|
Huge |
гігантська |
|
|
|
|
|
|
|
|
|
Тип |
|
Розподіл оперативної пам'яті |
вказівни- |
||||
|
|
|
|
|
ків |
код |
дані |
стек |
ДП |
дані |
функції |
один спільний сегмент |
внутрішня |
near |
near |
||
1 сегмент |
один спільний |
внутр./зовн. |
near |
near |
|
|
сегмент |
|
|
|
|
сегм./файл |
один спільний |
внутр./зовн. |
near |
far |
|
|
сегмент |
|
|
|
|
1 сегмент |
1 сегмент |
1 |
зовнішня |
far |
near |
|
|
сегмент |
|
|
|
сегм./файл |
1 сегмент |
1 |
зовнішня |
far |
far |
|
|
сегмент |
|
|
|
сегм./файл |
сегм./файл |
1 |
зовнішня |
far |
far |
|
|
сегмент |
|
|
|
Найменша модель пам'яті Tiny має обмежене застосування, оскільки для коду програми та всіх її даних, включаючи динамічні, виділяється тільки один сегмент оперативної пам'яті.
8/37
Для невеликих за обсягом програм найчастіше використовують модель Small, яка передбачає виділення окремого сегмента для коду програми, другого сегмента для збереження глобальних і локальних даних програми (рис. 1).
Ця модель дає змогу програмувати два види динамічної пам'яті: внутрішню (її ще називають ближньою), яка використовує незайняту частину сегмента даних, та зовнішню динамічну пам'ять (її називають дальньою), яка займає вільну частину оперативної пам'яті в межах початкових 640 Кбайт.
Модель Medium подібна до Small за розподілом пам'яті для даних, але вона розрахована на багатофайлові програми великого обсягу, тому для коду кожного програмного файлу виділяється окремий сегмент.
Три згадані моделі пам'яті називають молодшими.
9/37
SS:FFFF
SS:SP
DS:0000
CS:0000
Зовнішня ДП
(поточна межа ДП)
Динамічні дані
Локальні дані (стек)
(поточна межа стека)
Внутрішня ДП
Глобальні і статичні дані
Команди коду програми, коди бібліотечних функцій
Вільна оперативна пам'ять MS DOS
Сегмент даних
(<64К)
Сегмент коду
(< 64 К)
Рис. 1. Схема розподілу оперативної пам'яті в моделі Small
10/37
