14 КОДУВАННЯ КОМАНД У КОМПЮТЕРІ
14 КОДУВАННЯ КОМАНД У КОМПЮТЕРІ
Програма являє собою послідовність команд, виконання яких приводить до розв’язку задачі.
Команда визначає операцію, яку має виконати МП над даними. Команда містить у явній або неявній формах інформацію про те, де буде розміщений результат операції, а також про адресу наступної команди. Код команди складається з декількох частин, які називаються полями. Склад, призначення і розташування полів називається форматом команди. У загальному випадку формат команди містить операційну та адресну частини (рис. 14.1). Операційна частина містить код операції (наприклад, додавання, множення, передача даних).
Адресна частина складається з декількох полів і містить інформацію про адреси операндів, результату операції та наступної команди. Формат команди, у якому адресна частина складається з двох полів (ознаки адресації та адреси операндів) показано на рис. 14.2.
Типова команда, в загальному випадку, повинна указувати:
- операцію, що підлягає виконанню;
- адреси початкових даних (операндів), над якими виконується операція;
- адресу, по якій повинен бути поміщений результат операції.
Рисунок 14.1 – Структура команди
Формат команди визначає її структуру, тобто кількість двійкових розрядів, що відводяться під всю команду, а також кількість і розташування окремих полів команди. Полем називається сукупність двійкових розрядів, що кодують складову частину команди. Вибір формату команди впливає на багато характеристик ОМ. Оцінюючи можливі формати, потрібно враховувати такі чинники:
- загальне число різних команд;
- загальну довжину команди;
- тип полів команди (фіксованої або змінної довжини) і їх довжина;
- простоту декодування;
- адресованість і способи адресації;
- вартість устаткування для декодування і виконання команд.
Довжина команди. Це найважливіша обставина, що впливає на організацію і ємність пам'яті, структуру шин, складність і швидкодію ЦП. З одного боку, зручно мати в розпорядженні могутній набір команд, тобто якомога більше кодів операцій, операндів, способів адресації, і максимальний адресний простір. Проте все це вимагає виділення більшої кількості розрядів під кожне поле команди, що приводить до збільшення її довжини. Разом з тим, для прискорення вибірки з пам'яті бажано, щоб команда була якомога коротша, а її довжина була рівна або кратна ширині шини даних. Для спрощення апаратури і підвищення швидкодії ОМ довжину команди зазвичай вибирають кратною байту, оскільки в більшості ОМ основна пам'ять організована у вигляді 8-бітових комірок. В рамках системи команд одної ОМ можуть використовуватися різні формати команд. Зазвичай це зв'язано із застосуванням різних способів адресації. У такому разі в склад коду команди вводиться поле для завдання способу адресації (СА), і узагальнений формат команди набуває вигляд, показаний на рис. 14.2.
Рисунок 14. 2 – Узагальнений формат команди
Загальна довжина команди Rк може бути описана таким співвідношенням:
де l – кількість адрес у команді; RAi – кількість розрядів для запису i-ї адреси; RКоп – розрядність поля коду операції; RCA – розрядність поля способу адресації.
Розрядність полів команди. Як уже мовилося, в будь-якій команді можна виділити операційну і адресну частини. Довжини відповідних полів визначаються різними чинниками, які доцільно розглянути окремо.
Розрядність поля коду операції. Кількість двійкових розрядів, що відводяться під код операції, вибирається так, щоб можна було подати будь-яку з операцій. Якщо система команд припускає NКОп операцій, то мінімальна розрядність поля коду операції RКОп визначається таким чином:
де int означає округлення у більшу сторону до цілого числа.
Коли задана довжина коду команди, доводиться шукати компроміс між розрядністю поля коду операції і адресного поля. Більшу кількість можливих операцій припускає довге поле коду операції, що веде до скорочення адресного поля, тобто до звуження адресного простору. Для усунення цієї суперечності іноді довжину поля коду операції варіюють. Спочатку під код операції відводиться якесь фіксоване число розрядів, проте для окремих команд це поле розширюється за рахунок декількох бітів, які віднімаються від адресного поля.
Так, наприклад, може бути збільшене число різних команд пересилки даних. Необхідно відзначити, що «урізування» частини адресного поля веде до скорочення можливостей адресації, і подібний прийом рекомендується тільки в тих командах, де подібне скорочення може бути виправданим.
Розрядність адресної частини. В адресній частині команди міститься інформація про місцезнаходження початкових даних і місце збереження результату операції. Звичайне місцезнаходження кожного з операндів і результату задається в команді шляхом вказівки адреси відповідної комірки основної пам'яті або номера регістра процесора. Принципи використання інформації з адресної частини команди визначає система адресації. Система адресації задає число адрес в команді і прийняті способи адресації.
Розрядності полів RAi і RCA розраховуються за формулами:
де Ni – кількість комірок пам'яті, до якого можна звернутися за допомогою i-ї адреси; NCA – кількість способів адресації.
Кількість адрес у команді. Для визначення кількості адрес, що включаються в адресну частину, використовуватимемо термін адресність. У «максимальному» варіанті необхідно вказати три компоненти: адреса першого операнда, адреса другого операнда і адреса комірки, куди заноситься результат операції. У принципі може бути додана ще одна адреса, що вказує місце зберігання наступної інструкції. У результаті має місце чотириадресний формат команди (рис. 14.3). Такий формат підтримувався у ОМ EDVAC, розробленою в 1940-х роках.
Рисунок 14.3 – Чотириадресний формат команди
У фон-нейманівских ОМ необхідність у четвертій адресі відпадає, оскільки команди розташовуються в пам'яті в порядку їх виконання, і адреса чергової команди може бути отримана за рахунок простого збільшення адреси поточної команди в лічильнику команд. Це дозволяє перейти до три адресного формату команди (рис. 14.4).
На жаль, і в триадресному форматі довжина команди може виявитися дуже великою. Так, якщо адреса комірки основної пам'яті має довжину 32 біта, а довжина коду операції – 8 біт, то довжина команди складе 104 біти (13 байт).
Рисунок 14. 4 – Триадресний формат команди
Якщо за умовчанням взяти за адресу результату адресу одного з операндів (зазвичай другого), то можна обійтися без третьої адреси, і у результаті отримуємо двоадресний формат команди (рис. 14.5). Природно, що в цьому випадку відповідний операнд після виконання операції втрачається.
Рисунок 14.5 – Двоадресний формат команди
Команду можна ще більш скоротити, перейшовши до одно адресного формату (рис. 14.6), що можливо у випадку виділення певного стандартного місця для зберігання першого операнда і результату. Зазвичай для цієї мети використовується спеціальний регістр центрального процесора (ЦП), відомий під назвою акумулятор.
Рисунок 14.6 – Одноадресний формат команди
Застосування єдиного регістра для зберігання одного з операндів і результату є обмежуючим чинником, тому крім акумулятора часто використовують і інші регістри ЦП. Оскільки число регістрів в ЦП невелике, для вказівки одного з них у команді досить мати порівняно коротке адресне поле. Відповідний формат носить назву півтораадресного або регістрового формату (рис. 14.7).
Рисунок 14.7 – Півтораадресний формат команди
Нарешті, якщо для обох операндів вказати чітко задане місцеположення, а також у разі команд, що не вимагають операнда, можна отримати нуль адресний формат команди (рис.14.8).
Рисунок 14.8 – Нульадресний формат команди
У такому варіанті адресна частина команди взагалі відсутня або не задіюється.
Вибір адресності команд. Під час вибору кількості адрес в адресній частині команди зазвичай керуються такими критеріями:
- ємністю запам'ятовуючого пристрою, яка потрібна для зберігання програми;
- часом виконання програми;
- ефективністю використання комірок пам'яті під час зберігання програми.
Для оцінки впливу адресності на кожен з перерахованих елементів скористаємося нижче вказаною методикою і зробимо відповідні висновки.
Адресність і ємність запам'ятовуючого пристрою. Якщо позначити кількість команд у програмі – NA, розрядність команди – RKA, індекс, що вказує адресність команд програми – А, то ємність запам'ятовуючого пристрою для зберігання програми EA можна оцінити із співвідношення:
З цих позицій оптимальна адресність команди визначається шляхом розв'язання рівняння:
за умови, що знайдене значення забезпечує мінімум EA. Доведено, що в середньому EA монотонно зростає із збільшенням А. Таким чином, під час вибору кількості адрес по критерію «ємність ЗП» перевагу слід віддавати одноадресним командам.
Адресність і час виконання програми. Час виконання однієї команди складається з часу виконання операції і часу звернення до пам'яті.
Для триадресної команди останнє підсумовується з чотирьох складових часу:
- вибірки команди;
- вибірки першого операнда;
- вибірки другого операнда;
- запису в пам'ять результату.
Одноадресна команда вимагає двох звернень до пам'яті:
- вибірки команди;
- вибірки операнда.
Як видно, на виконання одноадресної команди витрачається менше часу, чим на обробку триадресної команди, проте для реалізації однієї три адресної команди, як правило, потрібно три одноадресних.
Цих міркувань проте недостатньо, щоб однозначно віддати перевагу тому або іншому варіанту адресності. Визначаючим під час вибору є тип алгоритмів, на переважну реалізацію яких орієнтована конкретна ОМ. Можливі типи алгоритмів умовно розділимо на три групи: послідовні, паралельні, комбіновані.
Для послідовного алгоритму результат попередньої команди використовується в наступній. Потрібна всього одна команда попереднього засилання числа в суматор (акумулятор) на початку обчислення і одна команда пересилки результату в пам'ять в кінці обчислень. У послідовних алгоритмах найбільш вигідними виявляються одноадресні команди.
У паралельному алгоритмі результат попередньої команди не використовується в наступній і повинен бути відісланий в пам'ять. У цьому випадку доцільно орієнтуватися на триадресні команди.
У комбінованому алгоритмі обчислювальний процес утворюють як послідовні, так і паралельні частини. Тут найбільш переважними є одноадресні команди.
Двоадресні команди в плані часу реалізації алгоритмів займають проміжне положення між одноадресними і триадресними. Дещо кращі показники дають півтораадресні команди, в яких, з одного боку, зберігаються переваги одноадресних команд для послідовних алгоритмів, а з другого – підвищується ефективність реалізації паралельних і комбінованих алгоритмів.
Враховуючи вищевикладене, перевагу слід віддати одноадресним командам.
Як вже вказувалось, команда може включати від одного до чотирьох полів, які вказують адреси операндів. Варіанти інтерпретації бітів (розрядів) поля адреси з метою знаходження операнда називаються способами адресації. Коли команда вказує на операнд, він може знаходитись в самій команді, в основній або зовнішній пам’яті чи в регістровій пам’яті процесора. За роки існування комп’ютерів була створена своєрідна технологія адресації, яка передбачає реалізацію різних способів адресації, чому послужило ряд причин:
- забезпечення ефективного використання розрядної сітки команди;
- забезпечення ефективної апаратної підтримки роботи з масивами даних;
- забезпечення задання параметрів операндів;
- можливість генерації великих адрес на основі малих.
Існує велика кількість способів адресації. Розглянемо основні та найвживаніші способи адресації: безпосередню, пряму, непряму, відносну, базову, індексну, автоінкрементну, та автодекрементну, сторінкову, стекову. Практично у всіх існуючих комп’ютерах використовується один або декілька з цих способів адресації. Тому в команду потрібно вводити спеціальні ознаки з тим, щоб пристрій керування міг розпізнати використаний спосіб. Це можуть бути додаткові розряди в команді, або для різних типів команд закріплюватись різні способи адресації. Варіант формату команди з полями для розпізнавання типу адресації представлено на рис. 14.9, де ТА1 - поле, яке вказує тип адресації, який використано в полі Al, а ТА2 - поле, яке вказує тип адресації, який використано полі А2.
Рисунок 14.9 – Формат команди з полями для розпізнавання типу адресації
Оскільки адреса підлягає обробці, розрізняють поточну Ат та виконавчу Ав адреси. Остання отримується як результат обробки (модифікації) поточної адреси Ат: Ав = Fi(Ат). Функція Fi задає спосіб модифікації поточної адреси залежно від способу адресації.
При безпосередній адресації операнд знаходиться безпосередньо в адресній частині команди (рис. 14.10), розрядність якої рівна розрядності операнда.
Рисунок 14.10 – Безпосередня адресація
Це найшвидший спосіб знаходження операнда, оскільки для його отримання потрібне лиш одне звернення до пам’яті. Він використовується для задання констант, наперед відомих чисел або початкових значень змінних. Недоліком є те, що розрядність операнда обмежується розрядністю поля адреси в команді, яке в більшості випадків є значно меншим розрядності даних.
При прямій (або абсолютній) адресації в адресному полі прямо вказується місце розміщення операнда, тобто виконавча адреса операнда. При цьому можливі два випадки: пряма адресація основної пам’яті ОП, та пряма адресація регістрів регістрового файлу процесора.
В першому випадку адреса А комірки основної пам’яті із адресної частини АЧ команди поступає на адресні входи основної пам’яті ОП (рис. 14.11 а) і у вказану комірку в режимі запису записується операнд із регістра даних РгД, а в режимі зчитування зчитується операнд в регістр даних РгД.
В другому випадку адреса R регістра регістрового файлу процесора із адресної частини АЧ команди поступає на адресні входи регістрового файлу процесора (рис. 14.11 б), і у вказаний регістр в режимі запису записується операнд із регістра даних РгД, а в режимі зчитування зчитується операнд в регістр даних РгД.
Рисунок 14.11 – Пряма адресація основної пам'яті а) та регістрового файлу процесора б)
Якщо основна пам’ять може зберігати М слів, то, використовуючи двійкове кодування, необхідно m біт для представлення адрес всіх комірок пам’яті, де m = ]log2М[. Значення в дужках означає більше ціле. Якщо регістровий файл має N регістрів, то, використовуючи двійкове кодування, необхідно n біт для представлення адрес всіх регістрів, де n = ]log2N[. Оскільки число регістрів значно менше кількості комірок пам’яті, то і розрядність адреси для їх адресації буде значно меншою, а відповідно значно меншою буде і розрядність команди в цілому. Нехай для прикладу кількість виконуваних в комп’ютері команд рівна 256, тобто розрядність коду операції рівна 8 бітів, ємність основної пам’яті рівна 1ГБ, тобто розрядність адреси рівна 30 бітів, а кількість регістрів регістрового файлу процесора рівна 64, тобто розрядність адреси рівна 6 бітів. На рис. 14.12 показано формати двоадресних команд при прямій адресації основної пам’яті та регістрового файлу процесора для наведеного прикладу.
Рисунок 14.12 – Формати двоадресних команд при прямій адресації основної пам'яті та регістрового
файлу процесора для наведеного прикладу
Як видно з рисунка, в першому випадку розрядність команди рівна 68 бітів, тоді як в другому випадку розрядність команди рівна 20 бітів, тобто менша в 3,4 рази.
Для того, щоб розпізнати який тип пам’яті адресується – основна пам’ять чи регістровий файл процесора, до команди вводиться спеціальне поле типу пам’яті ТП, як це показано на рис. 14.13.
Рисунок 14.13 – Команда з полем, яке вказує тип пам'яті
При непрямій адресації в адресному полі вказується місце розміщення адреси операнда, а виконавча адреса знаходиться наступним чином: А = [А1], де А1 - адреса комірки пам’яті, в якій зберігається виконавча адреса. Адреса А із адресної частини АЧ команди поступає на адресні входи основної пам’яті ОП (рис. 14.14), з відповідної комірки основної пам'яті ОП вибирається адреса операнда, по якій в відповідну комірку або регістр в режимі запису записується операнд із регістра даних РгД, а в режимі зчитування зчитується операнд в регістр даних РгД. Якщо пам’ять може зберігати М слів, то, використовуючи двійкове кодування, необхідно m біт для представлення всіх адрес, де m = ]log2M[. Значення в дужках означає більше ціле. Для вибірки операнда необхідно здійснити два звернення до ОП.
Рисунок 14.14 – Непряма адресація основної пам'яті, яка вимагає здійснення двох звернень
Для зберігання адрес операндів можна використати регістровий файл процесора (рис. 14.15). Якщо регістровий файл може зберігати N слів, то, використовуючи двійкове кодування, необхідно n біт для представлення непрямої адреси в адресній частині команди, де
n =]log2N[, а розрядність регістрів буде рівною m = ]log2M[. Значення в дужках означає більше ціле. Для вибірки операнда необхідно здійснити одне звернення до регістрової пам’яті і одне звернення до основної пам’яті ОП. Такий підхід дозволяє при малій розрядності адресної частини команди n звертатися до пам’яті великої ємності маючи велику розрядність регістрів m.
Рисунок 14.15 – Непряма адресація основної пам'яті з використанням регістрового файлу процесора
Потрібно відзначити, що використання регістрової пам’яті також дозволяє суттєво прискорити процес визначення ефективної адреси, оскільки час вибірки з неї значно менший порівняно з часом вибірки з основної пам’яті.
Можливе використання так званої багаторівневої або каскадної непрямої адресації, коли для знаходження ефективної адреси потрібно виконати кілька звернень до пам’яті. Кількість кроків звернення до пам’яті, необхідних при і-рівневій непрямій адресації, називається рангом rі. Розрізняють перший, другий і т. д. ранги. Пряма адресація - це адресація нульового рангу (r0).
Непряма адресація служить для зменшення довжини програми з великою кількістю змінних адрес.
При використанні адресації на основі операції зміщення виконавча адреса формується шляхом додавання вмісту одного з адресних полів команди до вмісту одного або декількох регістрів процесора, або шляхом виконання операції конкатенації, тобто приєднання старшої частини адреси до молодшої. Нижче розглядаються способи адресації на основі операції зміщення.
При відносній адресації для отримання виконавчої адреси операнда вміст D адресного поля команди додається до вмісту програмного лічильника ПЛ, як це показано на рис. 14.16. Тобто вміст адресного поля команди є зміщенням відносно адреси поточної команди. Даний тип адресації ґрунтується на тому, що при вибірці команд звернення відбувається до комірок пам’яті, розміщених поблизу одна від одної. Тим самим зменшується довжина адресної частини команди, оскільки довжина поля зміщення може бути досить малою. Більше того, при переміщенні програми в пам’яті значення зміщення не змінюється, оскільки взаємне розміщення в пам’яті команд програми при цьому не змінюється.
Рисунок 14.16 – Адресація основної пам'яті з використанням відносної адресації
Цей тип адресації іще називається відносною адресацією з перемінною базою, оскільки тут в якості регістра бази використаний програмний лічильник і модифікація базової адреси здійснюється автоматично.
При використанні базової адресації (або базування) адресна частина команди вміщує два поля. В першому полі знаходиться адреса В регістра із регістрового файлу процесора, в якому зберігається база, до якого додається зміщення D із другого поля і тим самим формується виконавча адреса операнда (рис. 14.17). Ця адреса поступає на адресні входи основної пам’яті ОП, у відповідну комірку якої в режимі запису записується операнд із регістра даних РгД, а в режимі зчитування зчитується операнд в регістр даних РгД.
Даний спосіб адресації дозволяє працювати з операндами із деякого сегмента пам’яті не змінюючи базу. Він ефективний при потребі обробки масиву даних. В якості бази тут виступає адреса першого елементу масиву, а всі інші його елементи вказуються шляхом додавання зміщення до адреси першого елементу масиву.
Якщо основна пам’ять може зберігати М слів, регістровий файл процесора може зберігати N слів, а сегмент має розмір L слів, то, використовуючи двійкове кодування, поле В буде займати n біт, де n = ]log2N[, поле D буде займати l біт, де l = ]log2L[, а розрядність регістрів буде рівною m = ]log2М[. Значення в дужках означає більше ціле.
Рисунок 14.17 – Базова адресація ОП з використанням бази із регістрової пам'яті
Основна перевага відносної адресації - скорочення довжини команди за рахунок зменшення її адресної частини, а також спрощення розподілу пам’яті при написанні складних програм шляхом добавлення до кожного фрагменту програми відповідного значення базової адреси. Таким чином забезпечується переміщуваність фрагментів програми в полі пам’яті.
Індексна адресація використовується при виконанні циклів, коли потрібно збільшення або зменшення адреси на деяку величину. Цей спосіб адресації подібний до відносної адресації, при якій адреса може автоматично змінюватися в процесі виконання програми. Індексація є засобом для багатократного виконання одних і тих же відрізків програми над різними наборами (масивами) вхідних даних. Тим самим забезпечується мінімальна залежність довжини програми від кількості повторюваних відрізків програми. При цьому коди команд програми залишаються без змін. Для отримання виконавчої адреси адресна частина команди додається до вмісту спеціального регістра, в якому зберігається номер оброблюваного масиву чисел. Ці регістри називають індексними, а їх вміст - індексною величиною, або індексом (рис. 14.18).
Рисунок 14.18 – Формування адреси при використанні індексної адресації
Вказівка про індексну адресацію вміщується в полі типу адресації. При наявності кількох індексних регістрів в цих розрядах команди вказується номер того індексного регістра, в якому зберігається значення індексу оброблюваного в даний час масиву інформації. Індекси можуть зберігатися як в спеціальних індексних регістрах, так і в регістровій пам’яті процесора. Вміст індексних регістрів змінюється після закінчення деякого циклу обробки. При цьому до попереднього значення індексу добавляється приріст, значення якого залежить від розміщення операндів в пам’яті.
Різновидністю індексної адресації є автоіндексація, при якій значення індексу є відомим наперед. Найчастіше операнди розміщуються в пам’яті послідовно і тому це значення рівне +1 (так звана автоінкрементна адресація) або -1 (так звана автодекрементна адресація). Порядок формування адреси при використанні автоінкрементної та автодекрементної адресації показано на рис. 14.19, де для забезпечення переміщення по комірках пам’яті використовується лічильник.
Рисунок 14.19 – Формування адреси при використанні автоінкрементної
та автодекрементної адресації
Операції індексної арифметики виконуються в спеціальному індексному арифметичному пристрої, або в арифметико-логічному пристрої процесора. Команди індексної арифметики входять до складу команд керування. Вони забезпечують зміну значення індексу шляхом добавлення до нього приросту, перевірку закінчення індексного циклу та засилання початкових значень індексу. Значення індексів, приростів та інформаційні біти циклів формують керуюче слово, яке розміщується в одній або декількох командах керування. Послідовність таких управляючих слів забезпечує роботу з масивами даних.
При сторінковій адресації адресний простір пам’яті розбивається на сторінки рівного розміру. Сторінка має початкову адресу, яка використовується в якості бази та зберігається в спеціальному регістрі, який називається регістром адреси сторінки. В адресній частині команди вказується зміщення всередині сторінки, яке є молодшою частиною виконавчої адреси. Тобто виконавча адреса формується шляхом приєднання (конкатенації) зміщення з адресної частини команди до початкової адреси. База може зберігатися в одному з регістрів загального призначення, як це показано на рис. 14.20. Число з цього регістра береться в якості старших розрядів срА адреси, а зміщення з адресної частини команди - в якості молодших розрядів мрА адреси.
Рисунок 14.20 – Формування адреси при використанні сторінкової адресації
Існують способи адресації, при яких код адреси операнда в явному вигляді в команді відсутній. Так, використання одноадресного формату команди привело до того, що в команді адресується лише один з операндів, інші ж при цьому визначаються самим кодом операції. Наприклад, при виконанні арифметичних операцій адреса одного з операндів вказується в адресній частині команди, а інший операнд знаходиться в акумуляторі. Адреса останнього в команді не вказується, а є відомою наперед.
Неявна адресація дозволяє скоротити довжину команди, тому знайшла широке використання.
Зменшення довжини команди скорочує час виконання і економить пам’ять. Межею зменшення є безадресні команди, які можливі при використанні стекової адресації. Стекова адресація використовується в безадресних командах при роботі з масивами даних.
Широко використовується в мікропроцесорах і мікрокомп’ютерах. Принципи організації стекової адресації ілюструє рис. 14.21.
Рисунок 14.21 – Стекова адресація
Стек - це набір комірок пам’яті або регістрів, в яких дані масиву розміщуються в заданому порядку, а саме відповідно до правила організації пам’яті з послідовним доступом типу FILO. Місце розміщення першого даного масиву називається дном стека, а останнього - вершиною стека. Для запису та читання даних передбачено дві операції: push (вштовхування даних в стек) та pop (виштовхування даних зі стеку). Операції зовнішнього запису та читання можливі тільки з вершиною стека. На її номер вказує вміст вказівника стека. При запису всі дані в стеку зміщуються на одну позицію вниз, а при зчитуванні зміщуються на одну позицію вверх. На рисунку 14.22 показано функціонування стека при запису та зчитуванні даних при виконанні двомісної операції множення числа 50 на число 10 в арифметико-логічному пристрої із записом результату в стек.
Рисунок 14.22 – Виконання двомісної операції з використанням стека