Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lec_12_pres.doc
Скачиваний:
3
Добавлен:
05.12.2018
Размер:
246.27 Кб
Скачать

Лекція 12 моделі пам'яті borland c. Короткі й довгі вказівники

  • Принцип сегментної адресації оперативної пам'яті;

  • Шість моделей розподілу оперативної пам'яті для коду та даних С-програм: Tiny, Small, Medium, Compact, Large, Huge;

  • Короткі та довгі вказівники; модифікатори вказівників: near, far, huge;

  • Спеціальні короткі вказівники: _cs, _ds, _ss, _es;

  • Безпосереднє звертання до відеопам'яті у текстових режимах відображення інформації;

  • Функції бібліотеки Borland C для звертання до внутрішньої та зовнішньої динамічної пам'яті.

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

Моделі пам'яті, короткі та довгі вказівники, додаткові функції для роботи з динамічною пам'яттю - все це розширення стандарту С, реалізовані в системі програмування Borland C.

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

1. Сегментна організація пам'яті

Операційна система MS DOS, апаратна платформа якої базується на архітектурі мікропроцесорів Intel 8086/8088, використовує сегментну адресацію оперативної пам'яті. Пояснимо коротко її суть. Адреса кожного байта пам'яті зберігається у формі двох складових частин: сегмента адреси (segment) і зміщення адреси (offset).

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

  1. значення сегмента розширюється до 20 біт і зсувається вліво на 4 розряди; біти, що звільнилися справа, заповнюються нулями;

  1. до отриманої 20-розрядної сегментної адреси додається значення зміщення; якщо виникає переповнення, то його ігнорують.

Повна фізична адреса є 20-розрядною, що дає змогу адресувати 220 = 1 Мбайт оперативної пам'яті. Цю пам'ять використовує в звичайному режимі роботи (real тоde) операційна система MS DOS.

У письмових позначеннях адреси сегмент і зміщення прийнято розділяти двокрапкою – segmenffset. Якщо вказуються константні значення складових адреси, то записують у шістнадцятковій формі з літерою h у кінці (від heximal - шістнадцятковий, наприклад: 2C60:OOA5h.

Одну і ту ж фізичну адресу можна отримати з різних значень segment- offset. Три наступні пари: 0DD0:0008h, 0D00:0D08h і 0320:AB08h адресують один і той самий байт оперативної пам'яті, фізична адреса якого - 0DD08h.

Сегментну компоненту адреси називають також номером параграфа чи просто параграфом адреси, а в мікропроцесорах Intel 8086/8088 параграфом позначають межу пам’яті, кратну 16. Оскільки при формуванні фізичної адреси сегмент зсувається вліво на 4 розряди, то для довільного значення segmenf.0000h відповідна фізична адреса буде містити нулі в останній тетраді, тобто буде кратною 16.

До сегмента додається зміщення, яке є 16-розрядним словом, тому в межах одного сегмента можна адресувати 216 = 65566 - 64 Кбайт оперативної пам'яті.

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

Для збереження сегментних компонентів адрес використовують чотири системних регістри мікропроцесора, які називають сегментними: CS, DS, SS і ЕS. Призначення їх таке:

  • регістр CS (code segment - сегмент коду) задає сегментну частину адрес команд програми; область, яку він адресує, називається сегментом коду програми;

  • регістр DS (data segment - сегмент даних) задає сегментну частину адрес глобальних і статичних змінних програми; область, яку він адресує, називається сегментом даних;

  • регістр SS (stack segment - сегмент стека) разом з регістром SP (SS, SР) задає адрес область пам'яті, яка називається програмним стеком і використовується для збереження локальних даних функцій. Переважно заповнення стека виконується від його вершини (найбільшої адреси) вниз, тому значення SP зменшується після кожного запису даних у стек. Коли ж поточна функція завершує роботу, область її даних звільняється, а значення SP збільшується на відповідну величину;

  • регістр ES (extra segment - додатковий сегментний регістр) використовують, коли потрібно окремо задавати сегментну частину адреси даних (це називають переадресацією сегмента), а також для швидкого звертання до оперативної пам'яті, наприклад у разі копіювання даних з однієї ділянки пам'яті в іншу

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]