4.7 Literal pools
--ARM® Compiler Version 5.04 armasm User Guide
汇编器在代码节中使用文字池来存放一些常量数据 。你可以使用指示符LTORG来确保文字池位于
有效的范围内。
汇编器默认把文字池放在每一个代码节的末尾处。代码节的末尾的确定或者是由汇编源文件尾部的
指示符END确 定,或者由相邻代码节的起始行上指示符AREA确定。被汇编源文件包含的文件的尾部指
示符END不能标志一个 节的 结束。
默认情况下,文字池位于代码节的尾部。在大的代码节中,默认文字池与代码节中一条或多条LDR
伪指令的 距离 可能超出LDR伪指令操作数的寻址范围。从PC到文字池中的常量数据的偏移必须是:
* 当伪指令是32位时,在ARM或Thumb代码中,必须小于4K字节,常量数据的位置可以是在伪指令
的前面,也可以 是在伪指令的后面i。
* 当伪指令是16位Thumb指令时,必须小于1K字节,且文字池必须位于伪指令的后面。
当一条形如:LDR Rd, =const 伪指令需要一个文字池来存放立即数常量时,汇编器:
* 检查已经存在于该伪指令前面的文字池中是否有相同的常量且其偏移量是否在伪指令的允许寻址
范围内。如果条件满足,汇编器引用这个满足条件的常量。
* 否则,汇编器尝试把该常量值放到下一个文字池中。
如果下一个文字池超出伪指令的寻址范围,汇编器会产生一条错误信息。在这种情况下,你必须显
示地使用指示符LTORG来在代码节中放置一个附加的文字池。把指示符LTORG放在导致错误的伪指令后
面,并且位于伪指令LDR的有 效寻址范围内。
你必须把文字池放在代码节中处理器不会试图把它当作指令去执行的地方。建议放在无条件跳转指令
后或子程序的返回指令后。下面的一段ARM汇编代码是由汇编器生成的,可以清楚地表明上述规定是如何
工作的:
图1: 文字池的放置