
Сегментація пам'яті
Для представлення значення адреси використовується 20 біт
220 = 1048576 доступ до 1 Мбайт пам'яті
Незалежно від того, скільки пам'яті може адресувати процесор або скільки мікросхем пам'яті встановлено в комп'ютері, найменшим блоком пам'яті є 8-бітовий байт.
Кожен байт має своє унікальне місцеположення, зване фізичною адресою, по якій програми можуть читати і записувати інформацію.
Якщо в комп'ютері 64Кбайт пам'яті, то для завдання адреси достатнє 16 біт -
216 -1 = 65535 доступ до 64 Кбайт пам'яті
У процесорах 8086 використовує 16 регістрів для адресації пам'яті.
-Яким чином процесор 8086 може мати доступ до всього мегабайта пам'яті?
Використовується метод сегментації пам'яті - розділення великого адресного простору пам'яті на логічних 64 Кбайт фрагменти.
Адреса конкретного байта може бути виражений двома значеннями (логічною адресою):
адреса фрагмента (сегменту) + 16-бітовий зсув від початку сегменту
|
|
|
|
|
16-бітовий сегментний регістр
|
Сегментне значення указує на ту область адреси, яка кратна 16, тобто адреса закінчується 0000. Ці адреси називаються межами параграфа (сегментними параграфами) |
0 0 0 0 фіктивні біти
|
||
|
|
|
|
|
|
16-бітовий регістр зсуву
|
Зсув щодо межі параграфа |
||
|
|
|
|
|
В результаті отримаємо |
|
|
|
|
20-битова адреса
|
Адреса виходить таким чином:
Вміст сегментного регістра доповнюється чотирма фіктивними нулями (зрушення вліво на чотири розряди) і складається з регістром зсуву. В результаті виходить 20-бітова адреса, яка може адресувати до 1 Мбайта пам'яті.
220 = 1048576 доступ до 1 Мбайт пам'яті
Як регістри зсуви можуть бути використані AX, BX, SI, DI.
Параграфи, сегменти і зсуви
Для визначення початку сегментів пам'яті процесора 8086 використовуються чотири 16-бітові сегментні регістри.
Межі сегментів розташовуються через кожних 16 байт фізичних адрес.
Кожен з цих 16-байтових фрагментів називається параграфом.
На малюнку показано, що кожна точка пам'яті має фізичну адресу і логічний, виражений через зсув від початку сегменту.
Нижня пам'ять |
||||
Логічні адреси |
|
Фізичні адреси |
||
0 1 2 3 |
|
Сегмент |
|
0 1 2 3 |
0 1 2 3 |
|
Сегмент |
|
4 5 6 7 |
0 1 2 3 |
|
Сегмент |
|
8 9 10 11 |
0 1 2 3 |
|
Сегмент |
|
12 13 14 15 |
Верхня пам'ять
|
1048576 : 16 = 65536 - максимальна кількість параграфів для 1 Мбайта
Сегменти фізично не виділені в пам'яті. Сегмент - це логічні вікна, через які програми проглядають області пам'яті по 64 Кбайт.
Початкове положення сегменту (логічна адреса) визначається програмістом і може мати будь-яке значення від 0000 до FFFF в шістнадцятковому уявленні. Кожне логічне значення сегменту (0, 1, 2 . . ., 65535) відповідає фізичній межі параграфа (0, 16, 32..., 1048560).
Розміри сегментів можуть змінюватися від 16 байт до 64 Кбайт.
Сегменти не обов'язково розташовуються фізично в пам'яті один за іншим.
Сегменти можуть перекриватися один іншим, тому один і той же байт пам'яті може мати різні логічні адреси. Але, не дивлячись на це, кожен байт має тільки єдину 20-бітову фізичну адресу.
Приклад
Логічна адреса задана парою сегмент-зсув:
а) перша логічна адреса 0000:0010
б) друга логічна адреса 0001:0000
а) фізична адреса (0000 х 16) + 16 =16
б) фізична адреса (0001 х 16) + 0 = 16
Пара сегмент і зсув зазвичай записуються через двокрапку шістнадцятковими числами: 40A7 : 55FC
Запис якого-небудь числа в сегментний регістр (наприклад, 1000h) означає:
заданий сегмент розміром в 64 Кбайт (адреси з 1000 : 0000 до 1000 : FFFF).
Звернення до пам'яті завжди відбувається за допомогою пари регістрів.
Запис [ BX ] означає DS : [ BX ]
Увага
Сегментні регістри змінювати безпосередньо не можна.
Для зміни їх спочатку копіюють в регістри загального призначення, змінюють там, і значення, що вийшло, копіюється в сегментний регістр.