LDR伪指令在汇编时,如果立即数可以用<shifter_operand>表示的话就替换为MOV或MVN指令;如果不能用其表示则需要将该立即数放到一个文字池中,并生成一条将该文字池内容加载到目标寄存器的LDR指令。而使用LDR指令必须保证文字池在其可以访问的地址范围之内,对于ARM指令集来说就是4KB,所以必须在LDR指令前后4KB的范围内用LTORG显式地在代码段中添加一个文字池。
一直不明白汇编代码中的LTORG指令, 今天终于能明白了, 写出来大家看看.
LTORG是在此指令出现的地方放一个文本池(literal pool). 在ARM汇编中常用到
ldr r0, =instruction 将地址instruction载入r0.
此时编译器将ldr尽可能的转变成mov或mvn指令. 如果转变不成, 将产生一个ldr指令, 通过pc相对地址从一块保存常数的内存区读出instruction的值. 此内存区既是文本池. 一般的, 文本池放在END指令之后的地方. 但是, 如果偏移地址大于4k空间, ldr指令会出错(因为ldr的相对偏移地址为12-bit的值). 此时使用LTORG放到会出错的ldr指令附近, 以解决此问题. 编译器会收集没有分配的ldr的值放到此文本池中.
就这么些了.