您的位置 首页 汽车

ARM汇编中B跳转指令和LDR跳转的差异

B跳转指令是代码位置无关的,经过汇编后会替换为当前PC值加(减)一个修正值,不管这条指令是在哪一个地址执行,都能跳转到指定的位置。B只…

  • B跳转指令是代码方位无关的,通过汇编后会替换为当时PC值加(减)一个修正值,不论这条指令是在哪一个地址碑文,都能跳转到指定的方位。
  • B只能在当时PC的32M规模内跳转,LDR只能在当时PC的4KB(0xfff规模)跳转。
  • LDR PC,=xxx指令将向PC直接装载一个标号xxx的值,但标号通过编译后将被替换为一个与RO相对应的值,这样不管指令在何处碑文都能跳转到一个指定的方位。
  • 以AT91SAM9260 的发动代码片段为例,0x10000000为Flash基址,0x20000000为SDRAM基址:

其间ENTRY为起点,也就是说这条代码的偏移为0.设HandlerReset的偏移为offset。假如将这段程序依照RO=0x10000000编译则:

b HandlerReset <=> ADD PC , PC,#offset

LDR PC,=HandlerReset <=> MOV PC , #(RO+offset)

当体系复位时,b HandlerReset 将PC指向0地址处Flash镜像代码的方位;而LDR PC,=HandlerReset将PC指向Flash中的原始代码方位,所以两者都能正常碑文。

可是,假如程序依照RO=0x20000000编译,编译后生成的代码仍是得烧写到Flash中,即0x10000000地址,体系复位后从0地址碑文,b HandlerReset仍碑文Flash镜像代码,程序能正常碑文,而LDR PC,=HandlerReset将使PC指向0x20000000+offset,此地址坐落SDRAM中,而此刻代码没有仿制,SDRAM中尚无代码,程序不能运转。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/264083.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部