ARM汇编中LDR与LTORG的关系
2016-05-09 来源:eefocus
最近对LDR与LTORG有了一些新的认识。
LDR是一个比较的指令。作用是从存储器到寄存器的单一数据读取指令。它有19条指令格式。
其中有两条格式为宏指令(macro),格式如下:
1,LDR
2,LDR
这里重点分析下第二条宏指令。它会被编译器编译成一条指令,把给定的32位数值保存到寄存器Rd.通常这掉指令是LDR
关于指令LDR
LTORG用于声明一个数据缓冲池,(也称为文字池)的开始。在使用伪指令LDR时,常常需要在适当的地方加入LTORG声明数据缓冲池,LDR加载的数据暂时被编译器放于数据缓冲池中。
使用说明:
当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止越界发生,可使用LTONG伪操作定义数据缓冲池。通常大的代码段可以使用多个数据缓冲池。ARM汇编编译器一般把数据缓冲池放在代码段的最后面,即下一代码段开始之前,或者END伪操作之前。LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误的将数据缓冲池中的数据当作指令来执行。
示例代码:
AREA Example ,CODE,READONLY; //声明一个代码段,名称为Example,属性为只读
Start BL funcl
;code
funcl //子程序
;code
LDR R1,=0x800 //将0X800加载到R1
MOV PC,lr //子程序结束
LTORG //定义数据缓冲池
data SPACE 4200 //从当前开始分配40字节的内存单元并初始化为0
END //程序结束
0x800的值被编译器暂时放在了data[0-3]字段中。