Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VPKS_v2_UKR_new.doc
Скачиваний:
21
Добавлен:
11.09.2019
Размер:
2.31 Mб
Скачать

4. Типи команд

Команди традиційного машинного рівня можна розділити на кілька типів, які показані на рис. 3.

Тип операції

Приклади

Арифметичні й логічні

Цілочислені арифметичні й логічні операції: додавання, вирахування, логічне додавання, логічне множення й т.д.

Пересилання даних

Операції завантаження/запису

Керування потоком команд

Безумовні й умовні переходи, виклики процедур і повернення

Системні операції

Системні виклики, команди керування віртуальною пам'яттю й т.д.

Операції із плаваючою крапкою

Операції додавання, вирахування, множення й розподіли над речовинними числами

Десяткові операції

Десяткове додавання, множення, перетворення форматів і т.д.

Операції над рядками

Пересилання, порівняння й пошук рядків

Рис. 3 Основні типи команд

5. Команди керування потоком команд

В англійській мові для вказування команд безумовного переходу, як правило, використовується термін jump, а для команд умовного переходу - термін branch, хоча різні постачальники необов'язково дотримуються цієї термінології. Наприклад компанія Intel використовує термін jump і для умовних, і для безумовних переходів. Можна виділити чотири основних типи команд для керування потоком команд: умовні переходи, безумовні переходи, виклики процедур і повернення із процедур.

Частота використання цих команд по статистиці приблизно наступна. У програмах домінують команди умовного переходу. Серед зазначених команд керування на різних програмах частота їхнього використання коливається від 66 до 78%. Наступні по частоті використання - команди безумовного переходу (від 12 до 18%). Частота переходів на виконання процедур і повернення з них становить від 10 до 16%.

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

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

Одним із ключових питань реалізації команд переходу полягає в тому, наскільки далеко цільова адреса переходу перебуває від самої команди переходу? І на це питання статистика використання команд дає відповідь: у переважній більшості випадків перехід іде в межах 3 - 7 команд щодо команди переходу, причому в 75% випадків виконуються переходи в напрямку збільшення адреси, тобто вперед по програмі.

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

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

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

Одним з найбільш помітних властивостей більшості програм є перевага в них порівнянь на умову дорівнює/нерівно й порівнянь із нулем. Тому в ряді архитектур такі команди виділяються в окремий піднабор, особливо при використанні команд типу "зрівняти й перейти".

Говорять, що перехід виконується, якщо дійсною є умова, що перевіряє команда умовного переходу. У цьому випадку виконується перехід на адресу, що задана командою переходу. Тому всі команди безумовного переходу завжди виконувані. По статистиці виявляється, що переходи назад по програмі в більшості випадків використаються для організації циклів, причому приблизно 60% з них становлять виконувані переходи. У загальному випадку поводження команд умовного переходу залежить від конкретної прикладної програми, однак іноді позначається й залежність від компілятора. Такі залежності від компілятора виникають внаслідок змін потоку керування, виконуваного оптимізуючого компіляторами для прискорення виконання циклів.

Виклики процедур і повернення припускають передачу керування й можливе збереження деякого стану. Як мінімум, необхідно вміти десь зберігати адресу повернення. Деякі архітектури пропонують апаратні механізми для збереження стану регістрів, в інших випадках передбачається вставка в програму команд самим компілятором. Є два основних види угод щодо збереження стану регістрів. Збереження визиваючої (caller saving) програмою означає, що визиваюча процедура повинна зберігати свої регістри, які вона хоче використати після повернення в неї. Збереження викликаною процедурою припускає, що викликана процедура повинна зберегти регістри, які вона збирається використати. Є випадки, коли повинне використатися збереження визиваючою процедурою для забезпечення доступу до глобальним змінних, які повинні бути доступні для обох процедур.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]