指令集

**指令集架構**（英語：Instruction Set Architecture，縮寫為 ISA），又稱**指令集**或**指令集體系**，是電腦架構中與程式設計有關的部分，包含了基本資料類型，指令集，暫存器，定址模式，儲存體系，中斷，異常處理以及外部 I/O。指令集架構包含一系列的 opcode 即操作碼（機器語言），以及由特定處理器執行的基本命令。

不同的處理器「家族」—— 例如 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。

### 指令的組成

在傳統的架構上，一條指令包含 op code，表示運算的方式，以及零個或是更多的運算元，有些像是運算元的數字可能指的是暫存器的編號，還有記憶體位置，或是文字資料。

在超長指令字（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，以執行系統調用或軟體中斷。

## 指令集的實作

在設計處理器內的微架構時，工程師使用藉電路連接的區塊來架構，區塊用來表示加法器，乘法器，計數器，暫存器，算術邏輯單元等等，暫存器傳遞語言通常被用來描述被解碼的指令，指令是藉由微架構來執行指令。
有兩種基本的方法來建構控制單元，藉控制單元，以微架構作為通路來執行指令：

1. 早期的電腦和採用精簡指令集的電腦藉將電路接線（像是微架構剩下的部分）。
2. 其他的裝置使用微程式來達成 — 像是電晶體 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 （頁面存檔備份，存於網際網路檔案館）

## 參見

* 微架構
* 電腦系統結構