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

在這裏插入圖片描述