ARM汇编中B跳转指令和LDR跳转的区别

  • 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中尚无代码,程序不能运行。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值