Salt indirecte
Una branca indirecta (també coneguda com a salt computat, salt indirecte i salt indirecte de registre) és un tipus d'instrucció de control de programa present en alguns conjunts d'instruccions de llenguatge màquina. En lloc d'especificar l'adreça de la següent instrucció a executar, com en una branca directa, l'argument especifica on es troba l'adreça. Un exemple és "saltar indirectament al registre r1", que significa que la següent instrucció a executar és a l'adreça del registre r1. L'adreça a la qual s'ha de saltar no es coneix fins que s'executa la instrucció. Les branques indirectes també poden dependre del valor d'una ubicació de memòria.[1]
Una branca indirecta pot ser útil per fer una branca condicional, especialment una branca multidireccional. Per exemple, basant-se en l'entrada del programa, es podria buscar un valor en una taula de salt de punters al codi per gestionar els diferents casos implicats pel valor de les dades. El valor de les dades es podria afegir a l'adreça de la taula, amb el resultat emmagatzemat en un registre. Aleshores es podria fer un salt indirecte en funció del valor d'aquest registre, enviant de manera eficient el control del programa al codi apropiat per a l'entrada.[2]
De manera similar, les instruccions de trucada de subrutina poden ser indirectes, amb l'adreça de la subrutina a cridar especificada a la memòria. Els punters de funció s'implementen normalment amb trucades indirectes de subrutines.[3]
Les branques indirectes eren una de les superfícies d'atac de Spectre. Per mitigar l'atac, GCC 8.1 va introduir les noves opcions següents: -mindirect-branch=
, -mfunction-return=
i -mindirect-branch-register
.[4]
Exemple de sintaxi d'assemblador
[modifica]MSP430: | br r15
|
SPARC: | jmpl %o7
|
MIPS: | jr $ra
|
x86 (AT&T Syntax): | jmp *%eax
|
x86 (Intel Syntax): | jmp eax
|
ARM: | mov pc, r2
|
Itanium (x86 family): | 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
|
RISC-V: | jalr x0, 0(x1)
|
Referències
[modifica]- ↑ Driesen, Karel; Hölzle, Urs «Accurate indirect branch prediction» (en anglès). ACM SIGARCH Computer Architecture News, 26, 3, 6-1998, pàg. 167–178. DOI: 10.1145/279361.279380. ISSN: 0163-5964.
- ↑ «Indirect branch | Semantic Scholar» (en anglès). [Consulta: 29 novembre 2023].
- ↑ «[https://www.usenix.org/system/files/atc19-amit.pdf JumpSwitches: Restoring the Performance of Indirect Branches In the Era of Spectre]» (en anglès). [Consulta: 29 novembre 2023].
- ↑ «Indirect branch instruction» (en anglès), 10-01-2007. [Consulta: 29 novembre 2023].