Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекцій із Системного програмування та...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
786.31 Кб
Скачать

1. Сегменти пам’яті, сегментні регістри

Перші моделі ПК мали оперативну пам’ять 216 байт (64 Кб), і тому використовуються 16-бітні адреси. В наступних моделях пам’ять була збільшена до 220 байт (1 Мб = 1000 Кб). Однак у цих ПК були збережені 16-бітні адреси: саме ці адреси зберігаються в регістрах і вказуються в командах, саме такі адреси виходять в результаті модифікації по базовим та індексним регістрам. Як же вдається 16-бітним адресам посилатися на 1 Мб пам’яті?

Ця проблема вирішується за допомогою сегментування адресів (неявного базування адресів). В ПК вводиться поняття "сегмент пам’яті". Так зветься будь-яка ділянка пам’яті розміром до 64 Кб і з початковою адресою кратною 16. Абсолютна (20-бітна ) адреса А будь-якої клітини пам’яті можна представити в вигляді суми 20-бітної початкової адреси (бази) В сегменту, якому належить клітина, і 16-бітного зміщення D – адреса цієї клітини, відсчитана від початку сегмента А = В+D. Адреса В заноситься в деякий регістр S і зміщення D (в MASM така пара називається адресною парою, або показником і записується як S:D). А процесор працює так, при виконанні команди він перш за все по парі S:D обчислює абсолютну адресу А як суму даних регістра S і зміщення D, і тільки після того звертається до пам’яті за адресою А. Ось так змінюючи в командах абсолютні на данні адресні пари, і вдається адресувати всю пам’ять 16-бітними адресами (зміщеннями).

В якості регістру S дозволяється використовувати не будь-який регістр а тільки один із чотирьох, які звуться сегментними регістрами: CS, DS, SS і ES. Завдяки цьому можна працювати із чотирма сегментами пам’яті: початок одного з них загружається в регістр CS і усі посилки на клітини цього сегменту вказуються у вигляді пар CS:D, початок другого заноситься в DS і усі посилки на його клітини задаються в вигляді пар DS:D і т.д. Якщо одночасно треба працювати з великим числом сегментів, тоді треба своєчасно рятувати дані сегментних регістрів і вписувати до них початкові адреси п’ятого, шостого і т.д. сегментів.

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

Так само як усі регістри ПК, сегментні регістри мають розмір слова. Тому виникає питання: як вдається помістити в них 20-бітні початкові адреси сегментів пам’яті? Відповідь така. Оскільки всі ці адресі кратні 16, то у них молодші 4 біти, завжди нульові, і тому ці біти можна не зберігати явно, а тільки мати на увазі. Саме так і робиться: у сегментному регістрі завжди зберігається тільки перші 16 біт початкової адреси сегменту. (ця величина називається номером сегмента або просто сегментом). При знаходженні ж абсолютної адреси А по парі S:D процесор спочатку приписує праворуч до змісту регістра S чотири нульових біта (іншими словами, перемножує на 16) і тільки потім додає зміщення D, причому додавання ведеться по модулю 220:

A abs = 16*[S]+D(mod 220)

Якщо наприклад, в регістрі CS зберігається величина 1234h, то адресна пара 1234h:507h визначає абсолютну адресу, яка дорівнює

16*1234h+507h=1234h+507h=12847h