00. 目錄
文章目錄
01. 概述
ARM 指令集可以分爲跳轉指令、數據處理指令、程序狀態寄存器傳輸指令、Load/Store指令、協處理器指令和異常中斷產生指令。根據
使用的指令類型不同,指令的尋址方式分爲數據處理指令尋址方式和內存訪問指令尋址方式。
ARM 指令的尋址方式分爲數據處理指令尋址方式和內存訪問指令尋址方式。
02. 數據處理指令尋址方式
數據處理指令的基本語法格式如下:
<opcode> {<cond>} {S} <Rd>,<Rn>,<shifter_operand>
其中,<shifter_operand>有 11 種形式,如表所示。
數據處理指令尋址方式可以分爲以下幾種。
(1)立即數尋址方式。
(2)寄存器尋址方式。
(3)寄存器移位尋址方式。
2.1 立即數尋址方式
指令中的立即數是由一個 8bit 的常數移動 4bit 偶數位(0,2,4,…,26,28,30)得到的。所以每一條指令都包含一個 8bit 的常數 X 和移位值 Y,得到的立即數 = X 循環右移(2×Y),如下圖所示。
下面列舉了一些有效的立即數:
0xFF、0x104、0xFF0、0xFF00、0xFF000、0xFF000000、0xF000000F
下面是一些無效的立即數:
0x101、0x102、0xFF1、0xFF04、0xFF003、0xFFFFFFFF、0xF000001F
立即數應用示例
MOV R0,#0 ;送 0 到 R0
ADD R3,R3,#1 ;R3 的值加 1
CMP R7,#1000 ;將 R7 的值和 1000 比較
BIC R9,R8,#0xFF00 ;將 R8 中 8~15 位清零,結果保存在 R9 中
2.2 寄存器尋址方式
寄存器的值可以被直接用於數據操作指令,這種尋址方式是各類處理器經常採用的一種方式,也是一種執行效率較高的尋址方式。
寄存器尋址示例
MOV R2,R0 ;R0 的值送 R2
ADD R4,R3,R2 ;R2 加 R3,結果送 R4
CMP R7,R8 ;比較 R7 和 R8 的值
2.3 寄存器移位尋址方式
寄存器的值在被送到 ALU 之前,可以事先經過桶形移位寄存器的處理。預處理和移位發生在同一週期內,所以有效地使用移位寄存器,
可以增加代碼的執行效率。
寄存器移位尋址方式示例
ADD R2,R0,R1,LSR #5
MOV R1,R0,LSL #2
RSB R9,R5,R5,LSL #1
SUB R1,R2,R0,LSR #4
MOV R2,R4,ROR R0
03. 內存訪問指令尋址方式
內存訪問指令的尋址方式可以分爲以下幾種:
(1)字及無符號字節的 Load/Store 指令的尋址方式。
(2)雜類 Load/Store 指令的尋址方式。
(3)批量 Load/Store 指令的尋址方式。
(4)協處理器 Load/Store 指令的尋址方式。
(5)堆棧操作尋址方式。
3.1 字及無符號字節的 Load/Store 指令的尋址方式
字及無符號字節的 Load/Store 指令語法格式如下:
LDR|STR{<cond>}{B}{T} <Rd>,<addressing_mode>
其中,<addressing_mode>共有 9 種尋址方式,如下圖所示。
3.2 雜類 Load/Store 指令的尋址方式
使用該類尋址方式的指令的語法格式如下:
LDR|STR{<cond>}H|SH|SB|D <Rd>,<addressing_mode>
使用該類尋址方式的指令包括(有符號/無符號)半字 Load/Store 指令、有符號字節Load/Store 指令和雙字 Load/Store 指令。
該類尋址方式分爲 6 種類型,如下圖所示。
3.3 批量 Load/Store 指令的尋址方式
批量 Load/Store 指令將一片連續內存單元的數據加載到通用寄存器組中或將一組通用寄存器的數據存儲到內存單元中。
批量 Load/Store 指令的尋址模式產生一個內存單元的地址範圍,指令寄存器和內存單元的對應關係滿足這樣的規則,即編號低的寄存器
對應於內存中低地址單元,編號高的寄存器對應於內存中的高地址單元。
該類指令的語法格式如下:
LDM|STM{<cond>}<addressing_mode> <Rn>{!},<registers><^>
該類指令的尋址方式如表 3-4 所示。
3.4 堆棧操作尋址方式
堆棧操作尋址方式和批量 Load/Store 指令尋址方式十分類似。但對於堆棧的操作,數據寫入內存和從內存中讀出要使用不同的尋址模
式,因爲進棧操作(Pop)和出棧操作(Push)要在不同的方向上調整堆棧。
下面詳細討論如何使用合適的尋址方式實現數據的堆棧操作。
根據不同的尋址方式,將堆棧分爲以下 4 種。
(1)Full 棧:堆棧指針指向棧頂元素(last used location)。
(2)Empty 棧:堆棧指針指向第一個可用元素(the first unused location)。
(3)遞減棧:堆棧向內存地址減小的方向生長。
(4)遞增棧:堆棧向內存地址增加的方向生長。
根據堆棧的不同種類,將其尋址方式分爲以下 4 種。
(1)滿遞減 FD(Full Descending)。
(2)空遞減 ED(Empty Descending)。
(3)滿遞增 FA(Full Ascending)。
(4)空遞增 EA(Empty Ascending)。
表 3-5 列出了堆棧的尋址方式和批量 Load/Store 指令尋址方式的對應關係。
3.5 協處理器 Load/Store 指令的尋址方式
協處理器 Load/Store 指令的語法格式如下:
<opcode>{<cond>}{L} <coproc>,<CRd>,<addressing_mode>
04. 附錄
4.1 ARM Architecture Reference Manual