|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Адресація
Розробка кодів операцій є важливою частиною архітектури команд. Проте значне число бітів програми використовується для того, щоб визначити, звідки потрібно брати операнди, а не для того, щоб дізнатися, які операції потрібно виконати. Розглянемо команду 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 не має адрес. Вхідні і вихідні операнди не показуються явним чином. Нижче ми розглянемо стекову адресацію детальніше. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.002 сек.) |