原创 adr和ldr的区别--华清远见嵌入式学院课堂问题笔记系列

2009-7-9 12:03 2692 9 10 分类: MCU/ 嵌入式

 


作者:孙晓明,华清远见嵌入式学院讲师。


同学们在学习ARM指令时,多数都会对adr和ldr这两个命令产生疑惑,那他们究竟有什么区别呢?


其实这两个都是伪指令:adr是小范围的地址读取伪指令,ldr是大范围的读取地址伪指令。可实际上adr是将基于PC相对偏移的地址值或基于寄存器相对地址值读取的为指令,而ldr用于加载32为立即数或一个地址到指定的寄存器中。到这儿就会看到其中的区别了。如果在程序中想加载某个函数或者某个在联接时候指定的地址时请使用adr,例如在lds中需要重新定位的地址。当加载32为的立即数或外部地址时请用ldr。


我给大家先举个例子:


AREA test,CODE,READONLY
        ENTRY


ldr r0,_start
        adr r0,_start
        ldr r0,=_start
        nop


        
_start
        nop
        END


这段代码并无实际意义,只是为了方便说明。我们反汇编一下看看:


4:                 ldr      r0,_start
        0x00000000          E59F0008      LDR       R0,[PC,#0x0008]
        5:                  adr      r0,_start
        0x00000004          E28F0004       ADD      R0,PC,#0x00000004
        6:                  ldr      r0,=_start
        0x00000008          E59F0004      LDR       R0,[PC,#0x0004]
        7:                  nop
        8:
        9:
        10: _start
        0x0000000C           E1A00000           NOP
        11:           nop


ldr           r0, _start


从内存地址 _start 的地方把值读入。执行这个后,r0 = 0xe1a00000


adr         r0, _start


取得 _start 的地址到 r0,但是请看反编译的结果,它是与位置无关的。其实取得的时相对的位置。例如这段代码在 0x00000000 运行,那么 adr r0, _start 得到 r0 = 0x00000010;


ldr          r0, =_start


这个取得标号 _start 的绝对地址。这个绝对地址是在 link 的时候确定的。看上去这只是一个指令,但是它要占用 2 个 32bit 的空间,一条是指令,另一条是 _start 的数据(因为在编译的时候不能确定 _start 的值,而且也不能用 mov 指令来给 r0 赋一个 32bit 的常量,所以需要多出一个空间存放 _start 的真正数据,在这里就是 0x0000000c)。


因此可以看出,这个是绝对的寻址,不管这段代码在什么地方运行,它的结果都是 r0 = 0x0000000c。

文章评论1条评论)

登录后参与讨论

用户1156376 2009-7-9 16:57

华清开blog了,恭喜啊! 我也是你们学员啊! 孙老师好吧?
相关推荐阅读
用户396724 2012-09-12 15:40
【视频课程】Android应用开发典型案例分析—主流mp3播放器
课程主题:Android应用开发典型案例分析—主流mp3播放器   详情课程大纲如下:     1  Android Project架构和eclipse开发环境搭建      1.1 Androi...
用户396724 2012-09-12 13:48
【视频课程】Android底层开发关键技术—Android系统移植与HAL框架开发
课程主题:Android底层开发关键技术—Android系统移植与HAL框架开发 详情课程大纲如下: 5  Android4.0系统的下载与编译       5.1 设置...
用户396724 2012-09-05 09:35
Android开发之性能优化概述
  程序能否运行的快速而高效,这在资源有限的移动终端设备上尤其显得重要。因为即使目前最强大的移动终端的计算能力也无法和市场上普通的桌面PC相抗衡。简单地说,有两个原则在资源受限的系统中必须遵守...
用户396724 2011-10-26 10:49
【华清远见】大型全国Linux及Android技术巡回讲座
     来源:华清远见嵌入式培训中心     开源Linux作为嵌入式领域内最成功、最主流的操作系统,其免费、开源、支持软件多、呼拥者众而带来的嵌入式产品成本低等优势,早已为大家所公认。同时,基于L...
用户396724 2011-09-30 15:12
Symbian移动应用开发前景分析、典型应用
视频主题:Symbian移动应用开发前景分析、典型应用 视频简介:本专题主要结合移动计算、移动互联网、应用程序商店等炙手可热的技术和应用领域,分析介绍Symbian移动应用开发的历史演进,以及未来QT...
用户396724 2011-09-30 15:08
Symbian移动应用开发前景分析、典型应用
视频主题:Symbian移动应用开发前景分析、典型应用 视频简介:本专题主要结合移动计算、移动互联网、应用程序商店等炙手可热的技术和应用领域,分析介绍Symbian移动应用开发的历史演进,以及未来QT...
我要评论
1
9
关闭 站长推荐上一条 /2 下一条