您的位置:首页 > 其它

LDR指令

2013-08-01 23:56 141 查看
基本用法:

LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个

地址偏移量。地址偏移量有以下3种格式:

立即数。

立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。

如:LDR R1,[R0,#0x12] ;R1<-[R0+0x12]

寄存器。

寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。

如:LDR R1,[R0,R2] ; R1<-[R0+R2]

LDR R1,[R0,-R2]
; R1<-[R0-R2]

寄存器及移位常数。

寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。

如:LDR R1,[R0,R2,LSL
#2] ;R1<-[R0+R2*4]

从寻址方式的地址计算方法分,加载/存储指令有以下4种格式:

零偏移。 如:LDR Rd,[Rn]

前索引偏移。 如:LDR Rd,[Rn,#0x04]!

程序相对偏移。 如:LDR Rd,labe1

后索引偏移。 如:LDR Rd,[Rn],#-0x04

注意:必须保证字数据操作的地址是32位对齐的。

与伪指令的区别:

ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。

 (1)LDR   r0,=name,像这种带等号的是伪指令,而不是ARM指令,LDR 伪指令用于加载立即数或一个地址值到指定寄存器. 

         *如果name是立即数的话:LDR R0,=0X123;//将0X123存入R0

         *如果name是个标识符:LDR R0,=NAME;//将NAME的地址存入R0

         相当于: LDR R0,LABEL;

         当然,两者的前提都是LABEL DCB NAME;//分配内存并用NAME初始化(LABEL为内存的起始地址?)

(2)LDR R1,[R0] ;如果没有等号,LDR 指令用于从内存中读取数据放入寄存器中.该指令是 将R0 地址处的数据读出,保存到R1 中(零偏移)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: