在 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,如果您向该地址添加一个,您将中断代码,如果你是偏执狂或没有做对,你可以或一个到地址,如果它有它已经没有伤害,如果它没有那么它解决了阻止它存在的问题。关于切换到拇指模式,我永远不会使用加一。
我对 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,如果您向该地址添加一个,您将中断代码,如果你是偏执狂或没有做对,你可以或一个到地址,如果它有它已经没有伤害,如果它没有那么它解决了阻止它存在的问题。关于切换到拇指模式,我永远不会使用加一。