Команды перехода, команды передачи управления (англ. branch instructions) - разновидность команд передачи управления в архитектурах системы команд ЭВМ, изменяющие последовательный порядок выполнения программы (т.е. перезагружают счетчик команд адресу, записанной в самой команде перехода, а не увеличивая его значение на длину текущей команды).
Команды перехода могут быть условными (conditional brahch) и безусловными (unconditional branch).
В зависимости от реализации языка программирования ( высокого или низкого уровня), команды передачи управления могут иметь свои особенности. Так, в языках низкого уровня, типа ассемблера, реализация команды условного перехода может иметь вид jz (), jnz () - переход по нулевой (ненулевой) условием.
Команды условного перехода
В командах условного перехода решение о принудительной передаче управления (путем перезагрузки счетчика команд ) или продолжение обычный режим выполнения программы принимается в зависимости от выполнения или невыполнения определенного условия.
Реализация команд условных переходов в различных архитектурах ЭВМ может отличаться. В некоторых архитектурах вычисления условия для принятия решения о дальнейшем переход и безпосереджньо команда перехода отделены.
Таким условием может быть, например, равенство определенных значений, или их неравенство (в ту или другую сторону). Для вычисления этого факта часто используют арифметические команды (тогда если операнды равны, результат будет нулевым и т.д.).
В большинстве CISC - архитектур арифметические команды устанавливают специализированные биты отдельного регистра состояния процессора (такие, например, как бит равенства результатов, бит нулевого результата и т.п.), а команды условного перехода могут соответственно анализировать эти биты.
В RISC - архитектурах команды условного перехода, как правило, способны анализировать результат в одном из регистров общего назначения (нулевой / ненулевой) или сравнивать результаты в двух разных регистрах (больше / меньше) и на основе этого перезагружать счетчик команды или нет.
Как правило, полной перезагрузки адреса счетчика команд не происходит. Поле адреса перехода в соответствующих командах меньше разрядности счетчика, поэтому перезагружаются только младшие разряды адреса. Таким образом, диапазон возможных адресов сокращается, но формат команды остается фиксированным.
Безусловный переход принудительно перезагружает счетчик команд адресу (полностью или только младшую часть адреса), которая содержится в соответствующем поле команды. Диапазон возможных адресов для перехода определяется разрядностью поля команды.
Команды вызова подпрограмм и возврата из подпрограмм
- команды вызова подпрограмм и возврата из подпрограмм - передают управление подпрограмме, сохраняя адрес возврата и, возможно, контекст процессора (информации о состоянии системы), а также организуют корректное восстановление после выхода из подпрограммы.
- команды вызова обработчиков прерываний - передают управление обработчику прерываний. Иногда эти команды рассматриваются как особый случай команд вызова подпрограмм.
Проблемы в конвейере
В конвейере при выполнении команды перехода (прежде условного) факт того, состоится ли переход или нет, становится известным на поздних этапах конвейера. За это время в конвейер на ранние этапы загружаются следующие за этой команды. В случае, если переход происходит, то понятно, что нужно полностью заменить последовательность инструкций, которые следуют за командой перехода. Эти так называемые конфликты управления приводят к существенному падению быстродействия процессора. В современных процессорах для снижения негатива от этих конфликтов используют различные методики предсказания переходов и спекулятивное выполнение.