ARM处理器寻址方式

往期推荐

ARM指令集

ARM汇编语言程序结构

Android与ARM处理器

反射调用Java层方法

寻址的概述

寻址是指寻找寄存器里存放的数据或者是地址里存放的数据并加以使用。

寻址有以下八种方式:

1.立即寻址;
2.寄存器寻址;
3.寄存器移位寻址;
4.寄存器间接寻址;
5.基质寻址;
6.多寄存器寻址;
7.堆栈寻址;
8.相对寻址。

一:立即寻址

立即寻址指令中的操作码,字段后面的地址码部分,即是操作数本身,也就是说,数据包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址,具体操作流程如下图所示。

在这里插入图片描述

二:寄存器寻址

操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作,如下图所示。

在这里插入图片描述
在这里插入图片描述

三: 寄存器移位寻址

寄存器移位寻址是ARM指令集中特有的寻址方式,如下图所示。当第2个操作数是寄存器移位寻址方式时,第2个寄存器操作数在与第1个操作数运算之前,先进行移位操作,如下图所示。

在这里插入图片描述
在这里插入图片描述

四:寄存器间接寻址

寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针,如下图所示。

在这里插入图片描述

五:基址寻址

基址寻址就是将基址寄存器中的内容与指令给出的偏移量相加,形成操作数的有效地址,如图4.7所示。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等,如下图所示。


在这里插入图片描述

六: 多寄存器寻址

多寄存器寻址一次可传送若干个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。

在这里插入图片描述
在这里插入图片描述

在多寄存器寻址中会进行两个操作,一个是操作数据,另外一个是修改地址。
LDMIA中的A表示先进行①操作,再进行②操作。如果是LDMIB则表示先②后①,如下图所示。
LDMIA中的I表示存储器地址由低到高操作,如果是D则表示由高到低,如下图所示。

七:堆栈寻址

堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”,堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种,如下图所示。

向上生长:向高地址方向生长,称为递增堆栈。
向下生长:向低地址方向生长,称为递减堆栈。

在这里插入图片描述

堆栈指针指向最后压入的堆栈的有效数据项称为满堆栈,堆栈指针指向下一个待压入数据的空位置称为空堆栈。如下图所示。

在这里插入图片描述

这里可以组合出四种类型的堆栈寻址方式。

1.满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等。
2.空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等。
3.满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等。
4.空递减:堆栈向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED、STMED等。

八: 相对寻址

相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,地址码字段作为偏移量,两者相加得到的地址即为操作数有效地址,如下图所示。

在这里插入图片描述

小结:

通过今天的分享,我们了解了什么是寻址,以及寻址的八种方式:立即寻址、寄存器寻址、寄存器移位寻址、寄存器间接寻址、基地寻址、多寄存器寻址、堆栈寻址和相对寻址。

如果你也对安卓逆向感兴趣。可以加入下方的群,大家一起讨论问题,或者扫描下方二维码关注公众号,关注回复 “安卓逆向” 获取免费教程

安卓逆向交流学习:3543756281
vx:Yjxiaox

在这里插入图片描述