码迷,mamicode.com
首页 > 其他好文 > 详细

ldr和adr的区别

时间:2015-04-28 14:03:12      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

这几天看汇编,ldr和adr之间的区别老是给搞混,看了很多资料越看越晕,于是写了个测试程序反编译了一下一下子都清楚了,见下面:

源码:

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

 _start:
   nop
   mov ip, lr

反汇编之后的:

8068: e28f0010 add r0, pc, #16
806c: e1a00000 nop ; (mov r0, r0)
8070: e59f0008 ldr r0, [pc, #8] ; 8080 <_start>
8074: e1a00000 nop ; (mov r0, r0)
8078: e59f0008 ldr r0, [pc, #8] ; 8088 <_start+0x8>
807c: e1a00000 nop ; (mov r0, r0)

00008080 <_start>:
8080: e1a00000 nop ; (mov r0, r0)
8084: e1a0c00e mov ip, lr
8088: 00008080 .word 0x00008080

通过反汇编之后的代码很容易就理解了:

adr r0, _start;相对取址,r0中保存的是pc+16的值:8088,这个是随着不同的链接而变;ps:这个是pc指针;

ldr r0,_start和ldr r0,=_start;都是取值,前者取得start标号地址8080处的值:e1a00000,后者取得start标号存储的8088地方的值:00008080;

因为adr r0, _start;r0中存在的是pc+16的pc指针地址,所以会随着pc不同而变化,故称之为相对取址;

ldr r0,_start和ldr r0,=_start;r0中存在的都是[pc+8]的值,不会改变,故称之为绝对取值;

 

ldr和adr的区别

标签:

原文地址:http://www.cnblogs.com/snail-micheal/p/4462730.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!