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

1.1. Сегменти і адресація

Структура пам'яті ОС на базі процесора і8086 складається з адресного простору пам'яті (до 1 Мбайта) та адресного простору портів вводу-виводу (до 64 Кбайт). Мінімально адресуємою частиною пам'яті є байт. Адресою слова вважається адреса його молодшого байта.

Є дві основні схеми адресації.

  1. Абсолютна адреса, наприклад, 04А26Н, що представляє собою 20-розрядне двійкове число, прямо вказує на певну комірку пам'яті.

  2. Адреса в системі сегмент : зміщення, що складається з початкової адреси сегменту і значення зміщення.

Сегменти – це спеціальні області, визначувані в програмі для зберігання коду, даних і так званого стека. Сегмент починається на межі параграфа, тобто на адресі, що без остачі ділиться на 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Н. Відмітьте, що програма може містити один або більше сегментів, які можуть починатися де завгодно в пам'яті і розташовуватися в будь-якій послідовності.

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