Косвенная ветка


Косвенный переход (также известный как вычисляемый переход , косвенный переход и косвенный переход по регистру ) — это тип команды управления программой , присутствующей в некоторых наборах команд машинного языка . Вместо указания адреса следующей выполняемой инструкции , как в прямом переходе , аргумент указывает , где находится адрес. Примером может служить «непрямой переход по регистру r1 », что означает, что следующая инструкция, которая будет выполнена, находится по адресу в регистре r1. Адрес, по которому осуществляется переход, неизвестен до тех пор, пока инструкция не будет выполнена. Косвенные переходы также могут зависеть от значения ячейки памяти .

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

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

Косвенные ответвления были одной из поверхностей атаки Spectre . Для смягчения атаки в GCC 8.1 представлены следующие новые параметры: -mindirect-branch=, -mfunction-return=и -mindirect-branch-register. [1] [номер 1]