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 en 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 del 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, basándose en 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, enviando 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 normalmente 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]
Ejemplo de sintaxis de ensamblador
MSP430 : br r15
SPARC : jmpl %o7
MIPS : jr $ra
X86 (sintaxis de AT&T): jmp *%eax
X86 (sintaxis Intel): jmp eax
BRAZO : mov pc, r2
Itanium (familia 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 8080 : pchl
IBM System z : bcr cond,r1
[2]RISC-V : jalr x0, 0(x1)
Ver también
- Mesa de sucursales
- Enhebrado indirecto
- Control indirecto de sucursales (IBC)
- Especulación indirecta restringida a sucursales (IBRS)
- Barrera de predicción de rama indirecta (IBPB)
- Predictor indirecto de rama de un solo hilo (STIBP)
Notas
- ^ Consulte también la
RETPOLINE=y
función agregada en el kernel de Linux 4.14.14 / 4.9.77 / 4.4.112. Véase también: Retpoline
Referencias
- ↑ Larabel, Michael (14 de enero de 2018). "Mitigación de espectro agregado a GCC 8, buscando backport para GCC 7" . Archivado desde el original el 20 de enero de 2018 . Consultado el 19 de enero de 2018 .
- ^ "z / Arquitectura - Principios de funcionamiento" (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 .