
- •"Програмне забезпечення автоматизованих систем"
- •1. Оперативна пам'ять
- •2. Регістри
- •3. Прапори
- •1. Переходи
- •2. Безумовні переходи
- •3. Умовні переходи
- •4. Команди керування циклом
- •1. Подання даних арифметичні операції
- •2. Цілі числа без знака
- •3. Цілі числа зі знаком
- •4. Особливості виконання арифметичних операцій
- •5. Подання символів і рядків
- •6. Подання адрес
- •7. Директиви визначення даних
- •1. Структура команд. Виконавчі адреси
- •2. Формати команд
- •3. Запис команд в masm
- •1. Сегменти пам’яті, сегментні регістри
- •2. Сегментні регістри по домовленості
- •3. Сегментування, базування й індексування адрес
- •4. Програмні сегменти. Директива assume
- •5. Початкове завантаження сегментних регістрів
- •6. Посилання вперед
- •1. Строкові операції
- •1. Стек
- •2. Основні стекові команди
- •1. Організація процедур та переривань
- •2. Передача параметрів процедурам через регістри, через стек, через таблиці, через глобальні області
- •3. Передача параметрів по ссылке
- •4. Передача параметрів по повернутому значенню
- •5. Передача параметрів в стеку
- •6. Локальні змінні
- •1. Процеси і потоки
- •1.1 Розподіл часу між потоками
- •1.2 Динамічна зміна рівня пріоритету потоку
- •2. Робота із процесами й потоками в Win32 api
- •1. Адресний простір процесу
- •2. Керування віртуальною пам'яттю. Vmm
- •3. Файли даних, що проектуються на згадку
- •4. Взаємодія процесів через загальну область даних. Когерентність
- •5. Купи
- •1. Визначення вікна. Компоненти й параметри вікон
- •2. Клас вікна
- •3. Ієрархія вікон
- •1. Обмін даними між процесами
- •2. Вилучений виклик процедур (rpc - Remote Procedure Call)
- •3. Синхронізація потоків
- •1. Загальний порядок обробки виключень
- •2. Фільтри й оброблювачі виключень
- •1. Загальна структура системного реєстру
- •2. Робота додатків із системним реєстром
- •1. Файлові структури
- •2. Робота з томами й каталогами
- •3. Синхронна робота з файлами
- •4. Асинхронна робота з файлами
- •1. Системні файли ntfs
- •2. Master File Table (mft)
- •3. Цілісність даних і здатність до самовідновлення.
- •4. Організація й керування дисками
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