
- •"Програмне забезпечення автоматизованих систем"
- •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. Організація й керування дисками
2. Сегментні регістри по домовленості
Згідно описаної схеми сегментування адрес, заміну абсолютних адрес на адресні пари треба виконувати всіма командами які мають операнд-адресу. Але розробники ПК придумали спосіб, який дозволяє уникнути виписування таких пар в більшості команд. Суть його в тому, що заздалегідь домовляються про те, який сегментний регістр на який сегмент пам’яті буде вказувати, і що в командах задається тільки зміщення: не вказаний явно сегментний регістр автоматично відновлюється відповідно цій домовленості. І лише за необхідності порушити цю домовленість потрібно повністю вказувати адресну пару.
Що таке домовленість?
Вважається, що регістр CS завжди вказує на початок області пам’яті, в якій розміщені команди програми (ця область називається сегментом команд або сегментом кодів), і тому при посиланні на клітини цієї області регістр CS можна не вказувати явно, він передбачається по замовчуванню. (Відмутимо, що абсолютна адреса, яка підлягає виконанню, завжди задається парою CS:IP: в лічильнику команд IP завжди знаходиться зміщення цієї команди відповідно адреси із регістра CS.) Аналогічно передбачається, що регістр DS вказує на сегмент даних (область пам’яті з константами, змінними та іншими величинами програми), і тому у всіх посиланнях на цей сегмент регістр DS можна явно не вказувати, т.я. він передбачається по замовчуванню. Регістр SS вказує на стек – область пам’яті, доступ до якої здійснюється за принципом "останній записаний перший прочитаний", і тому всі посилання на стек, в який явно не вказаний сегментний регістр, по замовчуванню сегментуються по регістру SS. Регістр ES вважається вільним, він не прикріплений ні до жодного сегменту пам’яті і його можна використати за власним бажанням; частіше всього він використовується для доступу до даних, які не розмістилися або свідомо не були розміщенні в сегменті даних.
З урахуванням такого розподілу ролей сегментних регістрів машинні програми зазвичай будуються так: всі команди програми розміщуються в одному сегменті памяті, початок якого заноситься в СS, а всі данні розміщуються в іншому сегменті, початок якого заноситься в регістр DS; якщо потрібен стек, то під нього відводиться третій сегмент памяті, початок якого записується в регістр SS. Після цього практично у всіх командах можна вказувати не повні адресні пари, а лише зміщення, т.я. сегментні регістри в цих парах будуть відновлюватися автоматично.
Але тут виникає таке питання: як за зміщенням визначити, на який сегмент памяті воно вказує? В загальних рисах відповідь така: посилання на сегмент команд можуть бути лише в командах переходу, а посилання практично у всіх інших командах (крім рядкових і стекових) – це посилання на сегмент даних. Наприклад, в команді пересилки
MOV AX,X
Імя X сприймається як посилання на дану, а тому автоматично відновлюється за адресною парою DS:X. В команді ж безумовного переходу за адресою, яка знаходиться в регістрі BX,
JMP BX
Абсолютна адреса переходу визначається парою CS:[BX].
Отже, якщо в посиланні на будь-яку клітину памяті не вказаний явний сегментний регістр, то цей регістр береться по замовчуванню. Явно ж сегментні регістри потрібно вказувати, тільки якщо з якихось причин регістр по замовчуванню не підходить. Якщо, наприклад, команді пересилки нам потрібно послатися на стек, тоді нас вже не буде задовольняти домовленість про те, що по замовчуванню операнд команди MOV сегментуються за регістром DS, і тому ми зобов’язані явно вказати інший регістр – в нашому випадку регістр SS, т.я. саме він вказує на стек:
MOV ah,ss:x
Але такі випадки зустрічаються рідко і тому в командах, як правило, вказуються лише зміщення.
Відмітимо, що в MASM сегментний регістр записується в самій команді безпосередньо перед зміщенням (ім’ям змінної, міткою і т.п), Але на рівні машинної мови ситуація дещо інша. Існує 4 спеціальні одно байтові команди, які називаються префіксами заміни сегмента (які позначаються як CS:, DS:, SS: та ES:). Вони ставляться перед командою, операнд-адреса якої повинна бути просегментована по регістру, який відрізняється від регістра, передбаченого по замовчуванню. Наприклад, наведена вище символічна команда пересилки – це дійсно дві машинні команди
SS:
MOV ah,x