Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Непрямой переход (также известный как вычисляемый переход, косвенный переход и переход через регистр) — это тип инструкции управления программой, присутствующий в некоторых наборах команд машинного языка. В отличие от прямого перехода, который указывает адрес следующей инструкции для выполнения, аргумент в непрямом переходе указывает, где находится этот адрес. Например, "перейти косвенно через регистр r1" означает, что следующая инструкция для выполнения находится по адресу, содержащемуся в регистре r1. Адрес перехода неизвестен до выполнения инструкции. Непрямые переходы также могут зависеть от значения в ячейке памяти. Непрямой переход может быть полезен для реализации условного перехода, особенно многовариантного. Например, на основе входных данных программы, значение может быть найдено в таблице переходов, содержащей указатели на код для обработки различных случаев, определяемых входным значением. Это значение может быть добавлено к адресу таблицы, а результат сохранен в регистре. Затем можно выполнить косвенный переход на основе значения этого регистра, эффективно перенаправляя управление программой в соответствующий код. Аналогично, инструкции вызова подпрограммы могут быть непрямыми, при этом адрес вызываемой подпрограммы хранится в памяти. Указатели на функции обычно реализуются с помощью непрямых вызовов подпрограмм. Непрямые переходы были одной из векторов атаки в уязвимости Spectre. Для снижения риска атаки GCC 8.1 представил следующие новые опции: mindirect branch=, mfunction return= и mindirect branch register.
An indirect branch (also known as a computed jump, indirect jump and register indirect jump) is a type of program control instruction present in some machine language instruction sets. Rather than specifying the address of the next instruction to execute, as in a direct branch, the argument specifies where the address is located. An example is 'jump indirect on the r1 register', which means that the next instruction to be executed is at the address in register r1. The address to be jumped to is not known until the instruction is executed. Indirect branches can also depend on the value of a memory location. An indirect branch can be useful to make a conditional branch, especially a multiway branch. For instance, based on program input, a value could be looked up in a jump table of pointers to code for handling the various cases implied by the data value. The data value could be added to the address of the table, with the result stored in a register. An indirect jump could then be made based on the value of that register, efficiently dispatching program control to the code appropriate to the input. In a similar manner, subroutine call instructions can be indirect, with the address of the subroutine to be called specified in memory. Function Pointers are typically implemented with indirect subroutine calls. Indirect branches were one of the attack surfaces of Spectre. To mitigate the attack GCC 8.1 introduced the following new options: mindirect branch=, mfunction return= and mindirect branch register.