16.1 Класифікація команд за типами операцій

Фіксований набір команд конкретного мікропроцесора називають системою команд. Функціональні можливості процесора визначаються сукупністю базових команд з різними кодами операцій. Загальна кількість команд (кодів операції) в системі завжди більше числа базових команд. Наприклад, до базової команди належить команда MOV dst, scr, яка забезпечує функцію пересилання даних з джерела scr в приймач dst. Таких команд в системі може бути дуже багато. Система команд представляється у вигляді таблиці. Таблиця може мати різну структуру, однак зазвичай вона містить такі відомості про команду:

- мнемонічне позначення команди, що представляє собою скорочений запис назви команди. Для цього використовуються 3 - 4 латинські букви назви операції, виконуваної командою. Мнемоніка є зручною формою подання коду операції команди. Також вона використовується при описі команди на мові асемблера. Програма асемблера перетворює мнемонічне позначення кодів операції до відповідних виконавчі еквіваленти;

- шіснадцяткові коди команд;

- вплив виконаної команди на прапори регістра стану програми;

- число байтів в команді і число машинних циклів і тактів , що витрачаються на виконання команди;

- словесний і (або) символьний опис виконуваної командою операції.

Часто для зручності систему команд розбивають на окремі групи за функціональною ознакою. Наприклад, систему команд мікропроцесора КР580ВМ80, що містить 78 базових команд, розбивають на 5 груп.

Команди можуть бути класифіковані відповідно до ініційованих ними типів операцій (рис. 16.1).

Рисунок 16.1 – Класифікація команд за типами операцій


 

Команди обробки даних ініціюють:

- арифметичні операції (додавання, віднімання, множення та ділення) над скалярними, тобто одиночними даними, та над векторами даних (деякою кількістю даних);

- логічні операції (логічне множення, додавання, інверсія, і т.д.) над окремими розрядами даного, скалярними даними та над векторами даних;

- операції зсуву (вправо, вліво) над скалярними та над векторними даними;

- операції перетворення даних (перетворення із формату з фіксованою в формат з рухомою комою і навпаки, і т. д.);

- операції над символами та стрічками символів.

Команди переміщення даних, включаючи команди звертання до пам’яті, ініціюють:

- операції переміщення даних в регістрах та стеках над скалярами та векторами;

- команди вибірки даних з пам’яті та запам’ятовування даних в пам’яті;

- команди вибірки адрес з пам’яті та запам’ятовування адрес в пам’яті;

- команди вибірки команд з пам’яті та запам’ятовування команд в пам’яті.

Команди передачі керування змінюють логічний потік ходу програми. До них належать наступні команди: переходу; розгалуження, шляхом виконання операцій порівняння та перевірки; звернення до підпрограм.

Команди введення-виведення ініціюють операції введення та виведення даних та команд.

Розглянемо деякі типи команд детальніше.

16.2 Команди обробки даних

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

До арифметичних належать також наступні операції над одиночними операндами: взяття абсолютної величини від операнда (absolute); інверсія знаку операнда (negate); прирощення операнда на одиницю (increment); зменшення операнда на одиницю (decrement).

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

До складу команд обробки даних більшості комп’ютерів входить велика кількість операцій зсуву над скалярними даними та векторами даних.

Операції перетворення даних змінюють формат представлення даних. Це може бути перетворення із формату з фіксованою в формат з рухомою комою і навпаки, перетворення із двійкової в десяткову систему і т. д.

Операції над символами та стрічками символів передбачають обробку символьних даних і інші.

В табл. 16.1 наведено перелік та функції арифметичних та логічних команд комп’ютера DLX, запропонованого Д. Паттерсоном та Д. Хеннессі в якості навчальної моделі сучасного комп’ютера.

 

Таблиця 16.1 – Перелік та функції арифметичних та логічних команд комп’ютера DLX

16.3 Команди переміщення даних

Команди переміщення даних належать до базових команд комп’ютера. Вони здійснюють передачу даних з одного місця в інше. Ці команди вказують:

- місце розміщення операндів - основна пам’ять чи регістр;

- адреси розміщення операндів в основній пам’яті або в регістровому файлі;

- методи адресації кожного операнда;

- кількість даних, що підлягають переміщенню;

- розрядність даних, які мають бути передані.

В системах команд різних комп’ютерів це зроблено по різному. Наприклад, в деяких комп’ютерах місце розміщення операндів вказується в полі коду операції, в інших - в адресному полі. В табл. 3.2 як приклад наведені команди переміщення даних комп’ютера IBM S/370.

 

Таблиця 16.2 – Команди переміщення даних комп’ютера IBM S/370

Тут наведено два типи команд переміщення - зчитування даних (Load) та запам’ятовування даних (Store). Вказується також розмір даних: character - 8-розрядні дані, halfword - 16-розрядні дані, short - 32-розрядні дані, long - 64-розрядні дані. Для задання номера регістра в регістровому файлі процесора та номера комірки основної пам’яті, при написанні команди ці номери (адреси) записуються справа від мнемонічного коду операції, наприклад L105,R4 означає передачу даного з комірки пам’яті 105 до регістра R4. Потрібно зазначити, що в комп’ютері IBM S/370 є, крім регістрового файлу для цілочислових даних, також регістровий файл для даних з рухомою комою. Для позначення цих регістрів в табл. 16.2 використана абревіатура РК, що означає “рухома кома”.

Для порівняння в табл. 16.3 як приклад наведені команди переміщення даних комп’ютера з спрощеною системою команд DLX. Видно, що тут додались команди обміну між регістрами з фіксованою та рухомою комою.

 

Таблиця 16.3 – Команди переміщення даних комп’ютера DLX.

16.4 Команди передачі керування

Як уже зазначалося, кожна команда має дві фази виконання. Перша фаза - це вибірка команди. На цій фазі за вмістом ПЛ з пам’яті в РгК вибирається команда. На другій фазі, яка називається виконанням команди, дешифрується код операції і виконується команда, тобто із основної пам’яті вибираються операнди, виконується арифметична чи логічна операція і запам’ятовуються результати обчислень. На другій фазі при послідовному виконанні команд вміст ПЛ збільшується на одиницю, та вказує адресу наступної команди. На рис. 16.2 показано виконання операції віднімання від вмісту комірки А основної пам’яті вмісту комірки В з запам’ятовуванням результату в комірці С, тобто (С) (А) - (В), з використанням двоадресного формату, коли три команди розміщені в послідовних комірках пам’яті, і їх адреси зростають в порядку виконання команд, починаючи з деякої комірки основної пам’яті і.

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

Рисунок 16.2 – Програма виконання операції (С) := (А) - (В)


 

Існує декілька причин необхідності виконання операцій передачі керування. До найважливіших з них належать наступні:

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

- Практично всі програми потребують прийняття деякого рішення - комп’ютер повинен виконати одні дії при наявності одних умов, та інші дії при наявності інших умов.

- Коректне компонування великих і навіть середнього розміру програм є достатньо важкою задачею. Наявність механізму її представлення малими кусками є дуже корисним.

Розглянемо організацію виконання основних команд передачі керування детальніше.

Команди переходу

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

Є два шляхи вироблення умови, яка буде перевірятись командою умовного переходу. Перший шлях вироблення умови передбачає формування коду умови, як результату виконання деяких операцій. Цей код може бути поміщений в доступний користувачеві регістр. Наприклад, арифметичні операції додавання, віднімання і т. д. можуть формувати дворозрядний код умови, який приймає одне з наступних чотирьох значень: нуль, додатне, від’ємне, переповнення. В такому комп’ютері буде чотири різних команди умовного переходу:

BRP X - перехід до комірки X, якщо результат додатній;

BRX X - перехід до комірки X, якщо результат від’ємний;

BRZ X - перехід до комірки X, якщо результат рівний нулю;

BRO X - перехід до комірки X, якщо відбулось переповнення.

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

BRE R3, R4, X

задає перехід до комірки X, якщо вміст регістра R3 дорівнює вмісту регістра R4.

На рис. 16.3 показано приклад програми, в якій використано безумовний перехід та умовні переходи з застосуванням обох описаних вище шляхів формування умови.

Рисунок 16.3 – Приклад операцій умовного та безумовного переходу


 

Зауважимо, що перехід може бути як в напрямку збільшення, так і в напрямку зменшення адреси. Приклад показує, як умовний та безумовний переходи можуть бути використані для створення повторюваних циклів команд. Команди від комірки 202 до комірки 210 будуть виконуватись повторно, аж поки результат віднімання Y від X не стане рівним нулю.

Розглянемо приклад виконання задачі додавання п чисел, яку можна виконати шляхом послідовного виконання команд (рис. 16.4 а), або з використанням команд переходів (рис. 16.4 b). Тут Nj (j = 1, 2,  .., n) - адреса в пам’яті кожного із n чисел, і (і=1, 2, ..., n) - адреси розміщення команд, S - адреса розміщення результуючої суми.

Рисунок 16.4 – Дві програми додавання n чисел шляхом послідовного виконання команд (а) та з використанням переходів (b)

 

Використання переходів вимагає введення додаткових команд очистки Clear RO, задання кількості n повторів виконання тіла програми, зменшення вмісту регістра R1, який використовується як лічильник, а також команди аналізу умови. Разом з тим, використання переходів зменшує об’єм програм, зокрема в наведеному прикладі взамін n+1 команд, де n - кількість чисел в масиві, використано лише 6 команд.

Команди пропуску

Команда пропуску включає передбачувану адресу. Типово пропуск передбачає, що одна команда буде пропущена. Ця команда не вимагає наявності адресного поля. Типовим її прикладом є команда increment-and-skip-if-zero (ISZ) - приріст на одиницю та перехід якщо нуль. Розглянемо наступний фрагмент програми (рис. 16.5).

Рисунок 16.5 – Приклад використання команди пропуску


 

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

Команди звернення до підпрограм

Одним з найбільших покращань в розробці мов програмування є підпрограми. Підпрограма є самостійною комп’ютерною програмою, яка, при необхідності, використовується іншою програмою. В якійсь точці програми підпрограма повинна бути викликаною та виконаною, після чого виконання програми має бути продовженим. Причиною використання підпрограм є економічна доцільність та потреба забезпечення поділу програми на незалежні модулі. Підпрограма дозволяє тій же частині коду бути використаною багаторазово. Це економить зусилля програміста та ємність пам’яті програм. Підпрограми також дозволяють розділити великі частини програми на малі блоки. Таке використання незалежних модулів суттєво спрощує написання та відлагодження програм.

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

На рис. 16.6 показано як на основі підпрограм будувати програми.

Рисунок 16.6 – Вкладені підпрограми


 

На цьому прикладі основна програма починається з комірки за адресою 010. Ця програма включає звернення до підпрограми SUB1, яка починається з комірки за адресою 500. Коли виконується ця команда виклику, процесор призупиняє виконання основної програми і починає виконання підпрограми SUB1 шляхом вибору наступної команди з комірки 500. Всередині підпрограми SUR1 є два звернення до підпрограми SUB2, яка починається з комірки за адресою 800. В обох цих випадках призупиняється виконання підпрограми SUB1 і виконується підпрограма SUB2. Команда Return вказує процесору повернутись назад до програми SUB1 та продовжити виконання команди, яка іде за відповідною командою виклику Call. Ці звернення між основною програмою та підпрограмами показані на рис. 16.7.

Рисунок 16.7 – Виконання послідовності вкладених підпрограм з рис. 16.6


 

В табл. 16.4 як приклад наведені команди передачі керування комп’ютера з спрощеною системою команд DLX.

 

Таблиця 16.4 – Команди передачі керування комп’ютера DLX.

16.5 Команди вводу виводу

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

 

16.6 Додаткові набори інструкцій процесорів

SIMD- розширення ( Single Instruction Multiple Data ) були введені в архітектуру x 86 з метою підвищення швидкості обробки потокових даних. Основна ідея полягає в одночасному опрацюванні декількох елементів даних за одну інструкцію.

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

Розширення MMX (Multimedia Extension)

Вперше SIMD-розширення у свій x86-процесор ввела фірма Intel - це розширення MMX. Воно почало використовуватися в процесорах Pentium MMX (розширення архітектури Pentium або P5) та Pentium II (розширення архітектури Pentium Pro або P6). Розширення MMX працює з 64-бітними регістрами MM0- MM7, фізично розташованими на регістрах співпроцесора, і включає 57 нових інструкцій для роботи з ними. 64-бітові регістри логічно можуть представлятися як одне 64-бітове, два 32-бітових, чотири 16-бітних або вісім 8-бітових упакованих цілих.

Ще одна особливість технології MMX – це арифметика з насиченням. При цьому переповнення не є циклічним, як завжди, а фіксується мінімальне чи максимальне значення. Наприклад, для 8-бітного беззнакового цілого x :

звичайна арифметика:      x = 254; x+=3;  //Результат x=1                   

арифметика з насиченням:    x = 254; x+=3;  //Результат x=255

 Розширення 3 DNow!

Технологія 3DNow! була введена фірмою AMD у процесорах K 6-2. Це була перша технологія, яка виконувала потокову обробку дійсних даних. Розширення працює з 64-бітними регістрами MMX, які представляються як два 32-бітові дійсних числа з одинарною точністю. Система команд розширена 21 новою інструкцією, серед яких є команда вибірки даних у кеш L1. У процесорах Athlon та Duron набір інструкцій 3DNow! був дещо доповнений новими інструкціями для роботи з дійсними числами, а також інструкціями MMX та керування кешуванням.

Розширення SSE (Streaming SIMD Extension)

З процесором Intel Pentium III вперше з'явилося розширення SSE. Це розширення працює з незалежним блоком з восьми 128-бітних регістрів XMM0 - XMM7. Кожен регістр XMM є чотири упакованих 32-бітових дійсних числа з одинарною точністю. Команди блоку XMM дозволяють виконувати як векторні (над усіма чотирма значеннями регістра), так і скалярні операції (тільки над одним найменшим значенням). Крім інструкцій з блоком XMM розширення SSE входять і додаткові цілочисленні інструкції з регістрами MMX , а також інструкції управління кешуванням.

Розширення SSE2

У процесорі Intel Pentium 4 набір інструкцій отримав чергове розширення - SSE2. Воно дозволяє працювати зі 128-бітними регістрами XMM як з парою упакованих 64-бітових дійсних чисел подвійної точності, а також із упакованими цілими числами: 16 байт, 8 слів, 4 подвійних слова або 2 почетверенних (64-бітних) слова. Введено нові інструкції дійсної арифметики подвійної точності, інструкції цілочисленної арифметики, 128-розрядні для регістрів XMM та 64-розрядні для регістрів MMX. Ряд старих інструкцій MMX поширили і XMM (у 128-бітному варіанті). Крім того, розширено підтримку управління кешуванням та порядком виконання операцій з пам'яттю.

Розширення SSE3, SSSE3, SSE4, ...

У наступних процесорах Intel та AMD відбувається подальше розширення системи команд на регістрах MMX та XMM. Додано нові команди для прискорення обробки відео, текстових даних. Особливо слід відзначити можливість горизонтальної роботи з регістрами (виконання операцій з елементами одного вектора).

AES

Розширення системи команд процесора, розроблене в 2008 році компанією Intel з метою прискорення роботи і підвищення рівня захищеності програм, що використовують алгоритм шифрування AES (Advanced Encryption Standard).

У США і деяких інших країнах AES є офіційним стандартом шифрування. Використовується операційною системою Windows і багатьма популярними програмами для захисту конфіденційної інформації (The Bat!, TrueCrypt та ін.). Якщо процесор підтримує інструкції AES, приріст продуктивності додатків, що використовують цей алгоритм, може досягати 1200 %.

Розширення AVX (Advanced Vector Extensions)

У процесорах архітектури Sandy Bridge від Intel та процесорах архітектури Bulldozer від AMD векторні розширення зробили наступний великий крок у розвитку. Нові векторні регістри YMM0 - YMM15 мають розмір 256 біт. Регістри XMM будуть використовувати молодшу частину нових регістрів. Серед особливостей нового векторного розширення є підтримка три операндних операцій виду (c = a OP b), а також менш строгі вимоги до вирівнювання векторних даних у пам'яті.

AVX 2

Набір інструкцій, що став розвитком технології AVX. Вперше використаний в 2013 р. в процесорах Intel на ядрі Haswell.

Практична користь для рядового користувача - приріст продуктивності при роботі з відео, фотографіями, звуком, а також з програмами, що використовують алгоритми розпізнавання голосу, обличчя, жестів (за умови використання відповідного програмного забезпечення).

FMA

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

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

TSX

TSX (Transactional Synchronization eXtensions) - набір інструкцій багатоядерного процесора, розроблений компанією Intel, який підвищує ефективність взаємодії ядер між собою при здійсненні загального доступу до одних і тих же даних і, в кінцевому рахунку, збільшує загальну продуктивність комп'ютера.

SGX

Software Guard Extensions (SGX) - набір інструкцій, розроблений компанією Intel і використовуваний в її процесорах, починаючи з архітектури Skylake.

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

Intel SHA

Intel Secure Hash Algorithm extensions (SHA) - набір інструкцій процесора, розроблених компанією Intel для прискорення роботи програм, які використовують алгоритми шифрування SHA. Включає 7 інструкцій, 4 з яких прискорюють роботу SHA-1, інші 3 - SHA-256. Прискорення може складати 150-200 % і більше (в залежності від конкретної програми).

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

BMI, TBM, ABM

Bit Manipulation Instructions (BMI) - набори інструкцій, що використовуються в процесорах Intel і AMD для прискорення операцій, пов'язаних з маніпулюванням бітами.

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

F16C

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

F16C використовується як в процесорах AMD, так і в процесорах Intel, значно розширюючи їх можливості в плані роботи з мультимедійними даними, а також даними інших типів.