|
ARM有9种寻址方式,分别为: 1、寄存器寻址 2、立即数寻址 3、寄存器偏移寻址 4、间接寻址
寄存器间接寻址指令中的地址码给出的是一个通用寄存器编号,所需要
的操作数保存在存储器指定地址的存储单元中,即寄存器为操作数的地
址指针。 寄存器间接寻址指令取例如下: LDR R1,[R2]
5、基址寻址
基址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作
数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数
组操作,功能部件寄存器访问等 例如: LDR R2,[R3,#0X0F] STR R1,[R0,#-2]
6、多寄存器寻址
多寄存器寻址就是一次可以传送几个寄存器的值,允许一条指令传送16
个寄存器的任何子集或所有的寄存器。 例: LDMIA R1!,{R2-R7,R12} ;将R1单元中的数据读出到R2-R7,R12,
R1自动加1 STMIA R0!,{R3}
7、堆栈寻址
存储器堆栈可分为两种: 1、向上生长:向高地址方向生长,称为递增堆栈 2、向下生长:向低地址方向生长,称为递减堆栈 堆栈指向最后压入的堆栈的有效数据项,成为满堆栈 堆栈指向下一个要放入的空位置,称为空堆栈 1、满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含
有效数据项的最高地址。指令如LDMFA、STMFA等 2、空递增:堆栈通过增大存储器地址向上增长,堆栈指针指向堆栈的
第一个空位置。指针如LDMEA、STMEA等 3、满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向含有
数据项的最低地址,指令如LDMFD,STMFD等 4、空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈
的下的第一个空位置,指令如LDMED、STMED等 例: STMFD SP!,{R1-R7,LR};将R1-R7,LR入栈,满递减堆栈 LDMFD SP!,{R1-R7,LR};数据出栈,放入R1-R7,LR寄存器。
第一个字母:F表示:满,E表示:空。 第二个字母:A表示:增,D表示:减
8、块拷贝寻址
多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置。 例: STMIA R0!,{R1-R7} ;将R1--R7的数据保存在存储器中,存储器指
针在保存第一个值后增加,增长方向为向上
增长。 STMIB R0!,{R1-R7} ;将R1--R7的数据保存在存储器中,存储器指
针在保存第一个值前增加,增长方向为向上
增长。 STMDA R0!,{R1-R7} ;将R1--R7的数据保存在存储器中,存储器指
针在保存第一个值后增加,增长方向为向下
增长。 STMDB R0!,{R1-R7} ;将R1--R7的数据保存在存储器中,存储器指
针在保存第一个值前增加,增长方向为向下
增长。
9、相对寻址
相对寻址是基址寻址的一种变通,由程序计数器PC提供的基准地址,指
令中的地址码字段为偏移量,两者相加后得到的地址为操作数的有效地
址 例: BL ROUTE1 ;调用到ROUTE1子程序 BEQ LOOP ;条件跳转到LOOP标号处。
|