Косвенный переход

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис

Косвенный переход (от англ. indirect branch, также используются термины computed jump (вычисляемый переход), indirect jump (непрямой переход) и register-indirect jump (регистро-косвенный переход)) — тип программного контроля выполнения инструкций, представленный в виде некоторого набора инструкций машинного кода. Вместо указания адреса следующей инструкции для выполнения[англ.], как это принято для прямых переходов, здесь аргумент указывает местонахождение адреса.

В данном случае в качестве примера можно привести команду вида 'косвенный переход по регистру r1', что означает, что следующая инструкция для выполнения находится по адресу, хранящемуся в регистре r1. Адрес перехода неизвестен, пока инструкция не будет выполнена. Косвенные переходы так же могут зависеть от местонахождения в памяти.

Косвенный переход может весьма пригодиться для выполнения условного перехода, особенно это касается многовариантных переходов. К примеру, исходя из введённых в программу данных, значение может искаться в таблице переходов[англ.] указателей кода для обработки различных вариантов в зависимости от значения данных.

Значение данных может добавляться к адресу таблицы, а результат сохраняться в регистре. Косвенный переход может быть выполнен исходя из значения этого регистра, эффективно соотнося программный контроль с кодом, соответствующим введённым данным.

Схожим образом инструкции вызова подпрограммы могут быть косвенными с адресом вызываемой подпрограммы, указанным в регистре или ячейке памяти.

Примеры на ассемблере

SPARC: jmpl %o7
MIPS: jr $ra
X86: jmp *%eax
ARM: mov pc, r2
Itanium: br.ret.sptk.few rp
6502: jmp ($0DEA)
65C816: jsr ($0DEA,X)
Z80: jp (hl)
Intel 8080 pchl

См. также