当LDR Rd,=指令要访问文字池中的常量时,汇编器先检查在当前文字池是否可以访问到,池中是否有所需要的常量。如果是,则对已存在的常量进行编址,否则试图把常量放到下一个文字池中。如果下一个文字池不可访问(因为不存在或者到它的距离超过4KB),则汇编器会报错,这时应该在LDR Rd,=指令后较近的地方放置一个LTORG伪指令。
请看下面的例子(作为注释列出的指令是汇编器产生的):
AREA Loadcon2,CODE
ENTRY
BL func1
BL func2
SWI 0x11
func1
LDR r0,=42 ======> MOV r0,#42
LDR r1,=0x55555555 ======> LDR r1,[pc,#offset 到文字池1]
LDR r2,=0xFFFFFFFF ======> MVN r2,#0
MOV pc,lr
LTORG ======> 文字池1包含字面常量0x55555555
func2
LDR r3,=0x55555555 ======> LDR r3,[pc,#offset 到文字池1]
;LDR r4,=0x66666666 ;注释掉这一句会发生错误,因为文字池2不可访问(距离超过4KB)一个文字池只可以放一个32位立即数同一段代码若出现两个32位无法通过移位得到的立即数,则将分两个文字池存放。
MOV pc,lr
LargeTable % 4200 ;从当前位置清除4200字节的内存,从而让END后面的文字池距离超过4KB
END
注意文字池必须放置在执行代码外面(应置于无条件分支指令后,也可以放置在子程序结束返回指令后),否则处理器会把它当作指令来执行。