Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга_Вычисл техн и микропроц_2 автора_130709.doc
Скачиваний:
9
Добавлен:
07.05.2019
Размер:
5.26 Mб
Скачать

9.2 Способи адресування операндів мп фірми Intel

Регістрове адресування операндів

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

MOV AX,CX ; Копіювання 16-розрядного вмісту регістра CX в

; акумулятор AX

Вміст регістра-приймача завжди змінюється на вміст регістра-джерела, який не змінюється.

Безпосереднє адресування операндів

При безпосередньому адресуванні операнд-джерело вказується безпосередньо у команді у вигляді 8- або 16-розрядного даного. Операнд-приймач може бути регістром, або коміркою пам'яті, адресованою будь-яким способом, але не може бути числом. Наприклад:

MOV BL,11H ; 8-розрядне дане записується у регістр BL

При безпосередньому адресуванні знак константи поширюється до 8- або 16-розрядного регістра, а від'ємні числа записуються у регістр або комірку пам'яті у доповнювальному коді.

Припустимо, що до виконання команди

MOV CL,12H ; Завантаження у CL константи 12H

у регістрі CL було записане число FFH (11111111В). Після виконання цієї команди у регістр СL буде записано число 12H (00010010B).

Результатом виконання команди

MOV CН,-30 ; Завантаження у CН константи -30D

буде запис у регістр числа Е2Н (11100010В) – числа -30D у доповнювальному коді.

Покажемо на прикладі команди з безпосереднім адресуванням як розміщуються байти команди у сегменті кодів. При уведенні команди

MOV АХ,7000Н

наприклад, у сегмент кодів, який починається з адреси 7000Н (CS) та зміщення 0100Н три байти команди у машинних кодах будуть розміщені у трьох послідовних комірках пам’яті з адресами

Адреса

Машинні

коди

7000:0100

В8

; Код операції “пересилати до АХ

7000:0101

00

; Молодший байт

7000:0102

70

; Старший байт операнда безпосередньо

7000:0103

; Вільна комірка пам’яті для прийому коду

; операції наступної команди

Запис команди у сегмент кодів можна також проілюструвати за допомогою фрагмента пам’яті (рис. 9.3):

Рисунок 9.3 – Розташування байтів команди MOV AX,7000Н у сегменті кодів

Таким чином, обсяг пам’яті, яку займає програма, є сумою байтів, займаних усіма командами цієї програми.

Пряме адресування

При прямому адресуванні ефективна адреса операнда у сегментах даних вказується прямо у команді і розміщується у квадратних дужках. Початкова адреса сегмента даних, яка заздалегідь має бути розміщена у відповідному сегментному регістрі даних DS або ES, участь у формуванні ефективної адреси не бере. На рис. 9.4 показано фрагмент сегмента даних, в якому у комірках пам’яті з ефективними адресами 0010Н та 0011Н зберігаються відповідно дані ВВН та ААН, а з адресами 0020Н та 0021Н – дані ССН та DDН.

0010

ВВН

0011

ААН

0020

ССН

0021

DDH

Рисунок 9.4 – Пряме адресування

Після виконання команди

MOV АL,[0010Н] ; Завантаження в АL даного з комірки пам'яті з адресою

; 0010Н

у регістр АL буде завантажене дане ВВН.

Після виконання команди

MOV АХ,[0010Н] ; Завантаження в АХ слова з комірок пам'яті з адресами

; 0010Н та 00011Н

у регістр АХ буде завантажено слово ААВВН відповідно до принципу зберігання у пам'яті слів – little endian.

Після виконання фрагмента програми

MOV АХ,[0010Н] ;

MOV [0020Н],АХ ; Завантаження комірок пам'яті з адресами 0020Н та

; 0021Н з акумулятора АХ

у комірках пам'яті з адресами 0020Н та 0021Н будуть записані нові дані: ВВН та ААН відповідно.

Непряме регістрове адресування

При непрямому регістровому адресуванні ефективна адреса вміщується у будь-якому базовому або індексному регістрі: ВХ, ВР, SI, DI. Непряме регістрове адресування стає у нагоді при обробленні елементів масивів. На рис. 9.5 показані два масиви, які розташовані у сегменті даних, починаючи відповідно з адрес 0010Н – перший та 0020Н – другий, елементи яких становлять відповідно числа 12Н, 34Н, 56Н, 78Н та А1Н, А2Н, А3Н, А4Н.

0010

12Н

0011

34Н

0012

56Н

0013

78Н

0020

А1Н

0021

А2Н

0022

А3Н

0023

А4Н

Рисунок 9.5 – Непряме регістрове адресування

Після виконання фрагмента програми

MOV BХ,0010Н

MOV АХ,[ВХ]

у регістр АХ з двох комірок пам’яті з адресами (ВХ) та (ВХ+1) будуть передані два байти: 12Н у регістр АL та 34Н у регістр АН.

Після виконання фрагмента програми

MOV DI,0022Н

MOV DН,[DI]

у регістр буде записане дане А3Н.

Спосіб непрямого регістрового адресування використовується для послідовного доступу до елементів масивів при нарощуванні або зменшенні вмісту базових або індексних регістрів. Якщо елементи масиву трактуються програмістом як двобайтові (перший фрагмент), то вміст базового або індексного регістра треба змінювати на 2, а якщо як однобайтові (другий фрагмент), то на 1.

При непрямому регістровому адресуванні при зазначенні адреси комірки пам’яті до вмісту базового або індексного регістра може додаватись зміщення.

Ефективна адреса підраховується як алгебраїчна сума вмісту вказаного у команді регістра та зміщення. Результатом виконання фрагмента програми

MOV SI,0020H

MOV DH,[SI+0002H]

буде запис у регістр однобайтового елемента другого масиву з комірки пам’яті з ефективною адресою

ЕА = 0020Н + 0002Н = 0022Н,

тобто даного А3Н.

Такий спосіб адресування називається ще непрямим регістровим адресуванням зі зміщенням.

Адресування за базою

За цим способом ефективна адреса операнда обчислюється шляхом підсумовування вмісту базових регістрів ВХ або ВР та зміщення – 8- або 16-розрядного числа. Регістри бази використовуються для доступу до структурованих записів даних (масивів), розташованих у різних областях пам'яті. Базова адреса масиву, тобто його початкова адреса у сегменті, розміщується у базовому регістрі, а доступ до її окремих елементів здійснюється за їх зміщенням відносно базової адреси. Для доступу до елементів різних масивів, розташованих на однаковій відстані від бази, достатньо змінити вміст базового регістра. Припустимо, що у сегменті даних, починаючи з ефективних адрес 0010 та 0020 розташовані відповідно два одновимірних масиви з елементами (рис. 9.6): 12Н, 34Н, 56Н, 67Н, 89Н та А1Н, А2Н, А3Н, А4Н, А5Н, А6Н. За необхідності переслати у регістр AL четвертий елемент першого масиву, а у регістр АН – четвертий елемент другого масиву треба виконати такий фрагмент програми:

MOV BX,0010H ; Запис у ВХ базової адреси першого масиву

MOV AL,[BX+04H] ; Пересилання до AL четвертого елемента першого

; масиву (89Н)

MOV BX,0020H ; Запис у ВХ базової адреси другого масиву

MOV AL,[BX+04H] ; Пересилання до AН четвертого елементу другого

; масиву (А5Н)

Ефективна адреса четвертого елемента першого масиву становить 14Н, а четвертого елемента другого масиву – 24Н. Слід зазначити, що наступні команди:

MOV AХ,[BX]+4

MOV AХ,4[BX]

MOV AХ,[BX+4]

з точки зору підрахування ефективної адреси операнда у сегменті даних є ідентичними і відрізняються тільки формою завдання адреси.

Рисунок 9.6 – Адресування за базою

Коли елементи масиву трактуються як двобайтові, як у наведених командах, то у регістр АХ буде завантажено при значенні вмісту ВХ, який дорівнює 0020Н, другий елемент другого масиву, тобто А6А5Н.

Пряме адресування з індексуванням

При прямому адресуванні з індексуванням ефективна адреса обчислюється як сума зміщення (прямої адреси) та вмісту індексного регістра. Цей тип адресування зручний для доступу до елементів масиву у сегменті даних, коли прямо адресується початок масиву, а вміст індексного регістра вказує на потрібний елемент (рис. 9.7). Фрагмент програми:

MOV SI,0002H

MOV AX,[SI+20H]

призведе до пересилання з сегмента даних у регістр АХ двобайтового даного АСВАН з комірок пам'яті з адресами [20Н+2Н] та [20Н+2Н+1Н].

Рисунок 9.7 – Пряме адресування з індексуванням

Адресування за базою з індексуванням

При адресуванні за базою з індексуванням ефективна адреса обчислюється як сума значень базового регістра, індексного регістра і, можливо, зміщення. Такий спосіб адресування зручно використовувати для адресування двовимірних масивів, коли базовий регістр вміщує початкову адресу масиву, а значення зміщення та вміст індексного регістра вибирають елементи у рядку та стовпчику. Наступні команди є ідентичні:

MOV AX,[BX+2+DI] ; Пересилання у регістр АХ

; елемента, адреса якого

MOV AX,[DI+BX+2] ; визначається вмістом регістра DI

; з третього

MOV AX,[BX+2][DI] ; стовпчика масиву, початкова адреса

; якого

MOV AX,[BX][DI+2] ; знаходиться у регістрі BX

Команди з таким типом адресування виконуються найдовше.

Непряме адресування з масштабуванням

У старших моделях мікропроцесорів фірми Intel (І80386 та вищих) використовується також непряме адресування з масштабуванням. Зміщення задається двома 32-розрядними регістрами (базовим та індексним). Вміст індексного регістра множиться на масштабний множник 1, 2, 4 або 8. Масштабний множник використовується для адресування елементів масивів слів, множник 4 – для обробки подвійних слів, множник 8 – для доступу до елемента масиву 8-байтових даних. Наприклад, команда

MOV EAX,[EBX+4*ECX]

копіює в ЕАХ подвійне слово з сегмента даних, розташоване, починаючи з адреси 4*ЕСХ+ЕВХ.

Контрольні питання:

  1. З якою метою організовується сегментування основної пам’яті МП сім’ї Intel?

  2. Який обсяг пам’яті можуть адресувати МП сім’ї Intel у реальному режимі?

  3. Як адресується сегмент основної пам’яті МП сім’ї Intel?

  4. Яке призначення за умовчанням має кожний із сегментних регістрів мікропроцесорів фірми Intel?

  5. Як обчислюється фізична адреса комірок основної пам’яті МП сім’ї Intel?

  6. Який спосіб адресування у командах реалізується найшвидше?

  7. Які особливості має безпосереднє адресування операндів?

  8. В яких випадках операнд у командах адресується прямо?

  9. Де вміщується ефективна адреса операнда при непрямому регістровому адресуванні?

  10. Які способи адресування використовуються для звернення до елементів масиву?

  11. Які особливості має непряме адресування з масштабуванням?

  12. Які переваги має сегментування пам’яті порівняно з лінійною організацією?

  13. Які недоліки має сегментування пам’яті?

  14. Виконати фрагмент програми:

1) Задати у пам’яті, починаючи з ефективних адрес 0010Н та 0020Н, два масиви по 10Н елементів кожний.

2) Завантажити сегментний регістр даних початковою адресою 7000Н.

3) Завантажити індексний регістр SI константою 04Н.

4) Використовуючи адресування з індексуванням, завантажити регістри DH та СХ третім елементом першого масиву. Вказати вміст регістрів після завантаження.

5) Використовуючи адресування з індексуванням, завантажити регістри CL та другим елементом другого масиву. Вказати вміст регістрів після завантаження.

Контрольні питання підвищеної складності:

  1. У пам’яті розташований двовимірний масив 3 х 3 елементи у вигляді квадратної матриці; використовуючи непряме регістрове адресування зі зміщенням та індексуванням, вкажіть адресу центрального елемента масиву?

  2. Покажіть, як будуть змінюватись адреси елементів цього масиву під час руху вдовж головної діагоналі матриці.