Load/Store指令是对内存进行存储/加载数据操作的指令,根据访问的数据格式的不同,将这类指令的寻址分为字、无符号字节的Load/Store指令寻址和半字、有符号字节Load/Store指令寻址两大类。
一、地址计算方法
1、寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:
LDR R0, [R1] ;从R1寄存器指向的地址中取出一个字的数据,存储到R0寄存器中
STR R0,[R1] ;将R0的值传送到以R1的值为地址的存储器中
2、基址加变址寻址
基址加变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。
根据访问存储单元和基地址寄存器更新的先后顺序可以将基址加变址寻址分为两种:
1)前变址法:基地址寄存器中的值和地址偏移量先作加减运算,生成的操作数作为内存访问的地址。
2)后变址法:将基地址寄存器中的值直接作为内存访问的地址进行操作,内存访问完毕后基地址寄存器中的值和地址偏移量作加减运算,并更新基地址寄存器。
采用变址寻址方式的指令常见有以下几种形式:
LDR R0, [R1, #4] ;将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中
LDR R0, [R1, #4] ! ;将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中;然后,R1的内容自增4(也就是R1的内容加4后写回到R1中)。
LDR R0, [R1], #4 ;以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4。
LDR R0, [R1, R2] ;将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。
二、字、无符号字节寻址
在Load/Store指令中,字与无符号字节操作指令编码格式如下:
type(bit[27:26]):指令类型码,01代表Load/Store指令。
汇编指令语法格式如下。
加载指令:
LDR {<cond>} {B} {T} <Rd>, <Addressing_mode>
存储指令:
STR {<cond>} {B} {T} <Rd>, <Addressing_mode>
其中:
cond为指令执行的条件,Rn为基址寄存器,Rd为源/目标寄存器,Addressing_mode内存地址构成格式。
I(bit[25]) | 描述 |
I=1 | 偏移量为寄存器或寄存器移位形式 |
I=0 | 偏移量为12位立即数 |
P(bit[24]) | 描述 |
P=1 | 前变址操作 |
P=0 | 后变址操作 |
U(bit[23]) | 描述 |
U=1 | 内存地址address为基址寄存器Rn值加上地址偏移量 |
U=0 | 内存地址address为基址寄 |