**寻址模式**（Addressing modes）是中央处理器（CPU）设计中，指令集架构的一部分。各个指令有不同的寻址模式，这些寻址模式决定此架构下的机器语言指令对应的運算數。寻址模式会通过暂存器中的数值或机器指令中的常数来计算运算数的记忆体位址。

在计算机程序设计中，寻址模式主要是汇编语言使用者和编译器编写者需要關注的。对于一个相关的概念，请参阅正交指令集，它涉及到任何指令使用任何寻址模式的能力。

警告
--

注意，各种寻址模式都没有一个被普遍接受的的名称。不同的作者和计算机制造商可以为相同的寻址模式赋予不同的名称，或者为不同的寻址模式赋予相同的名称。

术语"寻址模式"本身也有不同的解释：可以解释为"存储器地址计算方式"，也可以解释为"操作数访问方式"。 在第一种解释下，不从存储器读取或写入存储器的指令（例如"将立即数放入寄存器"）被认为没有"寻址模式"。 第二种解释允许诸如VAX的机器使用立即数模式位来允许寄存器或立即数。 只有第一种解释适用于诸如"加载有效地址"之类的指令。

下面列出的寻址模式分为代码寻址和数据寻址。 大多数计算机体系结构都保持这种区别，但是存在一些允许在（几乎）任何上下文中使用任何寻址模式使用的体系结构。

下面的说明纯粹具有代表性，以说明寻址模式，并不一定反映任何特定计算机使用的助记符。

### 寻址模式的数量

不同的计算机体系结构在硬件中提供的寻址模式数量上有很大差异。 消除复杂寻址模式并仅使用一个或几个更简单的寻址模式有一些好处，即使它需要一些额外的指令，也许还需要一个额外的寄存器。 如果只有一些简单的寻址模式，那么设计管流水线CPU将变得更为简单。

大多数RISC架构只有大约五种简单的寻址模式，而DECCAX等CISC架构有十几种寻址模式，其中一些非常复杂。 IBM System/360架构只有三种寻址模式，System/390又添加了一些。

当只有少数寻址模式时，所需的特定寻址模式通常在指令代码中编码（例如IBM System/360和后继者，还有大多数RISC）。 但是当存在许多寻址模式时，通常在指令中留出特定字段来指定寻址模式。 DEC VAX允许几乎所有指令有多个存储器操作数，因此保留每个操作数说明符的前几位以指示该特定操作数的寻址模式。 保持寻址模式指定符位与操作码操作位分离产生正交指令集 。

即使在具有许多寻址模式的计算机上，实际程序的测量表明下面列出的简单寻址模式占所有寻址模式的约90％或更多。 由于大多数此类测量基于编译器从高级语言生成的代码，因此这在某种程度上反映了所使用的编译器的局限性。

对代码的寻址模式
--------

### 绝对寻址/直接寻址

```
   +----+------------------------------+
   |jump|           address            |
   +----+------------------------------+

   (有效PC位址 = address)
```

绝对寻址指令的有效地址是地址参数本身，无需修改。

### PC相对寻址

```
   +----+------------------------------+
   |jump|           offset             |    相对跳转指令
   +----+------------------------------+

   (有效PC位址 = 下一條指令的位址 + offset，offset 可為負數) 
```

PC对寻址的有效地址是下一条指令地址加上偏移参数。 通常对该偏移是有符号数，以允许跳转到指令之前和之后的代码。

这种寻址方式的跳转指令特别有用，因为常见的跳转指令的目标是是附近的指令（在高级语言中，大多数**if**或**while**语句相当短）。 实际程序的测量表明，对于大约90％的条件跳转（大约±128或±512字节），8或10位偏移就足够了。 

PC相对寻址的另一个优点是代码可以是位置无关的 ，即它可以加载到存储器中的任何地方而无需调整任何地址。

这种寻址模式的某些版本可以是有条件的，这些条件例如两个寄存器之间的关系："如果reg1 = reg2跳转"、一个寄存器自身："跳转除非reg1 = 0"或者隐含地状态寄存器中某些位。

### 寄存器间接寻址

```
   +-------+-----+
   |jumpVia| reg |
   +-------+-----+

   (有效PC位址 = 'reg'中的值)
```

对数据的寻址模式
--------

### 寄存器（直接）寻址

```
   +------+-----+-----+-----+
   | mul  | reg1| reg2| reg3|      reg1 := reg2 * reg3;
   +------+-----+-----+-----+
```

这种"寻址模式"没有有效地址，在某些计算机上不被认为是寻址模式。

在此示例中，所有操作数都在寄存器中，结果放在寄存器中。

### 基址加偏移量寻址，及其变种

有时被称为"偏移寻址"

```
   +------+-----+-----+----------------+
   | load | reg | base|     offset     |  reg := RAM[base + offset]
   +------+-----+-----+----------------+

   (有效地址 = offset + base 寄存器的内容) 
```

### 立即数/字面量寻址

```
   +------+-----+-----+----------------+
   | add  | reg1| reg2|    constant    |    reg1 := reg2 + constant;
   +------+-----+-----+----------------+
```

这种"寻址模式"没有有效地址，并且在某些计算机上不被认为是寻址模式。

常量可以是有符号或无符号的。 例如， `move.l #$FEEDABBA, D0`将十六进制值"FEEDABBA"值移动到寄存器D0中。

操作数的值保存在指令本身中，而不是使用内存中的操作数。

### 隐含寻址

隐含寻址模式（在X86汇编语言中也称为隐式寻址模式）未明确指定源和/或目标的有效地址。

操作码隐含源（如果有）或目的地有效地址（或有时两者）。

隐含的寻址在较旧的计算机上很常见（直到20世纪70年代中期）。 这样的计算机通常只有一个寄存器，可以在其中执行算术-累加器。 这种累加器机器几乎在每个指令中都隐含地引用了累加器。 例如，操作

```
a:= b + c;
```

可以使用序列

```
load b; add c; store a;
```

"load"和"add"指令都隐含目的寄存器（累加器）; 每个"store"指令都隐含了源寄存器（累加器）。

后来的计算机通常具有多个通用寄存器，它们可以是算术的源寄存器和/或目的寄存器，因此后来的计算机需要一些其他寻址模式来指定算术的源寄存器和目的寄存器。

參考資料
----


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
处理器技术 |
| --- |
|  |
| 模型 | 

|  |  |
| --- | --- |
| 顺序模型 | 
* 图灵机
	+ 通用
	+ 波斯特-图灵机
	+ 量子
* 传动带机器（英语：）
* 堆疊結構機器
* 有限状态机
	+ 具数据通路（英语：）
	+ 分层（英语：）
	+ 队列（英语：）
* 寄存器机
	+ 计数器
	+ 指针（英语：）
	+ 隨機存取機
	+ 隨機存取儲存程式機

 |
|  |
| 函数式模型 | 
* 递归函数
* Λ演算
* 组合子逻辑
* 細胞自動機

 |

 |
|  |
| 架構 | 
* 微架構
* 冯·诺伊曼结构
* 哈佛架構
	+ 修正哈佛架構（英语：）
* 資料流架構（英语：）
* 传输触发（英语：）
* 元胞（英语：）
* 字节序
* 异构（英语：）
* Fabric（英语：）
* 多元處理
* 認知計算
* 神经形态（英语：）

|  |  |
| --- | --- |
| 内存访问 | 
* 非均匀访存模型(NUMA)
* 均匀访存模型(UMA)
* 载入/存储（英语：）
* 寄存器/存储器（英语：）

 |
|  |
| 缓存层级（英语：） | 
* 缓存层级（英语：）

 |
|  |
| 記憶體階層 | 
* 虚拟内存
* 第二级存储器

 |

 |
|  |
| 指令集架構 | 

|  |  |
| --- | --- |
| 类型 | 
* 复杂指令集(CISC)
* 精简指令集(RISC)
* 专用指令集处理器
* 显式数据图像并行（英语：）(EDGE)
	+ TRIPS（英语：）
* 超長指令集(VLIW)
* 顯式並行指令運算(EPIC)
* 最小指令集（英语：）(MISC)
* 單一指令集(OISC)
* 無指令集（英语：）(NISC)
	+ 零指令集(ZISC)
* 比較（英语：）

 |
|  |
| 指令集 | 
* x86
* ARM
* MIPS
* LoongArch
* PowerPC
* SPARC
* IA-64
* Unicore（英语：）
* MicroBlaze（英语：）
* RISC-V
* LMC（英语：）
* 其他（英语：）

 |

 |
|  |
| 执行 | 

|  |  |
| --- | --- |
|  | 
* 流水线停顿
* 操作数转发（英语：）
* 经典 RISC 流水线（英语：）

 |
|  |
| 危障 | 
* 数据依赖
* 數據危障
* 結構危障
* 控制危障
* 伪共享

 |
|  |
| 乱序执行 | 
* 托马苏洛算法
	+ 保留站
	+ 重排序缓冲区
* 寄存器重命名

 |
|  |
| 推测执行 | 
* 分支預測
	+ 存储相关性预测（英语：）

 |

 |
|  |
|  | 

|  |  |
| --- | --- |
| 并行层次 | 
* 位级并行
	+ 位序列（英语：）
	+ 字
* 指令级并行
* + 标量
	+ 純量
	+ 超純量
* 任務并行
	+ 线程
	+
* 数据并行
	+ 向量
* 記憶體
* 分布式

 |
|  |
| 執行緒 | 
* 多執行緒
* 同时多线程
	+ 超執行緒
* 超執行緒
* 超級線程（英语：）
* 预测多线程（英语：）
* 抢占式
* 协作式

 |
|  |
| 費林分類法 | 
* 單指令流單數據流(SISD)
* 單指令流多數據流(SIMD)
	+ 寄存器内（英语：）
* 单指令多线程（英语：）(SIMT)
* 多指令流單數據流(MISD)
* 多指令流多數據流(MIMD)
	+ 单程序多数据（英语：）

 |

 |
|  |
| 電腦性能 | 
* 晶體管數量
* 每周期指令(IPC)
	+ 每指令周期(CPI)
* 每秒指令(IPS)
* 每秒浮點運算次數(FLOPS)
* 每秒事务处理量 (TPS)
* 效能功耗比(PPW)

 |
|  |
| 類別 | 
* 中央处理器(CPU)
* 圖形處理器(GPU)
	+ 图形处理器通用计算(GPGPU)
* 向量处理器
* 桶状（英语：）
* 串流處理
* 輔助處理器
* 特殊應用積體電路(ASIC)
* 现场可编程逻辑门阵列(FPGA)
* 複雜可程式化邏輯裝置(CPLD)
* 多晶片模組(MCM)
* 封裝體系(SiP)

|  |  |
| --- | --- |
| 按应用 | 
* 微处理器
* 单片机(MCU)
* 移动处理器（英语：）
* 笔记本电脑处理器（英语：）
* 超低电压（英语：）
* 专用指令集处理器(ASIP)

 |
|  |
| 片上系统 | 
* 片上系统(SoC)
* 多处理器片上系统（英语：）(MPSoC)
* 可编程片上系统(PSoC)
* 片上网络（英语：）(NoC)

 |
|  |
| 硬件加速 | 
* 人工智能加速器
* 视觉处理单元(VPU)
* 物理處理器(PPU)
* 數位訊號處理器(DSP)
* 张量处理器(TPU)
* 安全加密協處理器
* 网络处理器
* 基頻處理器

 |

 |
|  |
| 字长 | 
* 
* 4位元
* 8位元
* 12位元
* 
* 16位元
* 24位元（英语：）
* 32位元
* 48位元（英语：）
* 64位元
* 128位元
* 
* 位元分割（英语：）
* 其他
	+

 |
|  |
| 核心数量 | 
* 单核（英语：）
* 多核
* 众核（英语：）
* 异构

 |
|  |
| 組件 | 
* 核心
* 缓存
	+ CPU缓存
	+ 置換機制
	+ 一致性
* 总线
* 
* 定時器訊號
* 先進先出演算法(FIFO)

|  |  |
| --- | --- |
| 功能单元 | 
* 算術邏輯單元(ALU)
* 地址生成单元(AGU)
* 浮點運算器(FPU)
* 內存管理單元(MMU)
	+ 载入-存储单元（英语：）
	+ 轉譯後備緩衝區(TLB)
* 内存控制器(IMC)

 |
|  |
| 邏輯閘 | 
* 组合逻辑电路
* 时序逻辑电路
* Glue（英语：）
* 邏輯閘
	+ 量子閘
	+ 逻辑门阵列（英语：）

 |
|  |
| 寄存器 | 
* 寄存器
* 状态寄存器（英语：）
* 栈寄存器（英语：）
* 寄存器堆
* 記憶體缓冲区
* 程式計數器

 |
|  |
| 总线 | 
* 位址匯流排
* 控制匯流排
* 后端总线

 |
|  |
| 控制单元 | 
* 指令单元（英语：）
* 緩衝器
* 写入缓冲区（英语：）
* 微程序ROM
* 计数器

 |
|  |
| 数据通路 | 
* 数据选择器
* 数据分配器
* 加法器
* 乘法器
	+ CPU倍频器
* 译码器
	+ 地址解码器（英语：）
	+ 加和寻址解码器（英语：）
* 桶式移位器

 |
|  |
| 電路 | 
* 集成电路
	+ 3D
	+ 混合訊號
	+ 電源管理
* 布尔（英语：）
* 数字
* 模拟
* 量子
* 开关

 |

 |
|  |
| 电源管理 | 
* 电源管理单元（英语：）(PMU)
* 高级电源管理
* 高级配置与电源接口(ACPI)
* 
* 动态电压调节
* 时钟门控
* 效能功耗比(PPW)
* 空闲竞争（英语：）

 |
|  |
| 相关内容 | 
* 通用CPU历史（英语：）
* 微处理器年代表（英语：）
* 处理器设计
* 数字电路
* 硬件安全模块
* 半导体制造
* Tick-Tock

 |

 |