Режими адресації

Спосіб визначення місцезнаходження операнда називається режимом адресації. Розрізняють сім основних режимів адресації даних, які можна розділити на дві групи. До першої відносять режими, в яких місце, в якому знаходиться операнд, вказується безпосередньо в команді. Це – безпосередній, регістровий і прямої режими адресації. У безпосередньому режимі адресації операнд розташовується в самій команді у вигляді двійкового числа (рис. 4.15, а). У прямому режимі в команді після коду операції розташовується внутрішньосегментний адресу комірки ОЗУ, в якій зберігається операнд (рис. 4.15, б). Нарешті, в регістровому режимі в команді вказаний один з регістрів даних або адреси, в якому зберігається операнд

До другої групи режимів адресації відносять режими, в яких містяться дані для обчислення внутрисегментного адреси комірки ОЗУ, що зберігає операнд. Це – чотири непрямих режиму: регістровий непрямий, регістровий відносний, базовий індексний і відно-вальну базовий індексний. При формуванні адреси в цих режимах використовується вміст універсальних адресних регістрів, додатково до яких виділяється регістр даних ВХ.

Найпростішим є регістровий непрямий режим (рис. 4.15, г), в якому адреса операнда зберігається в одному з індексних регістрів, або в регістрі ВХ, а в команді вказується код цього регістра. Більш складними є регістровий відносний (рис. 4.15, д) і базовий індексний (рис. 4.15, е) режими адресації. У першому адреса утворюється шляхом складання вмісту одного із зазначених регістрів і зміщення – двійкового числа, що зберігається в команді в поле операнда. У другому режимі адреса виходить шляхом складання вмісту одного з базових регістрів (BP, ВХ) з вмістом одного з індексних регістрів (SI, DI).

Найскладнішим непрямим режимом адресації є відносний базовий індексний режим (рис. 4.15, ж). Тут адреса операнда утворюється шляхом додавання трьох чисел: вмісту одного з базових регістрів, одного з індексних регістрів і зсуву.

Прямий і всі непрямі режими адресації даних визначають тільки внутрішньосегментний адресу. Для обчислення фізичної адреси осередку ОЗУ крім внутрисегментного необхідний початковий адреса сегмента. Код сегментного регістра, що зберігає цю адресу, міститься в другому байті команди.

Непрямі режими адресації забезпечують гнучкість створюваних програм. Як відомо, дуже часто програми містять циклічні ділянки, коли одна і та ж група команд виповнюється багаторазово, але з різними даними. Якщо в програмі використовувати команди з прямим режимом адресації, то процесор буде постійно звертатися до одних і тих же даних. При використанні непрямих режимів адресації в процесі виконання команд можна модифікувати вміст адресного регістра, наприклад, збільшуючи в кожному циклі на одиницю його вміст. У цьому випадку в черговому циклі обчислений адреса комірки ОЗУ буде на одиницю більше, ніж у попередньому. Таким чином, одні і ті ж команди програми будуть звертатися вже до різних осередків ОЗУ. Це дає можливість невеликим циклічним ділянкою програми опрацювати великий масив даних.

Роботу з масивами можна організувати таким чином. Помістимо в базовий регістр (ВХ або BP) початкова адреса масиву, а в індексний регістр (DI або SI) – номер елемента масиву. Номер елемента можна в кожному циклі збільшувати на одиницю (наприклад, SI: = SI + 1). В результаті в кожному новому циклі адреса комірки ОЗУ, обчислений в режимі базової індексної адресації, буде відповідати новому елементу масиву. За допомогою режиму відносної базової індексної адресації можна оперувати не тільки з одновимірними, але і з двомірними масивами. Для цього в якості зсуву необхідно вказати початкову адресу масиву. У базовому регістрі формують адресу першого елемента рядка щодо початкової адреси масиву, а в індексному регістрі – адреса елемента масиву у своєму рядку щодо початкової адреси рядка.

Крім режимів адресації, що використовуються для визначення місцезнаходження операндів, в МП Intel 8086 є кілька режимів для визначення адреси наступної виконуваної команди у випадках переходів. Переходи можливі як всередині сегмента виконуваної програми, так і в інші сегменти. Для переходів усередині сегмента виконуваної програми використовуються внутрішньосегментний прямий і внутрішньосегментний непрямий режими адресації. У прямому режимі адреса наступної команди формується шляхом складання вмісту програмного лічильника зі зміщенням (позитивним чи негативним), що містяться в самій команді. У непрямому режимі адреса наступної команди завантажується на місце поточного безпосередньо в програмний лічильник. Адреса може бути взятий або з регістра, або з комірки ОЗУ. Щоб вказати цю клітинку ОЗУ, використовуються всі можливі режими адресації даних.

Для переходу з одного сегмента пам’яті в інший недостатньо змінити тільки вміст програмного лічильника. Для цього потрібно занести новий початкова адреса сегмента в регістр CS. Для цього використовують прямий і непрямий міжсегментні режими адресації. У першому з них в команді міститься дві адреси – нові адреса сегмента і внутрішньосегментний. У другому – обидві адреси зберігаються в сусідніх осередках ОЗУ.

Посилання на основну публікацію