Cortex M0+平台Thumb LDR指令PC相对寻址计算方法咨询
Cortex-M0+平台Thumb LDR指令PC相对加载地址分步计算方法
核心规则
Cortex-M0+中执行Thumb指令时,PC的bit[0]始终为0(bit0是Thumb状态标识,不属于地址有效部分),计算前必须先清除当前指令地址的bit[0],得到对齐后的指令地址。
分步计算流程
针对ldr <Rn>, [pc, #<offset>]类Thumb LDR指令,目标加载地址计算步骤:
- 获取当前LDR指令的实际地址(如示例中的
0x1000'0306) - 清除地址的bit[0],得到对齐后的指令地址(
0x1000'0306→0x1000'0304) - 对齐后的地址加4(PC指向当前指令之后的第2条Thumb指令,单条Thumb指令占2字节,故偏移+4)
- 加上指令中指定的立即数偏移,得到最终目标地址
验证示例
示例1
指令:0x1000'0306: LDR.N R4, [PC, #0xc0]
计算步骤:
- 清除bit[0]:
0x1000'0306→0x1000'0304 - 加4:
0x1000'0304 + 0x4 = 0x1000'0308 - 加偏移:
0x1000'0308 + 0xc0 = 0x1000'03C8(与正确结果一致)
示例2
指令:0x1000'0306: LDR.N R4, [PC, #0xc8]
计算步骤:
- 清除bit[0]:
0x1000'0306→0x1000'0304 - 加4:
0x1000'0304 + 0x4 = 0x1000'0308 - 加偏移:
0x1000'0308 + 0xc8 = 0x1000'03D0(与正确结果一致)
关键说明
常见错误是直接使用带bit0为1的指令原始地址计算,导致结果偏移2字节。必须牢记:Thumb模式下PC的bit0是状态标识,不属于地址有效位,计算前必须清除。
内容的提问来源于stack exchange,提问作者mrbean
相关产品推荐
相关产品推荐

