您的位置 首页 开关

ARM汇编中ldr与adr的差异

ldrr0,_startadrr0,_startldrr0,=_startnopmovpc,lr_start:nop编

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

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部