LDR是大范围的地址读取伪指令。将一个32位的常数或者一个地址值读取到指定寄存器中。
如 LDR R0, =0x5600050 @GPFCON地址
若地址值不超过MOV或MVN指令中地址的取值范围(一般是4K) %为什么有取值范围限制?
则直接用MOV指令代替。
若地址值超过范围,则编译器会将该常数放在数据缓冲区,同时用一条基于PC的LDR指令读取该常数。
如
LDR R1, =0XFFF
汇编后得到:
LDR R1, [PC, OFFSET_TO_LPOOL]
...
LPOOL DCD OXFFF @DCD伪操作用于分配一段字的内存单元,常用语初始化。
注意对于数据缓冲区,通常编译器会将数据缓冲区放在代码段的最后面(下一个代码段之前,或END伪操作之前)。为防止数据缓冲器越界,可以使用LTORG指令对数据缓冲池进行声明。主要用于无条件跳转指令之后,或者子程序返回指令之后,这样编译器就不会错误的将数据缓冲池的数据当做指令来执行。
如
AREA Example,CODE,READONLY
start BL func1
func1
;code
LDR r1, =0x55555555
;code
MOV pc, lr
LTORG
data SPACE 4200 ; 从当前位置开始分配4200字节的内存单元
END.