Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АРХІТЕКТУРА КОМП.doc
Скачиваний:
49
Добавлен:
28.10.2018
Размер:
453.12 Кб
Скачать

9. Способи адресації. Режими адресації.

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

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

Реєстрова адресація. Команди, які використовують цей режим адресації, найбільш компактні й виконуються швидше від інших типів команд, оскільки не потрібно звертатися до пам’яті (операнд перебуває в регістрі). Наприклад:

XOR АН, АН     ;очистити старший байт АХ

INC DX       ;збільшити вміст DX на 1

Безпосередня адресація IMED. У цьому випадку операнд є частиною самої команди і, отже, не потребує звернення до пам’яті під час виконання команди, оскільки він утримується вже в черзі команд. Такий спосіб задання операнда дуже зручний для визначення початкових значень і констант. Наприклад:

Tab EQU 9                    ;визначити константу символьним іменем

CMP AL, Tab          ;порівняти вміст AL зі значенням константи 9

MOV DL,’D’           ;записати в DL ASCII-код букви D

ADD ВХ, 2000       ;додати до вмісту ВХ константу 2000

MOV DX, OFFSET MSGERR ;завантажити в DX адреси ділянок пам’яті

; з іменем MSG_ERR

TEST AL, OFOH                                 ;перевірити старший півбайт AL

Пряма адресація (EA=DISP). Цей спосіб найбільш природний, оскільки операнд вказується символьним іменем, для оброблення якого в команді міститься адресне зміщення позначеної цим символьним іменем комірки пам’яті. За замовчуванням операнд передбачається в сегменті даних (DS), однак за допомогою префікса зміни сегмента можна вказати будь-який інший сегмент (CS, SS, ES). Цей режим адресації використовується для доступу до окремих байтів або слів у пам’яті. Наприклад:

MOV СХ, Count          ;завантажити в СХ уміст комірки

;пам’яті, позначеної в сегменті даних ім’ям Count

MOV AL, CS:Nxt_Byte ;завантажити в АХ уміст комірки

; пам’яті, позначеної в сегменті кодів 

; символьним іменем Nxt_Byte

Непряма адресація (EA=BASE або INDEX). За цього режиму адресації виконавча адреса ЕА визначається вмістом зазначеного в команді регістра ВХ, SI або DI . (Увага: базовий регістр ВР не допускається!). Цей режим адресації ефективний для оброблення послідовностей з байтів або слів у пам’яті, при цьому вміст регістра (ВХ, SI або DI) B, змінюючись у програмі, визначає адреси поточного елемента послідовності. За замовчуванням операнд передбачається в сегменті даних (DS), однак за допомогою префікса заміни сегмента можна вказати будь-який інший сегмент (СХ, SS, ES). Наприклад:

DEC BYTE PTR [ВХ]             ;декрементувати байт, зміщення якого в

;поточному сегменті даних задано вмістом ВХ

MOV DX, SS: [Si]       ;записати в DX слово, на яке в поточному

;сегменті стека вказує SI

CMP WORD PTR ES:[DI], 0 ;перевірити на нуль уміст слова,

; на яке в поточному додатковому сегменті вказує DI

Відносна непряма адресація (EA=BASE + DISP або INDEX + DISP). У цьому випадку виконавча адреса визначається як сума вмісту регістра бази або регістра індексу зі зміщенням, що задається константою чи символьним іменем. Цей режим зручний для доступу до окремих елементів у середині масивів, таблиць, вікон та інших, крім того, символьне ім’я, якщо воно використовується, визначає початок масиву або таблиць, а вміст регістрів задає зміщення. За замовчуванням для базового регістра ВХ операнд передбачається в сегменті даних (DS), однак за допомогою префікса заміни сегмента можна вказати будь-який інший сегмент (CS, SS, ES). Якщо ж використовується базовий регістр ВР, то операнд за замовчуванням передбачається в стековому сегменті (SS), але в разі потреби його можна замінити на будь-який інший сегмент (CS, DS, ES). Наприклад:

MOV [ВР+10], 0                        ;обнулити п’яте слово в стеку,

;якщо припустити, що BP = SP

MOV DX, СХ[ВХ]+10Н ;взяти на DX восьме слово з масиву, початок

;якого визначено вмістом ВХ у кодовому сегменті

MOV Stribg[SI], AL                  ;записати вміст AL у масив байтів

;на позицію, рівну вмісту SI, рахуючи 

;від початку масиву String у сегменті даних

Базово-індексна адресація (EA = BASE + INDEX). Виконавчий індекс при цьому режимі адресації виходить у результаті підсумовування вмісту зазначених у команді базового й індексного регістрів. Зазвичай за такої адресації вміст базового регістра вказує на початок деякої ділянки пам’яті, а вміст індексного регістра, змінюючись у програмі, ідентифікує окремі елементи або частини цієї ділянки. За замовчуванням для базового регістра ВХ операнд передбачається в сегменті даних (DS), однак за допомогою префікса заміни сегмента можна вказати будь-який інший сегмент (CS, SS, ES). Якщо ж використовується базовий регістр ВР, то операнд за замовчуванням передбачається у стековому сегменті (SS), але в разі потреби його можна замінити на будь-який інший сегмент (СХ, DS, ES). Наприклад:

MOV AX, [BX][SI]     ;взяти в акумулятор слово з масиву

;у поточному сегменті даних (ВХ = база,

; SI = зміщення)

CMP AX, ES:[BP][SI]             ;і порівняти його зі словом у тій же позиції

;масиву в додатковому сегменті даних (ВР = база)

Відносна базово-iндексна адресація (ЕА=BASE+INDEX+DISP). Цей режим адресації найскладніший, хоча б тому, що у створенні виконавчої адреси беруть участь три компоненти: база, індекс і зміщення. Ефективно такий режим адресації можна застосовувати, наприклад, для опрацювання таблиць, коли символічним іменем задається початок таблиці, базовим регістром - початок поля в таблиці, а індексним регістром - окремий елемент або ділянка в цьому полі. Якщо ж зміщення задано константою, то зазвичай базовий регістр вказує на початок деякої ділянки пам’яті, індексний регістр - на окремий елемент або частину цієї ділянки, а константа визначає зміщення від цього елемента або ділянки. За замовчуванням для базового регістра ВХ операнд передбачається в сегменті даних (DS), однак за допомогою префікса заміни сегмента можна вказати будь-який інший сегмент (CS, SS, ES). Якщо ж використовується базовий регістр ВР, то операнд за замовчуванням передбачається в стековому сегменті (SS), але в разі потреби його можна замінити на будь-який інший сегмент (CS, DS, ES). Наприклад:

MOV AX, Data_Table[BX][SI]  ;взяти з АХ слово з таблиці,

;визначеної в сегменті даних під

;іменем Data_Table, зміщення слова = = ВХ+SI

CMP ES:Extra_Table[BX][SI], AX ;і порівняти його з елементом у такій самій

;позиції таблиці, яку визначено в

;додатковому сегменті під іменем

;Extra_Table

Адресація стекових операцій. У командах стекових операцій один з операндів може бути в регістрі або в пам’яті, що задається відповідно до розглянутих вище режимів адресації, а другий операнд завжди перебуває у стековій пам’яті, яка задається логічною адресою SS:SP, що завжди неявно визначено самою командою стекової операції. Під час виконання цих команд автоматично змінюється вказівник стека :SP = SP?2 (для команди PUSH занесення у стек) або SP = SP+2 (для команди POP зчитування зі стека). Унаслідок цього вказівник стека SP завжди вказує на верхівку стека. Як вказівник елементів стека можна використати й регістр ВР, що дозволяє обробляти їх не за принципом «LIFO -останнім надійшов першим пішов», прямим доступом до потрібного елемента. Наприклад:

PUSH DS ;зберегти в стеку DS

POP CS:DS_Save ;прочитати елемент із верхівки стека

;у змінну DS_Save кодового сегмента

Адресація рядкових даних. У командах оброблення рядкових даних не використовується жоден з наведених вище режимів адресації. Під час виконання цих команд неявно визначається, що виконавча адреса операнда-джерела утримується в регістрі SI, а операнд-приймач - у регістрі DI. Причому операнд-приймач завжди передбачається в додатковому сегменті (ES) і не допускається його перевизначення за допомогою префікса заміни сегмента. Операнд-джерело за замовчуванням передбачається в поточномусегменті даних, однак у разі потреби його можна перепризначити на будь-який інший сегмент (CS, ES, SS), використовуючи префікс заміни сегмента. Команди опрацювання рядкових даних призначені для того, щоб за один раз можна було обробити відразу багато байтів (або слів), тому в процесі їх виконання відбувається автоматична зміна (збільшення або зменшення) вмісту регістрів-вказівників SI й (або) DI. У разі використання префікса повторення автоматично змінюється і вміст регістра-лічильника СХ. Слід зазначити, що, оскільки адресацію в цих командах визначено неявно, вони мають довжину тільки один байт. Наприклад:

REPE CMPSB   ;порівняти два ланцюжки байтів (SI й DI вказують

;на порівнювані байти), поки не вичерпається лічильник

                               ;або поки не виявиться розбіжність байтів в операндах

LODSW                    ;взяти слово із джерела в сегменті даних (SI = адреса слова)

STOSW                     ;і записати в приймач, розміщений

; у додатковому сегменті (DI = адреса слова)

Слід розрізняти поняття адресний код в команді Ак і виконавська адреса Аї. Адресний код - це інформація про адресу операнда, що міститься в команді. Виконавська адреса - це номер елементу пам'яті, до якої проводиться фактичне

звернення. У сучасних ЕОМ, адресний код, як правило, не співпадає з виконавською адресою. Вибір способів адресації, формування виконавської адреси і перетворення адрес є одним з найважливіших питань розробки ЕОМ. Розглянемо способи

адресації, використовувані в сучасних ЕОМ. Операнд, що мається на увазі. У команді не міститься явні вказівки про

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

в яких деякому числу (вмісту лічильника) додається фіксований приріст, частіше одиниця молодшого розряду. Один з операндів - число в лічильнику - зазвичай адресується явним методом, другий операнд - приріст – не адресується, в пам'яті машина не міститься і є таким, що мається на увазі. Адреса, що мається на увазі. У команді не міститься явні вказівки про

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

Безпосередня адресація. У команді міститься не адреса операнда, а безпосередньо сам операнд. При безпосередній адресації не вимагається звернення до пам'яті для вибірки операнда і осередку для його зберігання. Це сприяє зменшенню часу виконання програми і займаного нею об'єму пам'яті. Безпосередня адресація зручна для зберігання різного роду констант; протее слід мати на увазі, що при цьому способі адресації довжина операнда коротша за коду команди, оскільки частина розрядів команди зайнята під код операції.

Пряма адресація. Виконавська адреса співпадає з адресною частиною команди. Цей спосіб адресації був загальноприйнятим по-перше обчислювальних машинах і продовжує застосовуватися в даний час в комбінації з іншими способами. У вказаній формі безпосередня адресація реалізується в ЕОМ з порівняно довгим машинним словом (32 розряди і більш).

Відносна адресація або базування. Виконавська адреса визначається сумою адресної коди команди Ак і деякого числа Аб, званого базовою адресою:

Аї = Ак+ Аб.

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

базовій адресі вибирають таким, щоб можна було адресувати будь-який осередок ОП, а адресний код Ак самої команди використовують для уявлення лише порівняно короткого «зсуву» (позначають буквою D). Зсув D визначає положення операнда відносно початки масиву, що задається базовою адресою Аб.

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

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

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

Непряма адресація. Адресний код команди указує адреса елементупам'яті, в якій знаходиться адреса операнда або команди. Таким чином, непряма адресація може бути інакше визначена як «адресація адреси». На непряму адресацію указує код операції команди, а в деяких ЕОМ в команді відводиться спеціальний розряд (покажчик адресації - УА), і цифра 0

або 1 в нім указує, є адресна частина команди прямою адресою або непрямим. У деяких ЕОМ використовується багатоступінчата непряма адресація. В цьому випадку елементи пам'яті містять також розряд-покажчик непрямої

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

останнього осередку і є шуканою виконавською адресою.

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

При автоінкрементній адресації по вмісту регістра спочатку вміст регістра використовується як адреса операнда, а потім отримує приріст, рівний числу байт в елементі масиву. При автодекрементній адресації спочатку вміст вказаного в команді регістра зменшується на число, рівне числу байт в елементі масиву, а потім використовується як адреса операнда.

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

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

Зазвичай в ЕОМ одночасно використовується декілька типів адресації.

Тип адресації указується або неявно кодом операції, або в явній формі із спеціальному полі адресної частини команди