热门问题
时间线
聊天
视角
间接分支
来自维基百科,自由的百科全书
Remove ads
间接分支(indirect branch)也称为间接跳跃(indirect jump)或暂存器间接跳跃(register-indirect jump),是机器语言指令集架构中控制流程的一种方法。在机器语言里,一般的控制流程会直接标示接下来要执行程式的位址(直接分支),而间接分支是在参数中标示要执行的记忆体位址。像“分支到r1寄存器所记录的位置”即为一例,此例中,接下来要执行程式的位置在r1寄存器里,要执行完这个指令才知道接下来要执行的程式。间接分支也可以依记忆体中的值为准。
在程式里,间接分支可以用在像多路分支的应用上(类似高阶语言的switch指令)。例如程式可以可以根据输入值,到分支表中查看对应输入指令的位置,放在暂存器中,再进行间接分支。因此间接分支可以有效的处理程式的流程控制。
子程序的呼叫也可以用类似的方式间接呼叫,呼叫程式的位置是由记忆体中的值决定。高阶语言的函数指针就会用此方式实现。
间接分支和间接呼叫的目标是计算出来的,若程式有错误,有可能会分支或呼叫到不正确的位置(例如没有程式码的位置,或是未预期程式码的位置),造成程式异常。
间接分支是幽灵漏洞的攻击表面之一。为了缓解此攻击,GCC 8.1导入了以下选项:-mindirect-branch=
, -mfunction-return=
and -mindirect-branch-register
.[1][nb 1]
Remove ads
组合语言范例
MSP430: br r15
SPARC: jmpl %o7
MIPS架构: jr $ra
x86(AT&T语法): jmp *%eax
x86(Intel语法): jmp eax
ARM: BX r0
,mov pc, r2
Itanium(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)
英特尔8051: jmp @A+DPTR
Intel 8080: pchl
IBM System z: bcr cond,r1
[2]PDP-11: jmp @R5
RISC-V: jalr x0, 0(x1)
Remove ads
相关条目
- 分支表
- Indirect threading
- 间接分支限制推测(IBRS)
- Indirect branch prediction barrier(IBPB)
注解
参考资料
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads