adr 与 ldr 的区别

直接进入正题:

adr:

adr r1, var

var: .word 0x0000 0008

ldr:

ldr r1, = var

var: .word 0x0000 0008

上面两条指令都是取标号var 的地址

分别反汇编上面的代码:

假设它们的链接地址都是-Text=0x0000 0000 

0: sub pc, pc, #4    //pc = 4

4: var.word 0x0000 0008


0: ldrpc, [pc, #0]//pc = 4

4: var:.word  0x0000 0008

8: .word4//缓冲池

由上面的代码可知:两条指令都是基于当前PC值的,把程序放在正确的链接地址它们都是可以正确执行的。

但是把它们放在任意地址的话,adr的会正确执行,ldr的会出现错误,为什么呢?

假设我们把上面的代码放到0x3000 0000 处:

0x3000 0000: add   subpc, pc, #4//它取到的是0x3000 0004

0x3000 0004: var.word0x0000 0008



0x3000 0000: ldrpc, [pc, #0]//重点:这条指令还是取到的是0x0000 0004

0x3000 0004: var:.word  0x0000 0008

0x3000 0008:.word  0x0000 0004//缓冲池

所以不难看出:出错的本质原因是在链接的时候分配缓冲池已经将标号var的地址已经定死,我们再怎么移动代码它都是固定值。

总结:要产生的代码与位置无关,用adr!

本人是菜鸟,刚刚学习arm汇编。如有错误谢谢指出。

猜你喜欢

转载自blog.csdn.net/x19910304xiaoyao/article/details/11515401
LDR