Побічно-регістровий режим
У цьому режимі, як і в регістровому, адресне поле не
використовується. Значення регістра інтерпретується як адреса операнда. Даний
режим використовується для разименованія покажчиків або для звернення до пам'яті
за заздалегідь обчисленою адресою.
Деякі процесори, такі,
як Pdp-11,, VAX, Мсбзохо мають цікаві варіанти цього режиму
— адресацію з інкрементом поста і предек-рементом. Інкремент поста
означає, що після власне адресації значення регістра збільшується
на величину об'єкту, що адресується. Предекремент, відповідно,
означає, що регістр зменшується на ту ж величину перед адресацією.
Ці режими можуть використовуватися для всіляких цілей, наприклад для
реалізації операцій над текстовими рядками або поелементного сканування
масивів. Але одне з основних призначень -- це реалізація стека.
Стік
Стік або магазин
— це структура даних, над якою ми можемо здійснювати дві операції:
проштовхування (push) значення і виштовхування (pop). Значення виштовхуються
із стека в порядку, зворотному тому, в якому проштовхувалися: LIFO (Last
In, First Out, перший увійшов, останній вийшов). Стекові структури знаходять
широке вживання при синтаксичному розборі арифметичних виразів
і алголоподобних мов програмування [Кормен/лейзерсон/рівест 2000].
Найпростіша реалізація стека — це масив і індекс останнього елементу, що
знаходиться в стеку (мал. 2.7). Цей індекс називається
покажчиком стека (SP - Stack Pointer). Стек може зростати як вгору,
так і вниз [(мал. 2.8). Широко застосовуються також реалізації стеків у вигляді
односвяз-|них списків.

Мал. 2.7. Стік на основі масиву

Мал. 2.8. Стеки, зростаючі вгору і вниз
При реалізації стека скалярних значень зручно
використовувати безперервну область пам'яті як масив, регістр SP як покажчик і
режими адресації з інкрементом поста і предекрементом при реалізації команд
проштовхування і виштовхування.
Дійсно, команда
MOVE x, -(SP)
приведе до того, що покажчик стека зменшиться на розмір х,
і ми покладемо х в пам'ять, що визволилася. Навпаки, команда
MOVE (SP)+, в
приведе до набуття значення і просування покажчика
стека у зворотному напрямі. Тому перша команда має також мнемонічне
позначення
PUSH х
а друга
POP в
Якщо ми помістимо декілька значень в стек командою
PUSH команда POP виштовхне їх із стека
в зворотному порядку. Стек можна використовувати для зберігання проміжних
даних (див. приклад 2.3) і при реалізації арифметичних виразів — наприклад,
команда
ADD (SP)+, (SP)
у точності відтворює описану вище семантику безадресної
команди ADD стекової архітектури. Втім, безадресній
команді ADD операнди не потрібні, а в даному випадку
вони просто не використовуються, але нікуди не зникають. Команда виходить
довше: в типової стекової архітектури команда складання займає 1 байт,
в Pdp-11 її імітація займає 2 байти, а в VAX — цілих три. Тому, якщо
ми хочемо використовувати стекову техніку генерації коди, краще використовувати
призначений для цього процесор.
Приклад 2.3. Використання стека
для зберігання проміжних значень
void swap(int &a, int &b){
int t;
t=a;
a=b;
b=t;
}
;Для простоти ми не розглядаємо механізм передачі параметрів
; і вважаємо, що вони передаються в регістрах А і В
.GLOBL swap
swap:
POSH (A)
MOVE (B) (A)
POP (B)
RET.
Одне з основних призначень стека в регістровій архітектурі —
це збереження адреси повернення підпрограм. Крім того, якщо прийнята в
системі угода про виклики підпрограм передбачає, що процедура, що
викликається, повинна зберегти все або деякі регістри, які використовує
сама, стек зазвичай застосовують і для цього.
Неортогональні процесори, такі, як х86, часто надають спеціальні
команди PUSH і POPщо
працюють з виділеним регістром SP (Stack Pointer), який не може
бути використаний для інших цілей.
|