Команди переходу - Розгалуження та управління циклами

Незважаючи на те, що ми ввели кілька команд для виконання умовного переходу, насправді існує лише одна. Всі відомі нам на даний момент команди є фактично лише формами запису команди ВС формату RX. Такі розширені мнемоніки, як, BZ, BNM, транслюються асемблером в машинну форму команди ВС; при цьому принагідно до формату команди вноситься інформація про те, якому стану ознаки результату відповідає дійсний перехід.

Стан ознаки результату, якому відповідає перехід, має бути відомий CPU при виконанні команд умовної передачі управління. Інформація про цей стан надається процесору як маски. Взагалі кажучи, маска — це двійкове число, яке визначає, які з можливих логічних рішень мають бути ухвалені. Можна уявити маску як набір перемикачів. Якщо перемикач знаходиться у включеному стані - відповідний розряд маски містить 1, то рішення, яке відповідає цьому біту, має бути прийняте. Якщо перемикач поставлено в положення "вимкнено" (розряд маски містить 0), виконання відповідних дій не потрібно.

Одним із операндів команди ВС є 4-бітова маска. Ми можемо вважати, що розряди маски перенумеровані від 0 до 3. Кожен біт маски відповідає одному з чотирьох можливих станів ознаки результату:

По масці визначається, які значення ознаки результату викликають виконання переходу. Наприклад, якщо при виконанні команди ВС 2-й розряд маски містить 1, то перехід буде виконаний, якщо ознака результату має значення 2. Якщо даний біт містить, то наявність відповідної ознаки результату не викличе переходу.

Розглянемо команду НД з маскою01002. Так як біт 1 встановлений в 1, то передача управління відбудеться, якщо ознака результату дорівнює 012. Біти 0, 2 і 3 - нулі, тому при значеннях 0, 2 або 3 ознаки результату перехід не матиме місця. Оскільки код 1 ознаки результату відповідає негативному результату операції, команда НД з такою маскою еквівалентна описаній раніше команді ВМ.

Якщо кілька біт маски містять 1, перехід здійснюється, якщо виконано хоча б одну з відповідних умов. Якщо маска містить 10112, то перехід здійсниться, якщо ознака результату матиме одне із значень 0, 2 або 3, але не 1. Команді НД з такою маскою відповідає розширена мнемоніка BNM.

Аналогічно за командою ЗС з маскою 11112 проводиться перехід незалежно від ознаки результату. Ця команда має розширену мнемоніку, що означає безумовний перехід.

При виконанні команди ВС значення ознаки результату використовується як індекс, що вказує, який розряд маски підлягає перевірці. Якщо в цьому розряді маски міститься 1, здійснюється перехід.

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

Команда BC

Команда ВС є командою модифікованого формату RX. Ми вже зазначали, що 4-бітова маска, що вказує у яких випадках слід здійснити перехід, повинна бути задана як один з операндів. Символічно ця маска позначається Ml і поміщається місце поля R1 команди звичайного формату RX.Отже, команду ЗС можна описати так:

Branch on Condition

PCD2 + (X2)+(B2), якщо ознака результату відповідає значенню в полі M1

Оскільки, якщо немає спеціальних застережень, асемблер розглядає всі числа як десяткові, маску можна визначати десятковим числом від 0 до 15 включно. Для визначення, що потрібно написати в полі Ml, двійкове значення маски слід перевести в десяткову форму. Якщо хочемо, наприклад, задати маску 1 ООО2, вказуючи цим, що перехід необхідно здійснювати, якщо ознака результату дорівнює 0, потрібно написати

і команда набуде вигляду

Переведення маски у десяткову форму, незважаючи на свою простоту, часто є джерелом додаткових помилок. Асемблер дозволяє задавати числа в різних системах. В даному випадку, як і в деяких інших, можна використовувати системи з іншими основами.

Для визначення двійкової константи достатньо написати

"Значення" - це двійкове число, укладене в одиночні лапки. Символ повідомляє ассемблеру, що основою використовуваної системи є число 2.

Шістнадцяткова константа задається так

При необхідності ці можливості можна використовувати визначення числових констант. Наприклад, такі команди еквівалентні:

Машинний формат команди ВС нічим не відрізняється від звичайного формату RX, лише на місці першого операнда вказується маска. Команда ЗС всього одна, кодом відповідної операції є 47, тому в машинній формі

У даному випадку зсув дорівнює 3210, регістр 3 використовується як індексний, а регістр 11 - як базовий. Розширена мнемоніка BNP транслюється в команду НД з маскою 13 такого вигляду:

Тепер, з урахуванням перетворення зміщення на шістнадцяткову форму, отримаємонаступний машинний код:

Розглянемо тепер інший приклад. Відтранслюємо команду

Ім'я ТОР відповідає зсув 15016, регістр 9 використовується як базовий. Маскою є 1000 = 816. Таким чином, у машинному коді дана команда виглядає так:

При обробці команд передачі управління асемблер виконує аналогічні дії. Якщо написана команда ЗС, то виконується безпосередня трансляція. У разі використання розширеної мнемоніки асемблеру доводиться переглядати таблицю мнемонік визначення маски. Після цього код 47 та отримана маска вносяться у відповідні поля машинної команди.

Таблиця 9.1 Розширені мнемоніки, маски та еквівалентні команди ВС