ldr与adr区别

转载 2013年12月02日 20:20:09

ldr与adr的区别

转自:http://coon.blogbus.com/logs/2738861.html

        ldr     r0, _start

        adr     r0, _start

        ldr     r0, =_start

        nop

        mov     pc, lr

_start:

        nop

        

编译的时候设置 RO 为 0x0c008000

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

0c008000 <_start-0x14>:

c008000:       e59f000c        ldr     r0, [pc, #12]   ; c008014 <_start>

c008004:       e28f0008        add     r0, pc, #8      ; 0x8

c008008:       e59f0008        ldr     r0, [pc, #8]    ; c008018 <_start+0x4>

c00800c:       e1a00000        nop                     (mov r0,r0)

c008010:       e1a0f00e        mov     pc, lr

0c008014 <_start>:

c008014:       e1a00000        nop                     (mov r0,r0)

c008018:       0c008014        stceq   0, cr8, [r0], -#80

分析:

ldr     r0, _start

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

adr     r0, _start

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

ldr     r0, =_start

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

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

LDR与ADR区别(转)

LDR与ADR区别(转) 在资料中,ADR的定义为:小范围的地址读取伪指令,ADR指令将基于PC相对偏移的地址值读取到寄存器中,在编译源程序时ADR伪指令被编译器替换成一 条合适的指令。...
  • zhangwenjianqin
  • zhangwenjianqin
  • 2012年06月25日 16:33
  • 2472

ARM指令 LDR 和 ADR的一些区别

LDR 是ARM中的指令,也是伪指令。当用 LDR r, =imd  // r 为寄存器, imd为立即数LDR 是一条伪指令。编译器会根据 立即数的大小,决定用 ldr 指令或者是mov或mvn指令...
  • zhou1232006
  • zhou1232006
  • 2011年01月16日 19:46
  • 13124

arm汇编指令之LDR 和 ADR的一些区别

arm汇编指令之LDR 和 ADR的一些区别
  • Ultraman_hs
  • Ultraman_hs
  • 2016年11月04日 18:58
  • 2261

ARM汇编指令:adr和ldr的前因后果

http://blog.sina.com.cn/s/blog_4b5210840100c80i.html 这两个都是伪指令:adr是小范围的地址读取伪指令,ldr是大范围...
  • Ray_ree
  • Ray_ree
  • 2015年09月01日 20:52
  • 1410

ADR与LDR伪指令

在学习ARM指令时,经常会对adr和ldr这两个命令产生疑惑,那他们究竟有什么区别呢?其实这两个都是伪指令:adr是小范围的地址读取伪指令,相于PC 寄存器或其它寄存器的小范围转移;ldr是大范围的读...
  • coder9999
  • coder9999
  • 2012年05月26日 17:58
  • 269

伪指令ADR和LDR的区别

1、一个事实:大部分指令是位置有关编码     a、位置无关编码(PIC,position independent code):汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关...
  • waynewu919512
  • waynewu919512
  • 2015年07月12日 10:42
  • 574

ldr与adr的区别

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://coon.blogbus.com/logs/2738861.html        ldr     r0, _start ...
  • rockhard
  • rockhard
  • 2009年05月11日 02:23
  • 954

u-boot start.S中relocate自搬运部分分析,adr与ldr区别

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://www.blogbus.com/coon-logs/2738861.html         l...
  • gujintong1110
  • gujintong1110
  • 2015年03月13日 22:59
  • 828

ADR/ADRL/LDR取地址区别

文章转自网络文章: 1、ADR伪指令--- 小范围的地址读取      ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。 在汇编编译器编译源程序时,...
  • lanhuazui10
  • lanhuazui10
  • 2016年03月15日 22:25
  • 180

adr 与 ldr 的区别

直接进入正题: adr r1,  var ldr  r1, = var var: .word 8 var: .word 8 上面两条指令都是取标号var 的地址 分别反汇编上面的代码: 假设它...
  • x19910304xiaoyao
  • x19910304xiaoyao
  • 2013年09月10日 09:12
  • 275
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ldr与adr区别
举报原因:
原因补充:

(最多只允许输入30个字)