ADR ADRL LDR区别及取值范围

参考http://www.groad.net/bbs/read.php?tid-1154.html

 

1 ADR伪指令--- 小范围的地址读取 
     ADR 伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
 
ADR 伪指令格式 : ADR{cond}   register, expr
地址表达式expr的取值范围:

    当地址值是字节对齐时,其取指范围为: -255  ~ 255B;
    当地址值是字对齐时,其取指范围为:   -1020 ~ 1020B;
 

2 、ADRL伪指令----中等范围的地址读取
ADRL 伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。
 
ADRL 伪指令格式: ADRL{cond}   register, expr
地址表达式expr的取值范围:

    当地址值是字节对齐时,其取指范围为: -64K~64K;
    当地址值是字对齐时,其取指范围为:   -256K~256K;
 

3 、LDR伪指令-----大范围的地址读取
LDR 伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。

在正常执行过程中,每执行一条ARM指令,程序计数器PC的值加4个字节;每执行一条THUMB指令,程序计数器寄存器PC加2个字节。整个过程按顺序执行。
ADR
	AREA     ARMex, CODE, READONLY
                                	      ; Name this block of code ARMex
    ENTRY                       ; Mark first instruction to execute
start
    adr r0,Delay
    MOV r0, #10        ; Set up parameters
    MOV r1, #3
    ADD r0, r0, r1     ; r0 = r0 + r1
    mul r0,r1,r1
Delay
    mov r0,r14
stop
    MOV r0, #0x18      ; angel_SWIreason_ReportException
    LDR r1, =0x20026   ; ADP_Stopped_ApplicationExit
    SWI 0x123456       ; ARM semihosting SWI

    AREA  ARMex ,DATA,READWRITE

    END                     ; Mark end of file
 

编译后:ADR伪指令被编译器替换成一条ADD或者SUB指令来实现该ADR伪指令功能
0x00000000   ADD       R0,PC,#0x0000000C
     ……
0x00000014   MOV       R0,R14
ADRL

	AREA     ARMex, CODE, READONLY
                                	      ; Name this block of code ARMex
    ENTRY                       ; Mark first instruction to execute
start
    adrl r0,Delay
    MOV r0, #10        ; Set up parameters
    MOV r1, #3
    ADD r0, r0, r1     ; r0 = r0 + r1
    mul r0,r1,r1
Delay
    mov r0,r14
stop
    MOV r0, #0x18      ; angel_SWIreason_ReportException
    LDR r1, =0x20026   ; ADP_Stopped_ApplicationExit
    SWI 0x123456       ; ARM semihosting SWI

    AREA  ARMex ,DATA,READWRITE

    END                     ; Mark end of file
 

编译后:ADRL被编译器替换成两条合适的指令
0x00000000  ADD       R0,PC,#0x00000010
0x00000004  ADD       R0,R0,#0x00000000
……
0x00000018  MOV       R0,R14

LDR

1)从指令位置到文字池的偏移量必须小于4KB
2)与ARM指令的LDR相比,伪指令的LDR的参数有“=”号
编译后:若加载的常数未超出MOV或者MVN的范围,则LDR伪指令被编译器替换成一条MOV或MVN指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。

LDR r0,=0xff000000;   mov r0,#0xff000000
LDR r1,=0xfffffffe;        mvn r1,#0x1

 

你可能感兴趣的:(区别)