ARM Cortex A9中`ldr pc, _boot`与`b _boot`指令的区别是什么
ARM Cortex-A9 中
B _boot 与 LDR PC, _boot 的核心差异 指令本质与特性差异
B _boot是相对跳转指令:机器码中存储的是当前PC值到目标_boot地址的偏移量,执行时直接将当前PC加上偏移量得到目标地址写入PC完成跳转。- 跳转范围有限:32位ARM模式下
B指令的偏移量为24位有符号数,左移2位后对应±32MB的跳转范围,若_boot地址超出该范围,链接阶段会直接报错。 - 支持位置无关执行:只要
_boot和当前指令的相对偏移固定,不管这段代码被加载到内存的任意地址,都可以正常完成跳转。 - 不修改链接寄存器LR:仅
BL/BLX这类带链接属性的跳转指令才会自动写入返回地址到LR,普通B指令完全不涉及LR操作。
- 跳转范围有限:32位ARM模式下
LDR PC, _boot是绝对跳转指令:本质是从_boot对应的内存单元中读取存储的数值,直接写入PC寄存器完成跳转。- 无跳转范围限制:支持32位地址空间内的任意地址跳转,不受±32MB范围约束,通常用在跳转距离较远的场景,比如向量表跳转到外部Flash或DDR中的内核入口。
- 属于位置相关执行:读取的是
_boot地址中存储的绝对地址值,若代码被加载到非链接指定的地址,_boot的实际地址会偏移,跳转也会失效。 - 不修改链接寄存器LR:该指令属于普通内存加载操作,硬件不会自动操作LR。
与链接寄存器LR的关联
二者的差异完全和LR无关,两条指令执行时都不会修改LR的值,只有BL(带链接跳转)、BLX(带链接的指令集切换跳转)这类明确标注链接属性的指令,才会在跳转前自动把下一条指令的地址写入LR,用于后续函数返回。
内容的提问来源于stack exchange,提问作者Stone
相关产品推荐
相关产品推荐

