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

:: Меню ::

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

:: Друзі ::

Карта сайту
 

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

 

 

 

 

 

установка натяжных потолков
 

Адресація з використанням лічильника команд

Будь-який процесор надає як мінімум один спосіб такої адресації: адресація самих команд при їх послідовній вибірці здійснюється за допомогою лічильника команд з інкрементом поста. В процесорів з командами змінної довжини величина інкремента поста залежить від коди команди.
Деякі процесори дозволяють використовувати лічильник команд нарівні зі всіма останніми регістрами спільного призначення. Запис в цей регістр приводить до передачі управління за адресою, яка відповідає записаному значенню. Читання з цього регістра дозволяє взнати адресу поточної команди, що само по собі не дуже корисно і часто може бути зроблено Іншими способами. Проте використання інших режимів адресації з лічильником команд деколи дозволяє робити неочікувані, але вельми корисні трюки.

Літеральна і абсолютна адресація в Pdp-11 і VAX
VAX і Pdp-11 не реалізують в чистому вигляді ні літерального, ні абсолютного режимів адресації. Замість цього літерал або адреса поміщається в програмну пам'ять безпосередньо за операндом і використовується, відповідно, побічно-регістровий з інкрементом поста і непрямий з інкрементом поста режими з лічильником команд як регістр. При виконання команди лічильник команд вказує на слово, наступне за поточним відпрацьовуваним операндом (мал. 2.13). Використання інкремента поста приводить до того, що лічильник збільшується на розмір, відповідно, літерала або адреси, і таким чином, процесор знаходить наступний операнд. Цей дотепний прийом можна розглядати як своєрідний спосіб реалізувати команди змінної довжини.

Мал. 2.13. Реалізація літеральної адресації через інкрементну для поста адресацію лічильником команд

Використання лічильника команд в побічно-регістровому режимі із зсувом дозволяє адресувати код і дані відносно адреси поточної команди. Такий режим адресації називається відносним. Програмний модуль, в якому використовується лише така адресація, позиційно незалежний: його можна переміщати по пам'яті, і він навіть не відмітить факту переміщення, якщо лише не отримає управління в процесі самого переміщення, або спеціально не перевірятиме адреси на збіг. Втім, майже такого ж ефекту можна досягти базовою адресацією.
Багато сучасних процесорів такого режиму адресації для даних не надають, зате майже всі роблять щось подібне для адресації коди. А саме, у всіх сучасних процесорах команди умовного переходу використовують саме такий адресацію: ці команди мають коротке адресне поле, яке інтерпретується як знаковий зсув відносно поточної команди.
Річ у тому, що основне вживання умовного переходу — це реалізація умовних операторів і циклів, в яких перехід здійснюється в межах однієї процедури, а частенько всього на декілька команд вперед або назад. Забезпечувати такі команди довгим адресним полем було б марнотратне і привело б до непотрібного роздмухування коди.
Умовні переходи на великі відстані в коді зустрічаються відносно рідко, і найчастіше їх пропонують реалізувати двома командами (приклад 2.5).

Приклад 2.5. Реалізація умовного переходу з довгим зсувом

Beq distant_label ; Перейти, якщо рівно
; реалізується як
Bneq $1 ; Перейти, якщо не рівно
Jmp distant_label
; В команд безумовного переходу зазвичай використовується довгий зсув
; або абсолютна адреса
$1:

Відносні переходи в системі команд SPARC
У більшості CISC-процессоров адресний зсув в командах умовного переходу обмежений одним байтом. В SPARC такі команди використовують адресне поле завдовжки 22 біта. З врахуванням того факту, що команди в SPARC завжди вирівняні на границю слова (4 байти), така адресація дозволяє безпосередньо вказати до 4м (4х220=4 194 304) команд або 16 Мбайт, тобто цілком адресувати сегмент коди більшості реально використовуваних програм (мал. 2.14).

Мал. 2.14. Формат команд умовного переходу і виклику процесора SPARC

Команда виклику підпрограми в SPARC також використовує адресацію відносно лічильника команд, але адресне поле у неї 30-розрядне і інтерпретується як адреса слова, а не байта. При складанні зсуву і лічильника команд можливі переповнювання ігноруються, тому такою командою можна адресувати будь-яке слово (тобто будь-яку команду) 32-розрядному адресному просторі. На перший погляд, неясно навіть, яка користь від того, що адресація проводиться відносно лічильника команд, а не абсолютно. Але в 64-розрядних процесорах SPARC v9 користь від цього велика — абсолютний 30-розрядний адреса дозволяла б адресувати лише перше гигаслово пам'яті, а відносний зсув адресує саме сегмент коди, в якій би частині 64-розрядного адресного простору він би не знаходився. Програм, що мають об'єм більш одній гигакоманди, або навіть половини гигакоманди, поки що не написано, тому 30-розрядного зсуву практично досить для адресації в межах будь-якої сучасної програми.

Процесори, що не надають програмістові прямого доступу до лічильника команд, частенько все-таки дають можливість записувати в нього довільні значення за допомогою спеціальних команд обчислюваного переходу і обчислюваного виклику. Команди обчислюваного виклику широко використовуються для реалізації покажчиків на функції з таблиць віртуальних методів в об'єктно-орієнтованих мовах. Головне вживання команд обчислюваного переходу -- реалізація операторів switch мови C/c++ або case мови Pascal.

 

:: Реклама ::

 

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


 

 

 


Copyright © Kivik, 2017