Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._7.doc
Скачиваний:
3
Добавлен:
05.05.2019
Размер:
182.78 Кб
Скачать

2.2. Непряма базова (регістрова) адресація

При такій адресації ефективна адреса операнда може знаходитися в будь-якому з регістрів загального призначення, крім sp/esp і bp/ebp (це специфічні регістри для роботи з сегментом стека). Синтаксично в команді цей режим адресації виражається взяттям імені регістра в квадратні дужки [ ]. Наприклад, команда mov ax,[ecx] поміщає в регістр ax вміст слова за адресою із сегменту даних зі зміщенням, що зберігається в регістрі ecx. Оскільки вміст регістра легко змінити під час роботи програми, даний спосіб адресації дозволяє динамічно призначити адресу операнда для деякої машинної команди. Ця властивість дуже корисна, наприклад, для організації циклічних обчислень і для роботи з різними структурами даних типу таблиць або масивів.

2.3. Непряма базова (регістрова) адресація зі зміщенням

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

Наприклад, команда mov ax,[edx +3h] пересилає в регістр ax слово з області пам'яті за адресою: вміст edx + 3h. Команда mov ax,mas[dx] пересилає в регістр ax слово за адресою: вміст dx плюс значення ідентифікатора mas (не забувайте, що транслятор присвоює кожному ідентифікатору значення, рівне зміщенню цього ідентифікатора щодо початку сегменту даних).

2.4. Непряма індексна адресація зі зміщенням

Цей вид адресації дуже схожий на непряму базову адресацію зі зміщенням. Тут також для формування ефективної адреси використовується один з регістрів загального призначення. Але індексна адресація має одну цікаву особливість, яка дуже зручна для роботи з масивами. Вона пов'язана з можливістю так званого масштабування вмісту індексного регістра. Що це таке?

Подивіться на рис. 3.1. Нас цікавить байт sib. Під час обговорення структури цього байту ми відзначали, що він складається з трьох полів. Одне з цих полів - поле масштабу ss, на значення якого множиться вміст індексного регістра.

Приміром, у команді mov ax,mas[si*2] значення ефективної адреси другого операнда обчислюється виразом mas+(si)*2. У зв'язку з тим, що в асемблері немає засобів для організації індексації масивів, то програмісту своїми силами доводиться її організовувати.

Наявність можливості масштабування суттєво допомагає у вирішенні цієї проблеми, але за умови, що розмір елементів масиву становить 1, 2, 4 або 8 байт.

2.5 Непряма базо-індексна адресація

mov eax,[esi][edx]

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

У даному прикладі ефективна адреса другого операнда формується з двох компонентів (esi)+(edx).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]