АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Адресація

Читайте также:
  1. Адресація в мережі Інтернет
  2. Індексна адресація
  3. Сигналізація і адресація АТМ
  4. Структура протоколу та адресація в мережах SIP

Розробка кодів операцій є важливою частиною архітектури команд. Проте значне число бітів програми використовується для того, щоб визначити, звідки потрібно брати операнди, а не для того, щоб дізнатися, які операції потрібно виконати. Розглянемо команду ADD, яка вимагає специфікації трьох операндів: двох джерел і одного пункту призначення. (Термін «операнд» звичайно використовується стосовно всіх трьом елементів, хоча пункт призначення - це місце, де зберігається результат.) Так або інакше команда ADD повинна повідомляти, де знайти операнди і куди помістити результат. Якщо адреси пам'яті 32-бітові, то специфікація цієї команди вимагає крім коду операції ще три 32-бітові адреси. Адреси займають значно більше бітів, чим коди операції.

Два спеціальні методи призначені для зменшення розміру специфікації. По-перше, якщо операнд повинен використовуватися кілька разів, його можна перемістити в регістр. У використанні регістра для змінної є подвійна користь: швидкість доступу збільшується, а для визначення операнда потрібна менша кількість бітів. Якщо є 32 регістри, будь-якою з них можна визначити, використовуючи всього лише 5 бітів. Якщо при виконанні команди ADD використовуються тільки регістрові операнди, для визначення всіх трьох операндів необхідно тільки 15 бітів, а якби ці операнди знаходилися в пам'яті, знадобилося б цілих 96 бітів.

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

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

Другий метод вважає визначення одного або декількох операндів неявним чином. Для цього існує декілька технологій. Один із способів — використовувати одну специфікацію для вхідного і вихідного операндів. Тоді як звичайна триадресна команда ADD використовує форму

DESTINATION=SOURSE1+SOURSE2.

двоадресну команду можна скоротити до форми

REGISER2=REGISTER2+50URSE1.

Недолік цієї команди полягає в тому, що вміст REGISTER2 не збережеться. Якщо первинне значення необхідне пізніше, його потрібно спочатку скопіювати в інший регістр. Компроміс тут полягає в тому, що двоадресні команди коротші, але вони не так часто використовуються. У різних розробників різні переваги. У Pentium II, наприклад, використовуються двоадресні команди, а в UltraSPARC II — триадресні.

Ми скоротили число операндів команди ADD з три до два. Продовжимо скорочення далі. Перші комп'ютери мали тільки один регістр, який називався акумулятором. Команда ADD, наприклад, завжди додавала слово з пам'яті до акумулятора, тому потрібно було визначати тільки один операнд (операнд пам'яті). Ця технологія добре працювала для простих обчислень, але коли були потрібні проміжні результати, акумулятор доводилося записувати назад в пам'ять, а пізніше викликати знову. Отже, ця технологія нам не підходить.

Отже, ми перейшли від триадресної команди ADD до двоадресної, а потім до одноадресної. Що ж залишається? Нуль адрес? Так. У розділі 4 ми побачили, як машина IJVM використовує стек. Команда IADD не має адрес. Вхідні і вихідні операнди не показуються явним чином. Нижче ми розглянемо стекову адресацію детальніше.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.002 сек.)