指令集架构

指令集架构（Instruction Set Architecture，缩写为ISA），又称指令集或指令集体系，是一种概念模型，它定义了指令、资料型别、寄存器、寻址模式、内存阶层、中断、异常处理以及外部I/O。能够让指令集架构所描述的指令落地运行的CPU就是该ISA的实现。指令集架构也被视为CPU的接口。

不同的处理器“家族”——例如Intel IA-32和x86-64、IBM/Freescale Power和ARM处理器家族——有不同的指令集架构。

指令集体系与微架构（一套用于执行指令集的微处理器的设计方法）不同。使用不同微架构的电脑可以共享一种指令集。例如，Intel的Pentium和AMD的AMD Athlon，两者几乎采用相同版本的x86指令集体系，但是两者在内部设计上有本质的区别。

一些虚拟机器支持基于Smalltalk，Java虚拟机，微软的公共语言运行时虚拟机所生成的字节码，他们的指令集体系将bytecode（字节码）从作为一般手段的代码路径翻译成本地的机器语言，并通过解译执行并不常用的代码路径，全美达以相同的方式开发了基于x86指令体系的VLIW处理器。

## 指令集的分类

复杂指令集计算机包含许多应用程序中很少使用的特定指令，由此产生的缺陷是指令长度不固定。精简指令集计算机通过只执行在程序中经常使用的指令来简化处理器的结构，而特殊操作则以子程序的方式实现，它们的特殊使用通过处理器额外的执行时间来弥补。理论上的重要类型还包括最小指令集计算机与单指令集计算机，但都未用作商业处理器。另外一种衍生类型是超长指令字，处理器接受许多经过编码的指令并通过检索提取出一个指令字并执行。

## 机器语言

机器语言是由声明和指令所组成的。在处理结构上，一个特定指令指明了以下几个部分：

- 用于算术运算，寻址或者控制功能的特定寄存器。
- 特定存储空间的地址或偏移量。
- 用于解译操作数的特定寻址模式。

复杂的操作可以借由将简单的指令合并而达成，可以（在冯·诺依曼体系中）连续的执行，也可以藉控制流来执行指令。

### 指令类型

有效的指令操作须包含：

- 数据处理与存储操作
- 将暂存器的值（在中央处理器作为高速缓存的存储空间）设为固定值。
- 将数据从存储空间中传送至寄存器，反之亦然。用于将数据取出并执行计算，或者将计算结果予以保存。
- 从硬件设备读取或写入数据。
- 算术逻辑单元
- 对两个储存于暂存器的数字进行add，subtract，multiply，divide,将结果放到一个暂存器内，一个或是更多的状态码可能被设置在状态暂存器中。
- 执行位操作，藉对两组数字（为两串的数字，都由零与一构成，分别储存于两个暂存器内）执行逻辑与和逻辑或，或者对寄存器的每一位执行逻辑非操作。
- 比较两个寄存器中的数据（例如是大于或者相等）。
- 控制流
- 分支，跳跃至程序某地址并执行相应指令。
- 条件分支，假设某一条件成立，就跳到程序的另一个位置。
- 间接分支，在跳到另一个位置之前，将现在所执行的指令的下一个指令的位置储存起来，作为子程式执行完返回的地址。

### 复杂指令

一些电脑在他们的指令集架构内包含复杂指令。复杂指令包含：

- 将许多暂存器存成堆叠的形式。
- 移动内存内大笔的资料。
- 复杂或是浮点数运算（正弦，余弦，平方根等等）
- 执行test-and-set指令。
- 执行数字存在内存而非暂存器的运算

有一种复杂指令单指令流多资料流（SIMD），或向量指令，这是一种可以在同一时间对多笔资料进行相同运算的操作。SIMD有能力在短时间内将大笔的向量和矩阵计算完成。SIMD指令使平行计算变得简单，各种SIMD指令集被开发出来，例如MMX、3DNow!以及AltiVec。

### 指令的组成

<image>

在传统的架构上，一条指令包含opcode，表示运算的方式，以及零个或是更多的算子，有些像是算子的数字可能指的是暂存器的编号，还有内存位置，或是文字资料。

在超长指令字（VLIW）的结构中，包含了许多微指令，借此将复杂的指令分解为简单的指令。

### 指令的长度

指令长度的范围可以说是相当广泛，从微控制器的4 bit，到VLIW系统的数百bit。在个人电脑，大型电脑，超级电脑内的处理器，其内部的指令长度介于8到64 bits（在x86处理器结构内，最长的指令长达15 bytes，等于120 bits）。在一个指令集架构内，不同的指令可能会有不同长度。在一些结构，特别是大部分的精简指令集（RISC），指令是固定的长度，长度对应到结构内一个字的大小。在其他结构，长度则是byte的整数倍或是一个halfword。

### 设计

对微处理器而言有两种指令集。第一种是复杂指令集（Complex Instruction Set Computer），拥有许多不同的指令。在1970年代，许多机构，像是IBM，发现有许多指令是不需要的。结果就产生了精简指令集（Reduced Instruction Set Computer），它所包含的指令就比较少。精简的指令集可以提供比较高的速度，使处理器的尺寸缩小，以及较少的电力损耗。然而，比较复杂的指令集较容易使工作更完善，内存及缓存的效率较高，以及较为简单的程式码。

一些指令集保留了一个或多个的opcode，以执行系统调用或软件中断。

## 指令集的实作

在设计处理器内的微架构时，工程师使用藉电路连接的区块来架构，区块用来表示加法器，乘法器，计数器，暂存器，算术逻辑单元等等，暂存器传递语言通常被用来描述被解码的指令，指令是借由微架构来执行指令。

有两种基本的方法来建构控制单元，藉控制单元，以微架构作为通路来执行指令：

- 早期的电脑和采用精简指令集的电脑藉将电路接线（像是微架构剩下的部分）。
- 其他的装置使用微程序来达成—像是晶体管ROM或PLA（即使RAM已使用很久）。

电脑微处理器的指令集架构（Instruction Set Architecture）常见的有三种：

- 复杂指令集运算（Complex Instruction Set Computing，CISC）

目前x86架构微处理器如Intel的Pentium/Celeron/Xeon与AMD的Athlon/Duron/Sempron；以及其64位扩展系统的x86-64架构的Intel 64的Intel Core/Core 2/Celeron/Pentium/Xeon与AMD64的Phenom II/Phenom/Athlon 64/Athlon II/Opteron/AMD APU/Ryzen/EPYC都属于复杂指令集。主要针对的操作系统是微软的Windows和苹果公司的macOS。另外Linux，一些UNIX等，都可以运行在x86（复杂指令集）架构的微处理器。

- 精简指令集运算（Reduced Instruction Set Computing，RISC）

这种指令集运算包括惠普的PA-RISC，国际商业机器的PowerPC，康柏（后被惠普收购）的Alpha，美普思科技公司的MIPS，SUN公司的SPARC，ARM公司的ARM架构等。目前有UNIX、Linux以及包括iOS、Android、Windows Phone等在内的大多数移动操作系统运行在精简指令集的处理器上。

- 显式并行指令运算（Explicitly Parallel Instruction Computing，EPIC）

显式并行指令运算乃先进的全新指令集运算，只有Intel的IA-64架构的纯64位微处理器的Itanium/Itanium 2。EPIC指令集运算的IA-64架构主要针对的操作系统是微软64位安腾版的Windows XP以及64位安腾版的Windows Server 2003。另外一些64位的Linux，一些64位的UNIX也可以运行IA-64（显式并行指令运算）架构。

- 超长指令字指令集运算（VLIW）

通过将多条指令放入一个指令字，有效的提高了CPU各个计算功能部件的利用效率，提高了程序的性能

## 外部链接

- Programming Textfiles: Bowen's Instruction Summary Cards
- Mark Smotherman's Historical Computer Designs Page