Load指令用于从内存中读取数据放入寄存器中;Store指令用于将寄存器中的数据保存到内存。
ARM有两大类的Load/Store指令:
1、用于操作32位的字类数据及8位无符号的字节类数据。
2、用于操作16位半字类的数据及8位有符号字节类型的数据。
接受的是第一类的Load/Store指令的寻址方式。
无论哪种Load/Store指令的寻址方式,其都有两部分组成,一部分是基址寄存器;另一部分是一个地址偏移量。基地址可以是任意一个通用寄存器。地址偏移量有三种形式,如下:
1)立即数。无符号数
2)寄存器。
3)寄存器及一个移位常数。一个通用寄存器和一个立即数组成
同样的,寻址方式的地址计算方式有如下3种:
1)偏移量方法。基址寄存器的值加上或减去一个偏移量,生成操作数地址。
2)事先更新方法。基址寄存器的值和偏移量做加减运算,生成操作数地址,指令执行后,生成的操作数地址写入基址寄存器。
3)事后更新方法。指令将基址寄存器的值作为操作数的地址执行内存访问。基址寄存器种的值和地址偏移量做加减运算,生成操作数地址。指令执行后,这个生成的操作数地址被写入基址寄存器。
已LDR指令为了介绍此类的Load/Store指令的编码格式和语法格式。
LDR指令故事如下。该指令主要用于从内存种将一个字的数据传送到寄存器种。
--cond:为指令执行的条件编码。
--I、P、U、W等位的含义在后面介绍。
--Rd:目标寄存器编码。
--Rn与Address_mode一起构成第二个操作数的内存地址。
LDR语法格式:
LDR{<cond>}{B} {T}<Rd>, <address_mode>
其中,<address_mode>表示第2个操作数的内存地址,共有9种格式如下:
--[<Rn>,#+/-<offset_12>]
--[<Rn>,+/-<Rm>]
--[<Rn>,+/-<Rm>, <shift>#<shift_imm>]
--[<Rn>,#+/-<offset_12>]!
--[<Rn>,+/-<Rm>]!
--[<Rn>,+/-<Rm>, <shift>#<shift_imm>]!
--[<Rn>],#+/-<offset_12>
--[<Rn>],+/-<Rm>
--[<Rn>],+/-<Rm>,<shift>#<shift_imm>