Способи адресації пам'яті

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Спо́соби адреса́ції па́м'яті — комплекс стандартизованих для певної архітектури системи команд центрального процесора способів для визначення (обчислення) місця розташування операндів у пам'яті ЕОМ або адреси наступної команди при виконанні команд переходу. В цій статті висвітлюються аспекти адресації операндів (методи адресації переходів).

Передумови та потреби

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

У перших комп'ютерах адресу або номер комірки необхідно було вказувати явно, і такий метод адресації виявлявся дуже незручним. Труднощі в алгоритмізації різних завдань, де була потрібна автоматизація процесу визначення адреси, стали причиною введення згодом широкого спектра методів адресації. Кожний з них фактично пропонує певну формулу для обчислення ефективної (тобто фактичної) адреси, зручну в тій або іншій ситуації.

Коротке порівняння адресації у CISC та RISC архітектурах

Пік винахідництва в цій галузі припав на час панування CISC-архітектур «регістр-пам'ять», які дозволяли безпосередньо використовувати як один з операндів комірку пам'яті. RISC-архітектури типу «регістр-регістр», в яких доступ до пам'яті регламентується значно більш жорстко, мають у порівнянні з CISC, дуже скромний набір методів адресації, і у найрадикальніших представниках цієї ідеології зведений до єдиного.

CISC-модель (архітектури «регістр-пам'ять»)

Як приклад CISC-моделі адресації пам'яті, розглянемо різноманітну палітру методів популярної колись архітектури VAX-11 і розглянемо її на прикладі двооперандної команди додавання ADD a, b (a:=a+b), де кожний операнд може бути як регістром, так і безпосередньо знаходитись в пам'яті. В таблиці зведені основні методи адресації VAX (загальна кількість їх перевищує два десятки, але інші є похідними від наведених) за умови, що операнд а завжди перебуває в регістрі R1, а ефективна адреса операнда b обчислюється залежно від зазначеного в команді методу адресації.

Формат двооперандної команди архітектури VAX. Поля «режим» визначають режим адресації, поля «регістр» — номери задіяних регістрів

Інформація про операнд міститься в його специфікаторі, формат якого варіюється, але для більшості методів адресації складається з полів «регістр» і «режим». Тобто, режим адресації задається полем «режим», а номер задіяного регістра міститься у полі «регістр». В режимі адресації по зсуву, в команді після полів режиму й регістра, з'являється додаткове поле із зазначенням величини самого зсуву. В режимі масштабування також застосовується розширення команди й у додатковому полі знаходиться специфікатор для третього задіяного регістра.

Реалізація абсолютної та безпосередньої адресації в машинах PDP і VAX досить цікава й використовує неявно, як залучений регістр, регістр лічильника команди (PC). Абсолютна адресація реалізується через непряму регістрову з автоінкрементом, а безпосередня — через непряму з автоінкрементом та дописуванням зсуву або константи безпосередньо після команди. При цьому регістр PC у момент виконання команди завжди вказує на наступну після неї комірку пам'яті, яка містить адресу зсуву або константи, й обчислення абсолютної адреси відбудеться коректно. Після цього необхідно лише збільшити PC до адреси наступної команди. Це робиться шляхом додання до поточного значення лічильника одиниці (автоінкремента).

Спосіб адресації Запис команди Ефективна адреса Розгорнутий запис Застосування
Абсолютна (пряма) ADD R1,@#1000 M[1000] R1:=R1+M[1000] Коли відома абсолютна (пряма) адреса операнда
Безпосередня ADD R1,#4 - R1:=R1+4 Один з операндів — константа (арифм. операції, перевірки умов)
Регістрова ADD R1,R2 R2 R1:=R1+R2 Усі операнди в регістрах
Непряма регістрова ADD R1,(R2) M[R2] R1:=R1+M[R2] Доступ до даних за попередньо обчисленою адресою, визначення адреси, на яку посилається вказівник (адреса вказівника — в R2)
Непряма ADD R1,@(R2) M[M[R2]] R1:=R1+M[M[R2]] Робота з вказівниками: якщо в R2 — адреса вказівника р, то ефективна адреса — це значення *p
За зсувом (базова, індексна) ADD R1,30(R2) M[R2+30] R1:=R1+M[R2+30] Один з основных способів. Застосовується для організації переміщуваних програм (фіксація «початку відліку (база)» в R2), для роботи з масивами (адреса початку — в R2, змінною зсуву отримаємо доступ до різних комірок масиву)
Масштабування (індексна регістрова непряма) ADD R1,(R2)[R3] M[x*R3+R2] R1:=R1+M[x*R3+R2]
x — різне в залежності від типу операндів
Робота з масивами
Непряма регістрова з автоінкрементом ADD R1,(R2)+ M[R2] R1:=R1+M[R2];

R2:=R2+1

Робота з масивами у циклах. R2 початково вказує на початок масиву, кожна нова ітерація супроводжується позиціонуванням на наступний елемент
Непряма регістрова з автодекрементом ADD R1,-(R2) M[R2-1] R2:=R2-1;

R1:=R1+M[R2]

Аналогічно попередньому способу

Ri — регістр з порядковим номером i.
М[j] — комірка пам'яті з абсолютною адресою j.
M[Ri]- комірка пам'яті з адресою, яка розташована в регістрі Ri

RISC-модель (архітектури «регістр-регістр»)

В архітектурах «регістр-регістр» про методи адресації пам'яті має сенс говорити тільки щодо спеціальних команд завантаження й збереження даних. Всі обчислювальні команди в цих архітектурах використовують винятково регістри або константи в полі команди, а значить тільки регістрову або безпосередню адресацію. RISC-архітектури, які ми маємо на увазі, говорячи про машини типу «регістр-регістр» (хоча, якщо точніше, RISC є всього лише підмножиною цього класу), власне, використовують дуже обмежений набір методів адресації, які несуть інше функціональне навантаження й не є складовою частиною обчислювальних операцій.

Формати команд архітектури DEC Alpha

Під ефективною адресою тепер будемо розуміти адресу комірки пам'яті, призначеної для завантаження в регістр спеціальною командою LD (load) або збереження результату спеціальною командою ST (store).

Цей набір є досить скромним у порівнянні з різноманіттям VAX. Поряд з нею архітектура DEC Alpha, з її єдиним методом адресації, виглядає, на перший погляд, навіть дивно, тим більше, що довгий час процесорам саме цієї архітектури належав світовий рекорд швидкодії. Однак, як показують статистичні дослідження, таке рішення цілком обґрунтоване — найуживанішими є методи адресації за зсувом (базової) й з використанням константи в полі команди, на них припадає в середньому стільки ж, скільки й на всі інші разом узяті. Хоча, звичайно ж, дуже багато чого залежить від стратегії оптимізації, використовуваної компілятором для конкретної архітектури.

Подібно до того, як в VAX деякі методи адресації були спеціальними випадками інших, в Alpha на основі адресації за зсувом (базової) можна отримати, наприклад, регістрову адресацію зазначенням нуля як розміру зсуву, або абсолютну адресацію записом нуля як задіяного регістра (зазвичай замість цього використовується регістр R0, який в RISC-архітектурах містить константу нуля).

Спосіб адресації Запис команди Ефективна адреса Розгорнутий запис MIPS IV PA-RISC 2.0 PowerPC DEC Alpha SPARC v9
За зсувом LD R1,30(R2)

ST R1,30(R2)

M[30+R2] R1:=M[30+R2]

R1:=M[30+R2]

так так так так ні
Регістрово-індексна LDX R1,R2,R3

STX R1,R2,R3

M[R2+R3] R1:=M[R2+R3]

R1:=M[R2+R3]

частково частково так ні ні
Регістрова з поновленням регістра LDU R1,50(R2)

STU R1,50(R2)

M[50+R2] R1:=M[30+R2];

R2:=50+R2
R1:=M[30+R2];
R2:=50+R2

ні так так ні ні
Регістрово-індексна з поновленням регістра LDUX R1,R2,R3

STUX R1,R2,R3

M[R2+R3] R1:=M[R2+R3];

R2:=R2+R3
R1:=M[R2+R3];
R2:=R2+R3

ні так так ні ні
Регістрова (похідна від адресації за зсувом) LD R1,0(R2) R2 R1:=R2 так так так так так
Абсолютна (похідна від адресації за зсувом) LD R1,500(R0) M[500] R1:=M[500] так так так так так