Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекцii_ALL.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.55 Mб
Скачать

9.6. Індексна адресація

Часто потрібно вміти звертатися до слів пам’яті по відомому зміщенню. Подібні приклади ми бачили в машині IJVM, де локальні змінні визначаються по зміщенню від регістру LV. Звертання до пам’яті по регістрі і константі зміщення називається індексною адресацією.

В машині IJVM при доступі до локальної перемінної використовується вказівник комірки пам’яті (LV) в регістрі плюс невелике зміщення в самій команді. Є і інший спосіб: вказівник комірки пам’яті в команді і невелике зміщення в регістрі. Щоб показати як це працює використаємо наступний приклад. У нас є два одновимірних масиви А і В по 1024 слова в кожнім. Нам потрібно вирахувати Аі І Ві для всіх пар, а потім з’єднати всі ці 1024 логічні вирази операцією АБО, щоб взнати чи є в цім наборі хоч одна пара, яка не дорівнює нулю. Один з варіантів – помістити адрес масиву А в один регістр, а адрес масиву В – в інший регістр, а потім по черзі перебирати елементи масивів. Така програма, звичайно, буде працювати, але її можна вдосконалити так, як показано в лістінгу 9.2.

Листинг 9.2. Програма на мові асемблера для обчислення операції або від (Аі і Ві ) для масиву з 1024 елементів.

MOV R1,#0 ; збирає результати виконання АБО в R1

MOV R2,#0 ; R2=і від значення А[ і ] і В[ і ]

MOV R3,#4096 ; R3=перше непотрібне значення індекса

LOOP: MOV R4,A(R2) ; R4=А[ і ]

AND R4,B(R2) ; R4=А[ і ] І В[ і ]

OR R1,R4

ADD R2,#4 ; і=і+4

CMP R2,R3 ; провірка на завершення

BLT LOOP ; якщо R2<R3, продовжити цикл

Тут нам потрібні 4 регістри:

  1. R1 – містить результати сумування логічних операцій.

  2. R2 – індекс і, який використовується для перебору елементів масиву.

  3. R3 – константа 4096. Це саме менше значення і, яке не використовується.

  4. R4 – тимчасовий регістр для зберігання кожної операції.

Після ініціалізації регістрів ми входимо в цикл з шести команд. Команда навпроти LOOP визиває елемент Аі в регістр R4. При обчисленні джерела тут використовується індексна адресація. Регістр (R2) і константа (адреса елемента А) додаються і отриманий результат використовується для звертання до пам’яті. Сума цих двох величин поступає в пам’ять але не зберігається ні в однім із видимих користувачем регістрів. Запис

MOV R4,A(R2)

означає, що для визначення пункту призначення використовується регістрова адресація, де R4 – це регістр, а для визначення джерела використовується індексна адресація, де А – це зміщення, а R2 – це регістр. Якщо А приймає значення, наприклад, 124300, то відповідна машинна команда буде виглядати так, як показано на рис.5.13.

MOV

R4

R2

124300

Рис.9.2 - Можливе представлення команди MOV R4,A(R2)

Під час першого проходження циклу регістр R2 приймає значення 0, тому потрібне нам слово А0 знаходиться в комірці з адресом 124300. Це слово загружається в регістр R4.При наступнім проходженні циклу R2 приймає значення 4, тому потрібне нам слово А1 знаходиться в комірці з адресом 124304 і т.д.

Як ми говорили вже раніше, зміщення - це вказівник комірки пам’яті, а значення регістра – це невелике ціле число, яке під час вирахування міняється. Така форма потребує щоб поле зміщення в команді було достатньо великим для зберігання адреси, тому такий спосіб не дуже ефективний. Проте цей спосіб часто виявляється найкращим.

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