Вироджені режими адресації
До цієї групи відносяться режими, в яких доступ до операнда
не містить адресації як такий.
Першим з таких режимів є операнд-регістр. Режим цей
концептуально украй простий і додаткових коментарів не потребує.
Другий режим — операнд-константа. У документаииях по багатьом процесорам
цей режим називають літеральною (literal)
і негайною (immediate) адресацією.
Здавалося б, важко придумати простішою і життєво необхідний режим.
Проте повноцінно реалізувати такі операнди можна використовуючи або команди
змінної довжини, або команди, які довше за слово (найчастіше це
буває біля процесорів гарвардської архітектури, наприклад, вже згадуваного
PIC).
Літеральна адресація в системі команд
SPARC
Розробники процесорів, яких не владнує жодне з названих умов,
вимушені проявляти фантазію. Так, біля RISC-процессоров SPARC і команда,
і слово мають однакову длину— 32 біта. Адресне поле такої довжини в команді
неможливе — не залишається місця для коди операції. Вихід, запропонований
розробниками архітектури SPARC, при першому знайомстві справляє дивне
враження, але, як говорять в таких випадках, "не критикуйте те,
що працює".
Триадресні команди SPARC можуть використовувати як операнди три
регістри або два регістри і беззнакову константу завдовжки 13 біт. Якщо
константа, яку ми хочемо використовувати в операції, уміщається в 13 біт,
ми можемо просто використовувати цю можливість. На випадок, якщо значення
туди не поміщається, надається команда sethi const22, reg, яка
має 22-розрядне поле і встановлює старші біти вказаного регістра,
рівними цьому полю, а молодші біти — рівними нулю.
Таким чином, якщо ми хочемо помістити в регістр 32-розрядну
константу value, ми повинні робити це за допомогою двох команд: sethi %hi
(value), reg; or %gO, %lo (value), reg; (відповідно до [docs.sun.com 806-3774-10],
саме так реалізована асемблерна псевдокоманда set value, reg).
З точки зору займаної пам'яті, це анітрохи не гірше, ніж команда set
value, reg, яка теж повинна була б займати 64 біта. Зате таке рішення
дозволяє дотримати принцип: одна команда — одне слово, який полегшує
роботу логіці випереджаючої вибірки команд.
Втім, для 64-розрядного SPARC v9 настільки елегантного
рішення знайдено не було. Спосіб формування довільного 64-бітового
значення вимагає додаткового регістра і цілої програми (приклад 2.1).
Залежно від значення константи цей код може піддаватися оптимізації. Найлегше,
звичайно, справа йде, якщо необхідне значення поміщається в 13 біт.
Приклад 2.1. Формування 64-розрядного
значення на SPARC v9, цит. по [docs.sun.com 806-3774-10]
! reg — проміжний регістр, rd — цільовий.
sethi %uhi(value), reg
or reg %ulo(value), reg
sllx reg,32,reg ! зрушення на 32 біта
sethi %hi(value), rd
or rd, reg, rd
or rd %lo(value), rd
"Короткі літерали" різного роду незрідка використовуються і
в інших процесорах, що особливо мають велику розрядність. Дійсно,
велика частина реально використовуваних констант має невеликі значення,
і виділення під кожну таку константу 32- або, тим більше, 64-розрядного
значення привело б до непотрібного збільшення коди.
Короткі літерали VAX
Біля процесорів сімейства VAX є режим адресації, що
дозволяє використовувати бітове поле, яке в інших режимах інтерпретується як
номер регістра, як 4-бітовий літерал. Разом з двома бітами режиму
адресації цим способом можна задати 6-розрядний літерал, знаковий або
беззнаковий залежно від контексту [Прохоров 1990].
Короткі літерали Мсбзохо
Біля процесорів сімейства Мс680хо літерал може мати довжину 1 або 2 байти.
Крім того, надаються команди ADDQ і SUBQ, які дозволяють додати
до вказаного операнда або відняти з нього ціле число в діапазоні від 1
до 8.
|