ARM伪指令ldr&adr使用 代码重定位实现

ARM伪指令LDR&ADR的作用相同,都是讲标号所代表的地址赋予寄存器,但是二者的实现机制是不一样的:

LDR采用绝对地址,ADR采用相对地址。从而也导致其结果可能会不一样,也因此可以用来搭配使用,实现代码的重定位。

 

先简单介绍一下,LDR和ADR的使用例子:

         adr    r0, _start
         ldr     r1, =_start
_start:
          b _start
反汇编后:

格式说明:

链接地址:机器码指令:汇编指令

0xD0000000: e28f0000 add r0, pc, #0 ; 0x0
0xD0000004: e59f0000 ldr r1, [pc, #0] ; 0x10
0xD0000008: eafffffe b 0xc
0xD000000C: D0000008 andcc r0, r0, ip

执行后,r0=0xD0000008 ; r1=0xD0000008;

 

如何实现代码重定位:

利用LDR和ADR的实现机制的不同,配合链接脚本,把代码的链接地址进行重定位即可实现。

比如:在上例中将代码在链接脚本中将链接地址重定位到(0x80000000),则编译执行后r0=0xD0000008;r1=0x80000008

你可能感兴趣的:(嵌入式)