Косвенная ветка
Эта статья нуждается в дополнительных цитатах для проверки . ( май 2018 г. ) |
Машинный код |
---|
Общие понятия |
Инструкции |
Косвенный переход (также известный как вычисляемый переход , косвенный переход и косвенный переход по регистру ) — это тип команды управления программой, присутствующей в некоторых машинного языка наборах команд . Вместо указания адреса следующей инструкции выполняемой указывает , , как в прямом переходе , аргумент где находится адрес. Примером может служить «непрямой переход по регистру r1 », что означает, что следующая инструкция, которая будет выполнена, находится по адресу в регистре r1. Адрес, по которому осуществляется переход, неизвестен до тех пор, пока инструкция не будет выполнена. Косвенные переходы также могут зависеть от значения ячейки памяти .
Косвенный переход может быть полезен для создания условного перехода , особенно многопутевого . Например, на основе ввода программы значение можно найти в таблице переходов указателей на код для обработки различных случаев, подразумеваемых значением данных. Значение данных можно добавить к адресу таблицы, а результат сохранить в регистре. Затем можно было бы выполнить косвенный переход на основе значения этого регистра, эффективно перенаправив управление программой на код, соответствующий вводу.
Аналогичным образом инструкции вызова подпрограммы могут быть косвенными, при этом адрес вызываемой подпрограммы указывается в памяти. Указатели функций обычно реализуются с помощью косвенных вызовов подпрограмм.
Косвенные ответвления были одной из поверхностей атаки Spectre . Для смягчения атаки в GCC 8.1 представлены следующие новые опции: -mindirect-branch=
, -mfunction-return=
и -mindirect-branch-register
. [1] [номер 1]
Пример синтаксиса ассемблера
[ редактировать ]МСП430 : br r15
СПАРК : jmpl %o7
МИПС : 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
Интел 8080 : pchl
IBM Система z : bcr cond,r1
[2]РИСК-V : jalr x0, 0(x1)
См. также
[ редактировать ]- Таблица филиалов
- Непрямая резьба
- Косвенный контроль филиалов (IBC)
- Спекуляции с косвенным ограничением филиалов (IBRS)
- Барьер косвенного прогнозирования ветвей (IBPB)
- Однопоточный косвенный предсказатель ветвления (STIBP)
Примечания
[ редактировать ]Ссылки
[ редактировать ]- ^ Ларабель, Майкл (14 января 2018 г.). «В GCC 8 добавлена защита от Spectre, требуется бэкпорт в GCC 7» . Архивировано из оригинала 20 января 2018 г. Проверено 19 января 2018 г.
- ^ «z/Architecture - Принципы работы» (4-е изд.). ИБМ . Май 2004 г. [1990]. SA22-7832-03. Архивировано из оригинала 4 марта 2016 г. Проверено 26 мая 2018 г.