Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТ МП.doc
Скачиваний:
187
Добавлен:
10.02.2016
Размер:
5.13 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. Покажіть, як будуть змінюватись адреси елементів цього масиву під час руху вдовж головної діагоналі матриці.