stringtranslate.com

Rama indirecta

Una bifurcación 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 bifurcación 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 del registro r1. La dirección a la que se saltará no se conoce hasta que se ejecuta la instrucción. Las bifurcaciones 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 multidireccional . Por ejemplo, en función de la entrada del programa , se podría buscar un valor en una tabla de saltos de punteros a código para manejar los diversos casos implicados por el valor de los datos. El valor de los datos se podría agregar a la dirección de la tabla, y el resultado se almacenaría en un registro. Luego se podría hacer un salto indirecto en función del valor de ese registro, enviando de manera eficiente el control del programa al código apropiado para la entrada.

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

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

Ejemplo de sintaxis de ensamblador

Véase también

Notas

  1. ^ Consulte también la RETPOLINE=ycaracterística añadida en el kernel de Linux 4.14.14/4.9.77/4.4.112. Véase también: Retpoline

Referencias

  1. ^ Larabel, Michael (14 de enero de 2018). "Mitigación de Spectre agregada a GCC 8, buscando retroportación a GCC 7". Archivado desde el original el 20 de enero de 2018. Consultado el 19 de enero de 2018 .
  2. ^ "z/Architecture - Principles of Operation" (4.ª ed.). IBM . Mayo de 2004 [1990]. SA22-7832-03. Archivado desde el original el 4 de marzo de 2016 . Consultado el 26 de mayo de 2018 .