Machine code |
---|
General concepts |
Instructions |
|
Косвенный переход ( также известный как вычисляемый переход , косвенный переход и косвенный переход через регистр ) — это тип инструкции управления программой, присутствующий в некоторых наборах инструкций машинного языка . Вместо указания адреса следующей инструкции для выполнения , как в прямом переходе , аргумент указывает, где находится адрес. Примером может служить «косвенный переход на регистр r1 », что означает, что следующая инструкция для выполнения находится по адресу в регистре r1. Адрес, на который нужно перейти, неизвестен, пока инструкция не будет выполнена. Косвенные переходы также могут зависеть от значения ячейки памяти .
Косвенный переход может быть полезен для создания условного перехода , особенно многопутевого перехода . Например, на основе входных данных программы значение может быть найдено в таблице переходов указателей на код для обработки различных случаев, подразумеваемых значением данных. Значение данных может быть добавлено к адресу таблицы, а результат сохранен в регистре. Затем может быть выполнен косвенный переход на основе значения этого регистра, эффективно передавая управление программой коду, соответствующему входным данным.
Аналогичным образом, инструкции вызова подпрограммы могут быть косвенными, с указанием адреса вызываемой подпрограммы в памяти. Указатели функций обычно реализуются с помощью косвенных вызовов подпрограмм.
Непрямые ветви были одной из поверхностей атаки Spectre . Для смягчения атаки GCC 8.1 представил следующие новые опции: -mindirect-branch=
, -mfunction-return=
и -mindirect-branch-register
. [1] [nb 1]
MSP430 : | br r15 |
СПАРК : | jmpl %o7 |
MIPS-индекс : | jr $ra |
x86 (синтаксис AT&T): | jmp *%eax |
x86 (синтаксис Intel): | jmp eax |
РУКА : | BX r0 ,mov pc, r2 |
Itanium (семейство x86): | br.ret.sptk.few rp |
6502 : | jmp ($0DEA) |
65C816 : | jsr ($0DEA,X) |
6809 : | jmp [$0DEA] , jmp B,X ,jmp [B,X] |
6800 : | jmp 0,X |
Z80 : | jp (hl) |
Intel MCS-51 : | jmp @A+DPTR |
Intel 8080 : | pchl |
IBM System z : | bcr cond,r1 [2] |
ПДП-11 : | jmp @R5 |
RISC-V : | jalr x0, 0(x1) |
RETPOLINE=y
функцию, добавленную в ядре Linux 4.14.14/4.9.77/4.4.112. См. также: Retpoline