ARM 处理器是加载/ 存储体系结构的处理器,对存储器的访问只能通过加载和存储指令实现。
1. 数据加载与存储的方向问题
数据加载与存储( Load-store )指令用于在存储器和处理器的寄存器之间传送数据。
数据加载与存储指令共有三种类型:单寄存器加载与存储指令、多寄存器加载与存储指令和交换指令。
2. 数据加载与存储指令的寻址
数据加载与存储类指令的基本格式为 opcode{<cond>} Rd ,addr 。格式中opcode 为指令代码,如 LDR 表示将存储器中的数据加载到寄存器中。addr 为存储器的地址表达式,也称为第2操作数,可表示为 [Rn,offset] ,其中 Rn 表示基址寄存器, offset表示偏移量。Addr 有如下几种表示形式:
(1)立即数
立即数可以是一个无符号的数值,这个数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:
LDR R5 ,[R6 ,#0x08]
STR R6 ,[R7] ,#-0x08
(2)寄存器
寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:
LDR R5,[R6,R3]
STR R6,[R7],-R8
(3)寄存器移位
这种格式由一个通用寄存器和一个立即数组成,寄存器中的数值可以根据指令中的移位标志以及移位常数作一定的移位操作,生成一个地址偏移量。这个地址偏移量可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:
LDR R3,[R2,R4,LSL#2]
LDR R3,[R2],-R4,LSR#3
(4 )标号
这是一种简单的寻址方法。在这种方法中,程序计数器 PC是隐含的基址寄存器,偏移量是语句标号所在的地址和 PC(当前正在执行的指令)之间的差值。例如:
LDR R4,START
3. 地址索引
ARM 指令中的地址索引也是指令的一个功能,索引作为指令的一部分,它影响指令的执行结果。地址索引分为前索引(Pre-indexed)、自动索引(Auto-indexed 和后索引(Post-indexed) 。
(1) 前索引
前索引也称为前变址,这种索引是在指令执行前把偏移量和
基址相加/ 减,得到的值作为寻址的地址。例如:
LDR R5,[R6,#0x04]
STR R0,[R5,-R8]
(2) 自动索引
自动索引也称为自动变址,有时为了修改基址寄存器的内容,使之指向数 传送地址,可使用这种方法自动修改基址寄存器。例如:
LDR R5,[R6,#0x04]!
(3) 后索引
后索引也称为后变址,后索引就是用基址寄存器的地址值寻址,找出操作数进行操作,操作完成后,再把地址偏移量和基址相加/ 减,结果送到基址寄存器,作为下一次寻址的基址。例如:
LDR R5,[R6],#0x04
STR R6,[R7],#-0x08
(4) 不同索引方式的区别
前索引和自动索引的区别是:前索引方式利用对基址寄存器的改变值进行寻址,但是基址寄存器在操作之后仍然保持原值。自动索引在计算出新的地址后要用新的地址更新基址寄存器的内容,然后再利用新的基址寄存器进行寻址;
前索引和后索引的区别:前索引在指令执行完成后并没有改变基址寄存器的值,后索引在指令执行完成后改变了基址寄存器的地址值。
后索引和自动索引的区别:后索引和自动索引类似,也要更新基址寄存器的内容,但是变址方式先利用基址寄存器的原值进行寻址操作,然后再更新基址寄存器。这 种方式在遍历数组时是很有用的。