我对ARM和Thumb2命令感兴趣:LDR和LDR.W,PC,= ADDR,用于绝对跳转到某个地址。
例如,当我从ARM代码跳转到ARM时,执行命令LDR PC,= ADDR。 但其他情况会发生什么?
从ARM到Thumb2
从Thumb2到Thumb2
从Thumb2到ARM
何时需要将+1添加到地址?为什么?
答案 0 :(得分:1)
规则实际上非常简单:
这就是解释+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,如果您向该地址添加一个,您将破坏代码,如果你是偏执狂或没有做到正确你可以或一个人到地址,如果有它已经没有伤害,如果它没有那么它解决了阻止它在那里的问题。关于切换到拇指模式,我永远不会使用加号。