Rama indirecta


Una rama indirecta (también conocida como salto calculado , salto indirecto y salto indirecto de registro ) es un tipo de instrucción de control de programa presente en algunos conjuntos de instrucciones de lenguaje de máquina . En lugar de especificar la dirección de la siguiente instrucción a ejecutar , como en una rama directa , el argumento especifica dónde se encuentra la dirección. Un ejemplo es 'salto indirecto en el registro r1', lo que significa que la siguiente instrucción a ejecutar está en la dirección en el registro r1. La dirección a la que se va a saltar no se conoce hasta que se ejecuta la instrucción. Las ramas indirectas también pueden depender del valor de una ubicación de memoria .

Una rama indirecta puede ser útil para hacer una rama condicional , especialmente una rama de múltiples vías . Por ejemplo, según la entrada del programa , se podría buscar un valor en una tabla de salto de punteros al código para manejar los diversos casos implicados por el valor de los datos. El valor de los datos podría agregarse a la dirección de la tabla, con el resultado almacenado en un registro. Entonces se podría realizar un salto indirecto basado en el valor de ese registro, despachando eficientemente el control del programa al código apropiado para la entrada.

De manera similar, las instrucciones de llamada de subrutina pueden ser indirectas, con la dirección de la subrutina a llamar especificada en la memoria. Los punteros de función se implementan típicamente con llamadas indirectas a subrutinas.

Las ramas indirectas fueron una de las superficies de ataque de Spectre . Para mitigar el ataque GCC 8.1 introduce las siguientes nuevas opciones: -mindirect-branch=, -mfunction-return=y -mindirect-branch-register. [1] [nb 1]