ARM的9中寻址方式
0赞所谓寻址方式就是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。
寄存器寻址:操作数的值放在寄存器中,指令中的地址码字段存放的是寄存器的编号,指令执行时取出寄存器的值来操作。汇编指令如下: MOV R2,R1
立即寻址:操作码字段后面的地址码部分直接存放操作数本身,即数据就包含在指令当中。汇编指令如下: MOV R1,#0x11
寄存器移位寻址:该寻址方式是ARM指令集特有的寻址方式,第二个寄存器操作数在与第一个操作数结合之前,先进行移位操作 。汇编指令如下: MOV R0, R2, LSL#3
寄存器间接寻址:地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。汇编指令如下: LDR R3,[ R2]
基址寻址:将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,实质是在访问基址附近的存储单元,该寻址方式通常用来查表,数组操作等。汇编指令如下: LDR R2,[R3,#0x0C]
多寄存器寻址:一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。汇编指令如下: LDMIA R1!,{R2-R7,R12}
堆栈寻址:堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出” 。堆栈寻址使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。有四种类型的堆栈方式:
满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;
空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;
满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;
空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。
汇编指令如下: LDMFD SP!,{R1-R7,R14}
相对寻址:一种特殊的基址寻址,是由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后的地址为有效的操作数地址。
BL SUBR1 ;调用到SUBR1子程序
BEQ LOOP ;条件跳转到LOOP标号处
...
LOOP MOV R6,#1
...
SUBR1 ...
块拷贝寻址:用于将一块数据从存储器的某一位置拷贝到另一位置。汇编指令如下:
LDMIA R1!,{R2-R7,R12}
