17 ФОРМАТИ КОМАНД КОМП'ЮТЕРІВ
17 ФОРМАТИ КОМАНД КОМП'ЮТЕРІВ
Як було сказано вище, крім коду операції до складу команди входить адресна частина. Цією частиною визначається місце знаходження даних, над якими виконується операція, задана кодом операції. Даних може бути декілька, і, крім того, вони можуть знаходитись в основній пам’яті, в регістрах процесора чи в запам’ятовуючих елементах інших вузлів комп’ютера. Тому і формати команд в цих випадках будуть різними. Можна здійснити класифікацію архітектури комп’ютера за типом адресованої пам’яті. Залежно від того, який тип пам’яті адресується, розрізняють наступні типи архітектур комп’ютера: стекова, акумуляторна, на основі регістрів загального призначення.
В стековій архітектурі (рис. 17.1) операнд завжди знаходиться у вершині стеку - спеціальному регістрі пам’яті, з якого загружається в регістр процесора, або через нього результат операції загружається в пам’ять. Стек представляє собою пам’ять з детермінованою вибіркою, яка працює за принципом «останній прийшов - перший вийшов» (LIFO - Last In First Out). Стек виконує дві операції: push - вштовхування даних в стек, pop - виштовхування даних з стеку.
Рисунок 17.1 – Стекова архітектура
Інформація може бути занесеною у вершину стека з пам’яті або з регістра АЛП процесора. Перевага стекової архітектури - відсутність у команді адресної частини. З іншого боку, стекова архітектура не передбачає довільного доступу до комірок пам’яті, тому часто важко створити для неї ефективну програму. Крім того, стек не дозволяє підвищити продуктивність комп’ютера за рахунок розпаралелювання, оскільки наявна лише одна вершина стека.
Стекова архітектура була реалізована в наступних комп’ютерах: В5500, В6500 фірми Burroughs, НР2116Р, НРЗ 000/70 фірми Hewlett-Packard, JEM 1, JEM 2 фірми Аjile Systems.
В акумуляторній архітектурі (рис. 17.2) операнд завжди знаходиться в акумуляторі - спеціальному регістрі процесора. В цей же регістр записується і результат операції. Оскільки адреса одного із операндів визначена, в команді достатньо вказати лише адресу другого операнда. Перевага даної архітектури - короткі команди. Вона була реалізована в комп’ютерах IBM 7090, DEC PDP-8 та інших.
Рисунок 17.2 – Акумуляторна архітектура
Архітектура на основі регістрів загального призначення може мати такі різновидності як: архітектура типу пам’ять-пам’ять, регістр-пам’ять та регістр-регістр.
В архітектурі типу пам’ять - пам’ять (рис. 17.3) операнди поступають на вхідні регістри АЛП процесора прямо з пам’яті. Результат операції також записується прямо в пам’ять. Оскільки час звернення до пам’яті є більшим часу звернення до регістрів, ця архітектура характеризується низькою швидкодією. Прикладом таких комп’ютерів є сім’ї IBM System/370 та DEC VAX.
Рисунок 17.3 – Архітектура типу пам’ять-пам’ять
Архітектура типу регістр-пам’ять (рис. 17.4) передбачає вибірку та подачу в АЛП одного із операндів з пам’яті, а іншого - з регістра, тому характеризується вищою швидкодією ніж попередня. Тут в процесорі наявна регістрова пам’ять, причому регістри є програмно доступними.
Рисунок 17.4 – Архітектура типу регістр-пам’ять
В архітектурі типу регістр-регістр (рис. 17.5) дані в АЛП поступають лише з регістрів процесора, результати виконання операцій також записуються в регістри, а обмін між цими регістрами і пам’яттю здійснюється паралельно з роботою АЛП. Ця архітектура характеризується високою швидкодією, оскільки операції виконуються в АЛП з їх читанням-записом до регістрів, які є значно швидшими пам’яті. Крім того, для цієї архітектури характерною є фіксована довжина команд та однакова кількість тактів для виконання всіх команд.
Рисунок 17.5 – Архітектура типу регістр-регістр
Будь-який із регістрів загального призначення може бути використаний в якості акумулятора, адресного регістра, індексного регістра, стекового регістра, а в деяких машинах навіть в якості програмного лічильника. Більшість сучасних комп’ютерів побудовані на основі описаної архітектури. Це, зокрема, комп’ютери Pentium, SPARC, Power PC, ARM та інші.
Разом з тим, за регістрами можуть бути закріплені конкретні функції - один набір служить в якості індексних регістрів, інший призначений для зберігання арифметичних операндів і т. д. Таким чином організовані регістри в комп’ютерах сім’ї CDC 6000/7000.
Таким чином, при роботі з основною пам’яттю в комп’ютерах використовуються нуль-, одно-, дво-, три- і чотириадресні команди (рис. 17.6).
Рисунок 17.6 – Формати команд комп’ютерів
Розглянемо роботу комп’ютера з різними форматами команд на прикладі команди додавання двох чисел, яка найширше використовується. Нехай потрібно додати в АЛП число, яке знаходиться в пам’яті за адресою А, до числа, яке знаходиться в пам’яті за адресою В, і результат розмістити за адресою С:
С := [А] + [В].
В табл. 17.1 показана послідовність команд, які потрібно виконати при використанні трьох типів описаних архітектур для виконання операції додавання двох чисел.
Таблиця 17.1 – Послідовність команд для виконання операції додавання двох чисел.
Тут А, В і С - адреси комірок пам’яті, в яких знаходяться числа А, В, С; Rl, R2 і R3 - адреси регістрів процесора.
При використанні триадресної команди та архітектури типу “пам’ять-пам’ять” вона символічно може бути записана наступним чином:
ADD А, В, С.
Якщо використовується двоадресна команда та архітектура типу “пам’ять-пам’ять”, то для виконання поставленої задачі необхідно виконати дві команди:
ADD А, В, яка означає [А]:= [А] + [В],
MOVE А, С, яка означає [С]:= [А],
або дві команди:
MOVE В, С, яка означає [С]:= [В],
ADD А,С, яка означає [С] := [А] + [В].
Тут при виконанні двоадресної команди результат розміщується за адресою одного з операндів.
Одноадресна команда може бути реалізована з використанням акумуляторної архітектури. В цьому випадку операція С:= [А]+[В] може бути виконана послідовністю із трьох команд:
LOAD А, яка означає АКК := [А],
ADD В, яка означає АКК := [АКК] + [В],
STORE С, яка означає С := [АКК].
При використанні архітектури на снові регістрів загального призначення, кожен з цих регістрів може бути використаний як акумулятор. Якщо таких регістрів r (зазвичай r рівне 8, 16, 32, 64), в полі команди необхідно добавити log2r бітів (3-6 бітів) для адресації регістрів, що беруть участь у виконанні операції. Це значно менше, ніж для адресації комірок пам’яті. Якщо Ri - і-й регістр регістрового файлу процесора, то команди з акумулятором можна замінити наступними:
LOAD A, Ri, яка означає Рrі := [А],
ADD B,Ri, яка означає Рrі := [Рrі] + [В],
STORE Ri,A, яка означає [А] := [Рrі].
Такого типу команди, коли одна частина адресного поля адресує основну пам’ять, а друга - регістровий файл, іноді називаються півтора адресними. Часто в комп’ютерах використовуються команди, в адресній частині яких вказуються тільки номери регістрів, наприклад:
ADD Ri, Rj, яка означає Rj := Ri + Rj
В цьому випадку команда є найкоротшою в порівнянні з іншими, та виконується в процесорі найшвидше.
Головні критерії вибору формату команд:
- чим коротша команда, тим менша ємність пам’яті потрібна для її зберігання і тим менша розрядність шини команд;
- чим менша адресність команди, тим менше відбувається звернень до пам’яті, тобто тим більша швидкодія комп’ютера.
Зазвичай шукається компромісне (оптимальне) рішення, і враховується, що розмір команди повинен бути узгодженим з розміром даних, оскільки вони зберігаються в одній пам’яті.
В перших комп’ютерах використовувалась архітектура на основі регістрів загального призначення типу “пам’ять-пам’ять”. Але оскільки з розвитком елементної бази утворився великий розрив між швидкодією основної пам’яті та процесора, ця архітектура стала неефективною.
Після 1985 року більшість комп’ютерів будуються на основі архітектури типу регістр-пам’ять або регістр-регістр. Цьому є дві причини:
- перша - регістри процесора швидші пам’яті;
- друга - регістри простіше і ефективніше використовуються комп’ютером.
В цьому випадку найважливішим є те, що регістри можуть бути використані для зберігання змінних. Тоді зменшується об’єми обміну з пам’яттю і прискорюється виконання програми, оскільки регістри швидші пам’яті. Крім того, зменшується формат команди, оскільки адреса регістра коротша адреси пам’яті, тому що ємність регістрового файлу менша ємності ОП. Розробнику компілятора простіше працювати коли всі регістри регістрового файлу еквівалентні і загальнодоступні. В комп’ютерах перших поколінь регістри закріплювалися для конкретних цілей і тим самим число регістрів значно зменшувалось.
Яка кількість регістрів загального призначення є ефективною? Відповідь залежить від того, як вони використовуються компілятором. Більшість компіляторів використовують по декілька регістрів для роботи з формулами, зберігання параметрів та змінних.
Приклади комп’ютерів, в яких використовуються описані архітектури:
- регістр-регістр: SPARC, MIPS, Precision Architecture, Power PC, Alpha, Pentium IV, Athlon;
- регістр-пам’ять: Intel 80x86, Motorola 68000;
- пам’ять-пам’ять: VAX.
При розгляді систем команд будемо використовувати розповсюджені скорочені позначення типів команд: RR - регістр-регістр, RI - регістр-безпосередній операнд, RS – регістр - пам’ять, RX - регістр-індексована пам’ять, SI - пам’ять-безпосередній операнд, SS – пам'ять - пам’ять, а також позначення: КОП - код операції, R-регістр, S - пам’ять, X - індекс, В - базова адреса, D - зміщення, А - адреса пам’яті, L - довжина, С - номер символу в складному слові.
Формати команд комп’ютерів різних типів детально розглянуті в літературі та в технічній документації на ці комп’ютери. На рис. 17.7 показано три групи узагальнених форматів команд, які використовувалися та використовуються зараз в комп’ютерах: а - змінний, b - фіксований та с - гібридний формати.
Рисунок 17.7 – Використовувані в комп’ютерах формати команд
Для наочності використання різних типів описаних вище форматів команд, аналізу їх переваг та недоліків розглянемо кілька характерних прикладів форматів команд, які використовувалися раніше в різних поколіннях комп’ютерів та які використовуються в сучасних комп’ютерах.
В системі IBM 370 використовувалися три варіанти довжини команди: двобайтова, чотирибайтова, шестибайтова. Також використовувалися два варіанти довжини коду операції: однобайтовий та двобайтовий. В сумі це складає десять різних форматів команд. На рис. 17.8 наведено формати команд комп’ютерної системи IBM 370.
Тип формату команди вказується першими двома розрядами коду операції КОП: 00 - RR; 01 - RX; 10 - RRE, RS, RX, S, SI; 11 - SS, SSE. Коротко опишемо кожен тип команди.
Команда регістр-регістр RR. Цей формат команди є двобайтовим. В адресній частині звернення відбувається до регістрів. Оскільки багато операцій виконується з використанням регістрів, такий формат при своїй компактності є досить ефективним.
Рисунок 17.8 – Формати команд комп'ютерної системи IBM 370
Розширена команда регістр-регістр RRE (Е - Extended). Цей формат використовується для декількох спеціальних привілейованих команд операційної системи. Розширений код операції дозволяє виконання додаткових операцій. Поле після коду операції не використовується.
Команда регістр-індексована пам’ять RX. За цією командою перший операнд знаходиться в регістрі, а другий операнд обчислюється шляхом додавання 12-розрядного зміщення D2 до вмісту регістра бази В2 та індексного регістра Х2. Обидва регістри належать до регістрів загального призначення.
Команда регістр-пам’ять RS. Ця команда має триадресний формат. Тут також є три звернення до регістрів, але вони вказують на три різних операнди. Третій регістр використовується як регістр бази, до якого додається зміщення.
Команда пам'ять-безпосередній операнд SI (І - Immediate). Тут адреса першого операнда вираховується шляхом додавання зміщення до бази, а другий операнд знаходиться безпосередньо в 8-розрядному полі адреси.
Команда пам’ять S. Це привілейована команда, яка використовується для введення-виведення або системою контролю функцій. Тут використовується розширений 16-розрядний код операції. Адреса другого операнда вираховується шляхом додавання зміщення до бази. Адреса ж першого операнда, якщо він є, вказується кодом операції.
Команда пам’ять-пам’ять SS. Ця команда займає 6 байт і вказує на два операнди, розміщені в пам’яті. Наступні після коду операції 8 біт можуть бути використані трьома варіантами: в форматі одиночної довжини (0L) поле L вказує кількість байт, які будуть оброблені; в форматі подвійної довжини (EL) поле L вказує довжину двох операндів у байтах (цей формат використовується для команд десяткової арифметики; третій варіант (RS) використовується в декількох привілейованих командах, в яких другий байт вказує на два регістри загального призначення. Ці регістри вміщують покажчики або іншу керуючу інформацію.
Розширена команда пам’ять-пам’ять SSE. Цей формат також використовується в декількох привілейованих командах з розширеним кодом операції. Адреса першого та другого операндів вираховується шляхом додавання зміщення до бази.
Розглянемо іще одну систему команд, яка використовувалась в комп’ютері Cyber-70 (рис. 17.9). Її відмінністю від інших є нестандартна довжина розрядної сітки, кратна трьом.
Рисунок 17.9 – Формат команди комп'ютера Cyber-70
Тут А - адреса пам’яті, R - адреса регістра, L - довжина операнда, С - номер символу в складному слові, N - число. Також використовуються дві довжини коду операції: шести- та дев’ятирозрядний. В сумі використовується п’ять різних форматів команди. Перший дозволяє одночасно адресувати три регістри, другий адресує один регістр та вміщує число, що підлягає обробці, третій адресує два регістри та пам’ять і є в два рази довший, так само, як і четвертий формат, який адресує один регістр і пам’ять, але має довший код операції. Іще в два рази довшим є п’ятий формат команди, який вказує дві адреси пам’яті та параметри відповідних чисел - довжину і номер в складному слові.
Формати команд сучасного комп’ютера на прикладі комп’ютера DLX, який є узагальненням цілого спектра сучасних комп’ютерів, подано на рис. 17.10.
Рисунок 17.10 – Формати команд комп’ютера DLX
Дамо коротке пояснення щодо наведених на рисунку форматів команд.
- Команда типу І опрацьовує безпосередній операнд (Immediate).
- Команда типу R отримує пару операндів із джерельних регістрів (Registers) регістрового файла процесора та повертає результат знов таки до регістра призначення цього файла.
- Команда типу J є командою безумовного переходу (Jump).
- Opcode є полем коду операції КОП, довжина якого становить 6 бітів.
- rsl, rs2 є полями з довжиною 5 бітів, що визначають номери регістрі в-джерел операндів (register of source) та програмно вибираються серед регістрів R0...R31 регістрового файла.
- rd є п’ятибітовим полем номера регістра призначення, приймача результату дії (register of destination). Регістр призначення також вибирають із множини R0...R31 регістрового файла.
- Immediate - це 16-бітове поле, що містить безпосередній операнд. При цьому лівий розряд immediate розглядають як знаковий. При використанні безпосередній операнд розширюють вліво за правилами доповняльного коду до 32-х бітів.
- Function - це поле, що визначає функцію, яка розширює на 2й - 1 = 2047 комбінацій обмежену кількість дозволених кодів операції.
- Offset added to PC - це 26-бітова константа, яку додають до вмісту регістра наступної адреси при виконанні команди безумовного переходу.
Особливості форматів команд комп’ютера DLX:
- Довжина усіх форматів - 32 біти.
- Реалізовано тип архітектури регістр-регістр.
- Реалізовано фіксовану систему поділу форматів на поля.
- Усі команди з погляду їхньої обробки поділено на три групи: операції АЛП, операції зчитування/запису, операції керування виконанням програми.
Формати команд АЛП є триадресними, а саме, OP RX,RY,RZ. Вони є майже збіжними з форматами команд мікропроцесора М88Х00 фірми Motorola. Останній, разом із мікропроцесорами ІВМ801 та AMD29000 у середині 80-х років склав історично першу трійку серійних комп’ютерів з архітектурою RISC.
При розробці комп’ютера необхідно враховувати багато особливостей вибору системи команд. З одного боку система команд повинна бути функціонально повною, тобто комп’ютер повинен забезпечувати виконання всіх заданих функцій. З іншого боку система команд має бути ортогональною, тобто не повинна бути надлишковою. Для нового комп’ютера, який є розширенням відповідної серії, першочерговою є сумісність програми, які виконуються на одному комп’ютері, повинні виконуватись і на іншому комп’ютері. Для збільшення терміну використання важливим є розширення адресного діапазону та однорідності адресного простору. І, нарешті, важливим є розмір та організація самого формату команди. Розглянемо ці особливості детальніше
Є багато рівнів повноти системи команд. На найнижчому рівні всі комп’ютерні операції можуть бути виконані на базі операції інверсії логічного множення (NAND). Відповідно команда умовного переходу, яка також зберігає вміст програмного лічильника, забезпечує виконання всіх пересилок в комп’ютері. Тому можна створити повну систему команд на базі цих операцій. Теоретично система команд комп’ютера може включати лише одну команду. Відомий комп’ютер з назвою Single Instruction Computer (SIC), який є прикладом комп’ютера з нижньою межею кількості команд Єдиною командою SIC є команда "відняти та перейти за умови, що отримано негативний результат” (Subtract and Branch if Negative). Зрозуміло, що коли “запрограмувати” цією командою усі інші команди деякої реальної машини, то шляхом повного перебирання можна довести повноту системи команд, яку складено лише з однієї команди sbn. Недоліки SIC є зрозумілими, принаймні, на прикладі програмування однією командою операції множення (ділення тощо). Тобто програми на базі простих операцій є дуже складними.
Існує фундаментальний зв’язок між простотою процесора і складністю програми. Оскільки, як було показано вище, виконувати обробку даних з застосуванням однієї команди недоцільно, в реальних комп’ютерах застосовується система команд, до складу якої входить широкий спектр команд обробки даних, переміщення даних, передачі керування та введення-виведення.
В ранніх комп’ютерах розробники старалися включити в систему команд максимальну їх кількість з тим, щоб забезпечити програмістам гнучкість та можливість вибору найдоцільнішої для конкретного випадку команди. Але з ростом досвіду та з проведених досліджень стало зрозумілим, що далеко не всі можливі команди доцільно включати в систему команд комп’ютера. Адже, з одного боку, це ускладнює формат команди, а в результаті і сам комп’ютер, а з іншого боку, багато команд дуже рідко використовуються на практиці. Тому кращим є варіант реалізації таких команд на основі інших. Для прикладу на рис. 17.11 подано середню частоту використання команд передачі керування в різних задачах при обробці даних з фіксованою (темніший колір лінії) та з рухомою комою (світліший колір лінії).
Рисунок 17.11 – Середня частота використання команд передачі керування
Як видно з рисунка, найчастіше використовуються команди умовного переходу, тоді як команди звертання до підпрограм і особливо команди безумовного переходу використовуються досить рідко. Зрозуміло, що при потребі скорочення кількості команд доцільно залишити саме команди умовного переходу. Більше того, зважаючи на частоту використання при реалізації, доцільно шукати шляхи прискорення виконання саме цих команд. Проаналізуємо далі самі команди умовного переходу, оскільки їх є декілька типів, і кожен тип також має свою частоту використання (рис. 17.12).
Рисунок 17.12 – Середня частота використання різних типів команд умовного переходу
Як видно з рисунка, деякі типи команд умовного переходу в вибраних тестових програмах не використовуються взагалі (команда «більше ніж» для чисел з фіксованою та рухомою комою, команда «більше ніж або рівне» для чисел з рухомою крапкою), або використовуються досить рідко. Оскільки ці команди взаємозамінні, немає сенсу реалізації їх всіх і доцільно обмежитись найуживанішими. Подібний аналіз проводиться і для інших типів команд з метою оптимізації системи команд комп’ютера.
Ортогональність характеризує незалежність команд. Набір команд є ортогональним, якщо існує тільки один простий шлях виконання набору операцій. Наприклад, для виконання арифметичних операцій можуть бути використані базові булеві операції, але час їх виконання в цьому випадку буде дуже великим. Це означає, що існування арифметичних операцій поряд з булевими не порушує ортогональності.
Існують спеціальні оптимізуючі компілятори, які слідкують за повнотою системи команд та їх ортогональністю.
Сумісність як і повнота та ортогональність має багато рівнів. Це може бути сумісність по вихідному коду, або по одному з об’єктних кодів. Близьким до сумісності є поняття взаємозамінності, тобто можливості виконання тієї ж програми на різних апаратних засобах.
В перших поколіннях комп’ютерів програми писались на асемблерній мові. Тому архітектура системи команд часто будувалась виходячи з потреби спрощення програмування на асемблері. Сьогодні переважна частина програм пишеться на мовах високого рівня. Для їх переведення в машинні команди використовуються спеціальні програми, які називаються компіляторами. Перші компілятори створювались для вже існуючих комп’ютерів з конкретною системою команд. Оскільки від компілятора значною мірою залежить продуктивність комп’ютера, розуміння технології компілювання сьогодні є вкрай необхідним для проектування ефективної системи команд. Тому в подальшому розглянемо питання вибору складу системи команд комп’ютера з точки зору ефективного компілювання та виконання на ньому програм мовами високого рівня.
Структура сучасного компілятора показана на рис. 17.13. Перша процедура передбачає перехід з мови програмування високого рівня до деякої простої проміжної мови І є залежною від мови програмування та незалежною від апаратних засобів комп’ютера.
Рисунок 17.13 – Структура компілятора
Під час виконання другої процедури здійснюється оптимізація коду представленого проміжною мовою, зокрема розкриваються звернення до підпрограм та циклів. Ця процедура також залежить від типу проміжної мови та не залежить від апаратних засобів комп’ютера.
На третій процедурі виконується глобальна оптимізація з врахуванням базових архітектурних принципів побудови комп’ютера. Тут здійснюється прив’язка до конкретних типів комп’ютерних пристроїв. На останній процедурі здійснюється детальний вибір команд та машинно-залежна оптимізація.