汇编指令ldr PC, r1内存跳转作用、与B/BL区别及流水线影响咨询
关于
ldr PC, r1指令的相关问题解答 为什么不直接使用B或BL指令实现跳转
- B、BL属于立即数相对跳转指令,跳转偏移量直接编码在指令本身中,编译时就确定了跳转的目标地址,且跳转范围有限:32位ARM架构下B/BL的最大跳转范围仅为±32MB,无法覆盖全地址空间。
ldr PC, r1属于寄存器间接跳转,跳转目标是r1寄存器中存储的地址值,属于动态跳转,完全不受跳转范围限制,且目标地址可在运行时动态计算赋值。这类跳转适用于函数指针调用、switch跳转表、动态链接函数调用、中断向量重定向等跳转目标无法在编译期确定的场景,这些场景是B/BL指令无法覆盖的。
使用ldr PC, r1执行跳转是否会导致流水线停顿
会产生流水线停顿。
经典ARM架构采用三级流水线设计,正常运行时取指、译码、执行三个阶段并行工作:当ldr PC, r1指令处于执行阶段、完成PC寄存器赋值时,流水线中已经预取了该指令后续的2条指令,分别处于译码、取指阶段,这两条指令属于跳转前的地址空间,已经无效。CPU必须执行流水线冲刷操作清空这两条无效指令,再从跳转目标地址重新取指,这个过程会产生至少2个时钟周期的停顿。
如果流水线未发生停顿会出现什么问题
如果CPU没有执行流水线冲刷、没有产生停顿,会直接按顺序执行ldr PC, r1后续的两条预取指令,而非跳转目标地址的指令,程序执行逻辑会完全错乱,轻则出现数据计算错误、功能异常,重则直接导致程序崩溃、系统跑飞。
内容的提问来源于stack exchange,提问作者KaDw
相关产品推荐
相关产品推荐

