1.1. Сегменти і адресація
Структура пам'яті ОС на базі процесора і8086 складається з адресного простору пам'яті (до 1 Мбайта) та адресного простору портів вводу-виводу (до 64 Кбайт). Мінімально адресуємою частиною пам'яті є байт. Адресою слова вважається адреса його молодшого байта.
Є дві основні схеми адресації.
Абсолютна адреса, наприклад, 04А26Н, що представляє собою 20-розрядне двійкове число, прямо вказує на певну комірку пам'яті.
Адреса в системі сегмент : зміщення, що складається з початкової адреси сегменту і значення зміщення.
Сегменти – це спеціальні області, визначувані в програмі для зберігання коду, даних і так званого стека. Сегмент починається на межі параграфа, тобто на адресі, що без остачі ділиться на 16 (10Н). Хоча сегмент може розташовуватися в пам'яті практично де завгодно і в реальному режимі може бути розміром до 64 К, він вимагає рівно стільки місця, скільки потрібно програмі для роботи – розміщення даних і інструкцій, що їх оброблюють. Коли інструкція завантажує адресу сегменту в сегментний регістр, ця операція автоматично змінює чотири крайніх справа нульових біта.
Ви можете визначити будь-яку кількість сегментів. Для звернення до певного сегменту необхідно лише змінити значення у відповідному сегментному регістрі. У реальному режимі використовуються три основні сегменти – кодовий (code segment, CS), даних (data segment, DS), стека (stack segment, SS).
CS. Містить інструкції, що підлягають виконанню. Зазвичай перша виконувана інструкція знаходиться на початку сегменту, і ОС звертається до цієї адреси для початку виконання програми. Як видно з імені, регістр СS адресує сегмент коду.
DS. Містить дані програми, константи і робочу область. Регістр DS адресує сегмент даних.
SS. Містить будь-які дані і адреси, які програмі потрібно тимчасово зберегти або використовувати у власних підпрограмах, що “викликаються” . Регістр SS адресує сегмент стеку.
Межі сегменту. Сегментний регістр має розрядність 16 і зберігає стартову адресу сегменту. На рис 2.2 показана графічна структура регістрів CS, DS і SS і їх зв'язок з сегментами коду, даних і стека (регістри і сегменти не обов'язково розташовані в показаному на рисунку порядку). Інші сегменти – це ES (extra segment, додатковий сегмент), а в процесорах 80386 і пізніших – FS і GS, що надають додаткові сегменти для зберігання даних.
Сегмент стеку
Сегмент даних
Сегмент коду
Адреса
Адреса
Адреса
SS
DS
CS
Сегментні
регістри
Рис. 2.2 – Сегменти і сегментні регістри
1.2. Зміщення в сегментах
У програмі всі комірки пам’яті (КП) в сегменті нумеруються відносно стартової адреси сегменту. Відстань в байтах відносно початку сегменту до будь-якої іншої КП називається зміщенням (offset або displacement). У реальному режимі двобайтове зміщення може мінятися від 0000Н до FFFFH, тобто від 0 до 65535. Тому перший байт в сегменті має адресу 0, другий – адресу 1, і так далі до останнього байта з адресою 65535. Аби звернутися до будь-якої КП в сегменті, процесор поєднує адресу сегменту, що зберігається в сегментному регістрі, із зміщенням необхідного байта, тобто його відстанню від початку сегменту в байтах.
Розглянемо сегмент даних, що починається з адреси 038Е0Н. Регістр DS містить значення 038Е[0]Н, тобто адресу початку сегменту даних. Якщо інструкція звертається до КП зі зміщенням 0032Н в сегменті даних, то необхідна адреса отримається додаванням зміщення з адресою, що зберігається в регістрі DS, як показано нижче.
Адреса в регістрі DS: 038Е0Н
Зміщення: + 0032Н
Дійсна адреса: 03912Н .
Тому дійсна адреса, на яку буде посилатися інструкція, рівна 03912Н. Відмітьте, що програма може містити один або більше сегментів, які можуть починатися де завгодно в пам'яті і розташовуватися в будь-якій послідовності.