ARM偽指令ldr&adr使用 程式碼重定位實現

蕭何二代發表於2013-06-16

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

相關文章