嵌入式:ARM间接寻址、变址寻址与多寄存器寻址
文章目录
寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:
LDR R0,[R1] /*R0←[R1]*/
STR R0,[R1] /*[R1]←R0*/
第一条指令将以R1的值为地址的存储器中的数据传送到R0中。第二条指令将R0的值传送到以R1的值为地址的存储器中。
ARM的数据传送指令都是基于寄存器间接寻址,即通过Load/Store完成对数据的传送操作。
基址加偏址寻址(变址寻址)
基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量(用12位表示,不超过4KB)相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。
变址寻址方式可以分为:前变址(Pre-indexed)、自动变址(Auto-indexed)和后变址(Post-indexed)。
前变址模式
LDR R0,[R1,#4] ;R0←[R1+4]
自动变址模式
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
后变址模式
LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4
偏移地址
地址偏移除了可以是一个12位的立即数,还可以是另一个寄存器,并且在加到基址寄存器之前还可以先经过移位操作,如:
LDR R0,[R1,R2] ;R0←[R1+R2]
LDR R0,[R1,R2,LSL #2] ;R0←[R1+R2*4]
传送数据类型
ARM处理器支持的传送数据类型可以是有符号和无符号的8位字节、16位半字、32位字,最高位表示符号位(正数为0,负数为1)。对于字节操作,在指令中增加了字母B,对于半字,在指令中增加了字母H进行标识。默认是字操作,不加数据类型标识。如:
LDRB R0,[R1] ;R0←mem8[R1], 加载8位字节数据到寄存器R0,零扩展到32位