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

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

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

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

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

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

Примеры на ассемблере[править | править код]

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

См. также[править | править код]