|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Індексна адресація
Часто потрібно вміти звертатися до слів пам’яті по відомому зміщенню. Подібні приклади ми бачили в машині 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.
Рис.9.2 - Можливе представлення команди MOV R4,A(R2) Під час першого проходження циклу регістр R2 приймає значення 0, тому потрібне нам слово А0 знаходиться в комірці з адресом 124300. Це слово загружається в регістр R4.При наступнім проходженні циклу R2 приймає значення 4, тому потрібне нам слово А1 знаходиться в комірці з адресом 124304 і т.д. Як ми говорили вже раніше, зміщення - це вказівник комірки пам’яті, а значення регістра – це невелике ціле число, яке під час вирахування міняється. Така форма потребує щоб поле зміщення в команді було достатньо великим для зберігання адреси, тому такий спосіб не дуже ефективний. Проте цей спосіб часто виявляється найкращим.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |