Теорія операційної системи

:: Меню ::

Головна
Представлення даних в обчислювальних системах
Машинні мови
Завантаження програм
Управління оперативною пам'яттю
Сегментна і сторінкова віртуальна пам'ять
Комп'ютер і зовнішні події
Паралелізм з точки зору програміста
Реалізація багатозадачності на однопроцесорних комп'ютерах  
Зовнішні пристрої
Драйвери зовнішніх пристроїв
Файлові системи
Безпека
Огляд архітектури сучасних ОС

:: Друзі ::

Карта сайту
 

:: Статистика ::

 

 

 

 

 

 

Побічно-регістровий режим

У цьому режимі, як і в регістровому, адресне поле не використовується. Значення регістра інтерпретується як адреса операнда. Даний режим використовується для разименованія покажчиків або для звернення до пам'яті за заздалегідь обчисленою адресою.
Деякі процесори, такі, як 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), який не може бути використаний для інших цілей.


:: Реклама ::

 

:: Посилання ::


 

 

 


Copyright © Kivik, 2017