指令集架構

指令集架構（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