【发布时间】:2013-08-22 06:13:28
【问题描述】:
值加载到r1寄存器的地址是如何计算的?
_start:
ldrh r1, [pc, #6]
PC的值=8054(ldrh指令的地址)
按照我的说法,地址的值应该是:PC + 6 = 805A
所以它应该将地址 805A 中的值加载到寄存器 r1 中。
【问题讨论】:
值加载到r1寄存器的地址是如何计算的?
_start:
ldrh r1, [pc, #6]
PC的值=8054(ldrh指令的地址)
按照我的说法,地址的值应该是:PC + 6 = 805A
所以它应该将地址 805A 中的值加载到寄存器 r1 中。
【问题讨论】:
这取决于您是处于 ARM 模式还是 Thumb 模式。
对于 ARM 模式:
当使用
R15作为基址寄存器时,您必须记住它包含一个 8 字节的地址 从当前指令的地址开始。
对于拇指模式:
PC的值将比该指令的地址大 4 个字节,但位PC的 1 被强制为 0 以确保它是字对齐的。
【讨论】:
PC 比当前指令提前两条指令,因为处理器完成了预取。在 ARM 模式下,这意味着 8 个字节,而在 Thumb 模式下,这意味着 4 个字节。如果LDRH 指令位于地址 0x8054 并且您使用 6 字节的立即偏移量,它将从地址 0x8054+8+6 == 0x8062 加载。