在Thumb和ARM之间跳转

时间:2016-06-15 13:27:37

标签: arm thumb

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

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

从ARM到Thumb2

从Thumb2到Thumb2

从Thumb2到ARM

何时需要将+1添加到地址?为什么?

2 个答案:

答案 0 :(得分:1)

规则实际上非常简单:

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

这就是解释+1的原因。

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

答案 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或更新版本。 (你说拇指2,一般意思是拇指?)我相信文档告诉我们上面适用于armv6和armv7。

请注意,该指令消耗了该位,pc在拇指模式下不会携带设置的lsbit,它只是被指令用来指示模式的改变。

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