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

Питання до лекції

  1. Рівень архітектури команд

  2. Привілейований режим та режим призначений для користувача

  3. Моделі пам'яті

  4. семантика пам'яті

  5. Загальний огляд рівня архітектури команд

  6. Властивості рівня команд

  7. Що таке рівень команд?

  8. Регістри

  9. Регістри спеціального та загального призначення

  10. Команди

  11. Загальний огляд рівня команд машини Pentium II

  12. Режими роботи процесора

  13. Загальний огляд рівня команд системи ULTRASPARC II

  14. Загальний огляд віртуальної машини Java

  15. Типи даних

  16. Числові типи даних

  17. Нечислові типи даних

  18. Типи даних машини UltraSPARC II

  19. Типи даних віртуальної машини Java

  20. Формати команд

9. Адресація

Розробка кодів операцій є важливою частиною архітектури команд. Проте значне число бітів програми використовується для того, щоб визначити, звідки потрібно брати операнди, а не для того, щоб дізнатися, які операції потрібно виконати. Розглянемо команду 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 не має адрес. Вхідні і вихідні операнди не показуються явним чином. Нижче ми розглянемо стекову адресацію детальніше.

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