在 Thumb 和 ARM 之间跳转

Jump between Thumb and ARM

我对 ARM 和 Thumb2 命令感兴趣:LDR 和 LDR.W、PC、=ADDR 用于绝对跳转到某个地址。

比如我从ARM代码跳转到ARM时,执行命令LDR PC,=ADDR。 但是在其他情况下会发生什么?

从 ARM 到 Thumb2

从 Thumb2 到 Thumb2

从 Thumb2 到 ARM

什么时候地址需要加+1?为什么?

规则其实很简单:

  • 如果地址的第 0 位为 0,CPU 将在下一个分支后将代码作为 ARM 代码执行
  • 如果地址的第 0 位为 1,CPU 将在下一个分支后作为 Thumb 执行代码
  • 当然如果不匹配,CPU肯定会出错(执行随机代码后),因为它无法检查代码是ARM还是Thumb。

这就是 +1 的解释。

请注意,根据编译器和使用的标签,编译器可能会自动设置地址的第 0 位。

您只需要阅读文档即可。

The following instructions write a value to the PC, treating that value as an interworking address to branch
to, with low-order bits that determine the new instruction set state:
— BLX (register), BX , and BXJ
— LDR instructions with <Rt> equal to the PC
— POP and all forms of LDM except LDM (exception return), when the register list includes the PC
— in ARM state only, ADC , ADD , ADR , AND , ASR (immediate), BIC , EOR , LSL (immediate), LSR (immediate), MOV ,
MVN , ORR , ROR (immediate), RRX , RSB , RSC , SBC , and SUB instructions with <Rd> equal to the PC and without
flag-setting specified.

既然你提到了 thumb2,那意味着 armv6 或更新版本。 (你说的是 thumb2 还是指拇指?)而且我相信文档告诉我们以上内容适用于 armv6 和 armv7。

请注意,位被指令消耗,pc 在拇指模式下不会携带一组 lsbit,它只是被指令用来指示模式更改。

另请注意,您应该考虑 OR 1 而不是 PLUS 1。如果您正确编写代码,工具链将为您提供正确的地址和正确的 lsbit,如果您向该地址添加一个,您将中断代码,如果你是偏执狂或没有做对,你可以或一个到地址,如果它有它已经没有伤害,如果它没有那么它解决了阻止它存在的问题。关于切换到拇指模式,我永远不会使用加一。