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

发布者:BlissfulDreams最新更新时间:2016-05-09 来源: eefocus关键字: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中尚无代码,程序不能运行。

关键字:ARM汇编中  B跳转指令  LDR跳转 引用地址:ARM汇编中B跳转指令和LDR跳转的区别

上一篇:关于ARM汇编中使用宏定义的处理
下一篇:ARM 汇编中的跳转指令小记

推荐阅读最新更新时间:2024-03-16 14:53

ARM汇编的立即数
同事遇到这样一个问题: 在eVC编译出的汇编代码中我看到这样的语句: mov r2, #0xFF, 28 和 orr r2, r2, #0xB 这样得到的结果时 r2=#0xffb , 他试图更直接一点优化成一句:MOV r2,#0xffb 但是这样之后编译就出了问题:error A0092: no immediate rotate operand can be created: 4091 ------------------------------------我是无辜的分割线-------------------------------- 在 mov r2,#0xffb 这句中,不是MOV的用法出错,而是立即
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved