Непрямая ветвь

Тип инструкции управления программой

Косвенный переход ( также известный как вычисляемый переход , косвенный переход и косвенный переход через регистр ) — это тип инструкции управления программой, присутствующий в некоторых наборах инструкций машинного языка . Вместо указания адреса следующей инструкции для выполнения , как в прямом переходе , аргумент указывает, где находится адрес. Примером может служить «косвенный переход на регистр 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)
65C816jsr ($0DEA,X)
6809jmp [$0DEA], jmp B,X,jmp [B,X]
6800jmp 0,X
Z80jp (hl)
Intel MCS-51jmp @A+DPTR
Intel 8080pchl
IBM System zbcr cond,r1[2]
ПДП-11jmp @R5
RISC-V :jalr x0, 0(x1)

Смотрите также

Примечания

  1. ^ См. также RETPOLINE=yфункцию, добавленную в ядре Linux 4.14.14/4.9.77/4.4.112. См. также: Retpoline

Ссылки

  1. ^ Ларабель, Майкл (2018-01-14). "Spectre Mitigation Added To GCC 8, Seeking Backport To GCC 7". Архивировано из оригинала 20-01-2018 . Получено 19-01-2018 .
  2. ^ "z/Architecture - Principles of Operation" (4-е изд.). IBM . Май 2004 [1990]. SA22-7832-03. Архивировано из оригинала 2016-03-04 . Получено 2018-05-26 .
Retrieved from "https://en.wikipedia.org/w/index.php?title=Indirect_branch&oldid=1247991694"