【ARM】ARM处理器寻址方式

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

猜你喜欢

转载自blog.csdn.net/dengjin20104042056/article/details/106791431