Команди переходу: відмінності між версіями

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[неперевірена версія][перевірена версія]
Вилучено вміст Додано вміст
термінологія
Вилучено абзац про "мови високого рівня" і про "jz() / jnz()"
Рядок 1: Рядок 1:
'''Кома́нди перехо́ду''' або '''Кома́нди переда́чі керування''' ({{lang-en|branch instructions}}) — різновид [[команди передачі управління|команд передачі управління]] в [[архітектура системи команд|архітектурах системи команд]] ЕОМ, які змінюють послідовний порядок виконання програми (тобто перезавантажують [[лічильник команд]] адресою, записаною в самій команді переходу, а не збільшуючи його значення на довжину поточної команди).
'''Кома́нди перехо́ду''' або '''Кома́нди переда́чі керування''' ({{lang-en|branch instructions}}) — різновид [[команди передачі управління|команд передачі управління]] в [[архітектура системи команд|архітектурах системи команд]] ЕОМ, які змінюють послідовний порядок виконання програми (тобто перезавантажують [[лічильник команд]] адресою, записаною в самій команді переходу, а не збільшуючи його значення на довжину поточної команди). Команди переходу можуть бути '''умовними''' ({{lang-en|conditional branch}}) та '''безумовними''' ({{lang-en|unconditional branch}}).

Команди переходу можуть бути '''умовними''' ({{lang-en|conditional branch}}) та '''безумовними''' ({{lang-en|unconditional branch}}).

Залежно від реалізації [[Мова програмування|мови програмування]] ([[Мова програмування високого рівня|високого]] чи [[Мова програмування низького рівня|низького]] рівня), команди передачі управління можуть мати свої особливості. Так, у мовах низького рівня, типу [[Мова асемблера|мови асемблера]], реалізація команди умовного переходу може мати вигляд '''jz''' (), '''jnz''' () — перехід за нульовою (ненульовою) умовою.


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

Версія за 11:52, 28 січня 2018

Кома́нди перехо́ду або Кома́нди переда́чі керування (англ. branch instructions) — різновид команд передачі управління в архітектурах системи команд ЕОМ, які змінюють послідовний порядок виконання програми (тобто перезавантажують лічильник команд адресою, записаною в самій команді переходу, а не збільшуючи його значення на довжину поточної команди). Команди переходу можуть бути умовними (англ. conditional branch) та безумовними (англ. unconditional branch).

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

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

Реалізація команд умовних переходів в різних архітектурах ЕОМ може відрізнятись. В деяких архітектурах обчислення умови для прийняття рішення про подальший перехід та безпосереджньо команда переходу відокремлені.

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

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

  +---------+---------+-------+----------------------------+
  | BEQ     |   R1    |   R2  |    адреса переходу         |  BEQ R1,R2 
  +---------+---------+-------+----------------------------+
      
      Формат RISC-команди умовного переходу за рівністю значень двох регістрів
                     (PC:=адреса переходу ЯКЩО R1=R2)

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

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

Команди безумовного переходу

  +---------+---------------------------------------------+
  | JMP     |    адреса переходу                          | 
  +---------+---------------------------------------------+

Безумовний перехід примусово перезавантажує лічильник команд адресою (повністю або лише молодшу частину адреси), яка міститься у відповідному полі команди. Діапазон можливих адрес для переходу визначається розрядністю поля команди.

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

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

Проблеми в конвеєрі

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

Див. також