寻址方法是依据指令中给出的地址码字段来完成寻觅实在操作数地址的方法。
ARM处理器具有9种根本寻址方法:
1.存放器寻址;
2.当即寻址;
3.存放器移位寻址;
4.存放器直接寻址;
5.基址寻址;
6.多存放器寻址;
7.仓库寻址;
8.块复制寻址;
9.相对寻址。
1,寻址方法分类——当即寻址
当即寻址指令中的操作码字段后边的地址码部分便是操作数自身,也便是说,数据就包含在指令傍边,取出指令也就取出了能够当即运用的操作数(这样的数称为当即数)。当即寻址指令举例如下:
SUBSR0,R0,#1 ;R0减1,成果放入R0,而且影响标志位
MOVR0,#0xFF000 ;将当即数0xFF000装入R0存放器
2,寻址方法分类——存放器寻址
操作数的值在存放器中,指令中的地址码字段指出的是存放器编号,指令执行时直接取出存放器值来操作。存放器寻址指令举例如下:
MOV R1,R2 ;将R2的值存入R1
SUB R0,R1,R2 ;将R1的值减去R2的值,成果保存到R0
3,寻址方法分类——存放器移位寻址
存放器移位寻址是ARM指令集特有的寻址方法。当第2个操作数是存放器移位方法时,第2个存放器操作数在与第1个操作数结合之前,挑选进行移位操作。存放器移位寻址指令举例如下:
MOVR0,R2,LSL #3 ;R2的值左移3位,成果放入R0, ;便是R0=R2×8
ANDSR1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相 ;“与”操作,成果放入R1
4,寻址方法分类——存放器直接寻址
存放器直接寻址指令中的地址码给出的是一个通用存放器的编号,所需的操作数保存在存放器指定地址的存储单元中,即存放器为操作数的地址指针。存放器直接寻址指令举例如下:
LDRR1,[R2];将R2指向的存储单元的数据读出
;保存在R1中
SWPR1,R1,[R2];将存放器R1的值和R2指定的存储
;单元的内容交流
5,寻址方法分类——多存放器寻址
多存放器寻址一次可传送几个存放器值,答应一条指令传送16个存放器的任何子集或一切存放器。多存放器寻址指令举例如下:
LDMIAR1!,{R2-R7,R12} ;将R1指向的单元中的数据读出到
;R2~R7、R12中(R1主动加1)
STMIAR0!,{R2-R7,R12} ;将存放器R2~R7、R12的值保
;存到R0指向的存储; 单元中
;(R0主动加1)
6,寻址方法分类——基址寻址
基址寻址便是将基址存放器的内容与指令中给出的偏移量相加,构成操作数的有用地址。基址寻址用于拜访基址邻近的存储单元,常用于查表、数组操作、功用部件存放器拜访等。基址寻址指令举例如下:
LDRR2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元
;的内容,放入R2
STRR1,[R0,#-4]! ;先R0=R0-4,然后把R1的值存放
;到保存到R0指定的存储单元
7,寻址方法分类——仓库寻址
仓库是一个按特定次序进行存取的存储区,操作次序为“后进先出” 仓库寻址是隐含的,它运用一个专门的存放器(仓库指针)指向一块存储区域(仓库),指针所指向的存储单元便是仓库的栈顶。存储器仓库可分为两种:
向上成长:向高地址方向成长,称为递加仓库
向下成长:向低地址方向成长,称为递减仓库
仓库指针指向最终压入的仓库的有用数据项,称为满仓库;仓库指针指向下一个待压入数据的空方位,称为空仓库。
所以能够组合出四种类型的仓库方法:
满递加:仓库向上添加,仓库指针指向内含有用数据项的最高地址。指令如LDMFA、STMFA等;
空递加:仓库向上添加,仓库指针指向仓库上的第一个空方位。指令如LDMEA、STMEA等;
满递减:仓库向下添加,仓库指针指向内含有用数据项的最低地址。指令如LDMFD、STMFD等;
空递减:仓库向下添加,仓库指针向仓库下的第一个空方位。指令如LDMED、STMED等。
8,寻址方法分类——块复制寻址
多存放器传送指令用于将一块数据从存储器的某一方位复制到另一方位。 如:
STMIAR0!,{R1-R7};将R1~R7的数据保存到存储器中。
;存储指针在保存第一个值之后添加,
;添加方向为向上添加。
STMIBR0!,{R1-R7};将R1~R7的数据保存到存储器中。
;存储指针在保存第一个值之前添加,
;添加方向为向上添加。
9,寻址方法分类——相对寻址
相对寻址是基址寻址的一种变通。由程序计数器PC供给基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有用地址。相对寻址指令举例如下:
BLSUBR1;调用到SUBR1子程序
BEQLOOP;条件跳转到LOOP标号处
…
LOOPMOVR6,#1
…
SUBR1…
(end)