一次间接寻址的有效地址_ARM处理器寻址方式

435b041dbd525b33e035f1ad0a3d0ec2.png

寻址的概述

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

寻址有以下八种方式:

1.立即寻址;

2.寄存器寻址;

3.寄存器移位寻址;

4.寄存器间接寻址;

5.基质寻址;

6.多寄存器寻址;

7.堆栈寻址;

8.相对寻址。

一:立即寻址

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

3f96e75158ada2d585f3116594090bc0.png

二: 寄存器寻址

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

b5b31aa596b4da2b32ee5c42b3b99b03.png

1457841236066ebf87cbb16cea43f71b.png

三: 寄存器移位寻址

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

b64b7dc5ec62e22434fc248f2587c614.png

cde09d39e8626974cbcb840b03a330fb.png

四: 寄存器间接寻址

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

7a99dbeee8ccb9deb89cad3aec9d6e4c.png

五:基址寻址

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

1db0bd236c20927b7dd84756aa560344.png

9d50eebf121b96c11c6f9aa3d7a40d7a.png

六:多寄存器寻址

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

在多寄存器寻址中会进行两个操作,一个是操作数据,另外一个是修改地址。

LDMIA中的A表示先进行①操作,再进行②操作。如果是LDMIB则表示先②后①,如下图所示。

LDMIA中的I表示存储器地址由低到高操作,如果是D则表示由高到低,如下图所示。

2b2322f603b3474dab3513bd6d0ac5b0.png

f32522b56532b809ad094e14b012cd1f.png

七:堆栈寻址

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

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

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

8aa316d06cd4a6b01b99332b4b5fdc8c.png

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

da344bb8e86f16460c7cea4397b74578.png

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

1.满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等。

2.空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等。

3.满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等。

4.空递减:堆栈向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED、STMED等。

八:相对寻址

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

508268d7eeed28ea4e592e4c4ee2f9b3.png

小结:

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

如果你也对安卓逆向感兴趣,可以到了评论区讨论,遇到了问题可以找我解惑,我这儿也有相应的资料,免费赠送给需要的小伙伴们,需要可以私聊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值