指令集架構

指令集架構(英語:Instruction Set Architecture,縮寫為ISA),又稱指令集指令集体系,是计算机体系结构中與程序設計有關的部分,包含了基本数据类型,指令集,寄存器寻址模式存储体系中斷異常處理以及外部I/O。指令集架構包含一系列的opcode即操作码(機器語言),以及由特定處理器执行的基本命令。

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

指令集体系与微架构(一套用于执行指令集的微处理器设计方法)不同。使用不同微架構的電腦可以共享一种指令集。例如,IntelPentiumAMDAMD Athlon,兩者几乎採用相同版本的x86指令集体系,但是兩者在内部设计上有本质的区别。

一些虛擬機器支持基于SmalltalkJava虛擬機,微軟的公共語言运行时虛擬機所生成的字节码,他們的指令集体系將bytecode(字节码)从作为一般手段的代码路径翻譯成本地的機器語言,并通过解译执行并不常用的代码路径,全美達以相同的方式开发了基于x86指令体系的VLIW處理器。

指令集的分类

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

機器語言

機器語言是由声明指令所組成的。在处理结构上,一個特定指令指明了以下几个部分:

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

複雜的操作可以藉由將簡單的指令合併而達成,可以(在冯·诺依曼体系中)連續的執行,也可以藉控制流來執行指令。

指令类型

有效的指令操作須包含:

  • 数据處理與存储操作
    • 暫存器的值(在中央處理器作为高速缓存的存储空间)設為固定值;
    • 將数据从存储空间中传送至寄存器,反之亦然。用于将数据取出并执行计算,或者将计算结果予以保存;
    • 從硬體设备读取或寫入数据。
  • 算术逻辑单元
    • 對兩個儲存於暫存器的數字進行addsubtractmultiplydivide,將結果放到一個暫存器內,一個或是更多的状态码可能被設置在狀態暫存器英语Status register中;
    • 执行位操作,藉對兩組數字(為兩串的數字,都由零與一構成,分別儲存於兩個暫存器內)執行邏輯與邏輯或,或者对寄存器的每一位執行邏輯非操作;
    • 比較兩个寄存器中的数据(例如是大于或者相等);
  • 控制流
    • 分支,跳跃至程序某地址并执行相应指令;
    • 条件分支,假設某一條件成立,就跳到程序的另一個位置;
    • 間接分支,在跳到另一個位置之前,將現在所執行的指令的下一個指令的位置儲存起來,作為子程式執行完返回的地址;

複雜指令

一些電腦在他們的指令集架構內包含複雜指令。複雜指令包含:

  • 將許多暫存器存成堆疊的形式。
  • 移動記憶體內大筆的資料。
  • 複雜或是浮點數運算(正弦餘弦平方根等等)
  • 執行test-and-set指令。
  • 執行數字存在記憶體而非暫存器的運算

有一種複雜指令單指令流多資料流SIMD),或向量指令,這是一種可以在同一時間對多筆資料進行相同運算的操作。SIMD有能力在短時間內將大筆的向量和矩陣計算完成。SIMD指令使平行計算變得簡單,各種SIMD指令集被開發出來,例如MMX3DNow!以及AltiVec

指令的組成

 
一條指令往往有好幾個區塊,這些區塊包含要做的運算(加或減),可能還包含資料的原始或是目的地位置,以及常數。圖中的MIPS「Add Immediate」指令允許使用者選擇哪個暫存器是資料來源以及哪一個暫存器是要存運算後的結果,還有一個常數

在傳統的架構上,一條指令包含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)常见的有三种:

目前x86架构微处理器如IntelPentium/Celeron/XeonAMDAthlon/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(复杂指令集)架构的微处理器。
这种指令集运算包括惠普的PA-RISC,国际商业机器PowerPC康柏(後被惠普收购)的Alpha,美普思科技公司的MIPS,SUN公司的SPARC,ARM公司的ARM架構等。目前有UNIX、Linux以及包括iOS、Android、Windows Phone等在内的大多数移动操作系统运行在精简指令集的处理器上。
顯式並行指令運算乃先进的全新指令集运算,只有Intel的IA-64架构的纯64位微处理器的Itanium/Itanium 2。EPIC指令集运算的IA-64架构主要针对的操作系统是微软64位安腾版的Windows XP以及64位安腾版的Windows Server 2003。另外一些64位的Linux,一些64位的UNIX也可以运行IA-64(顯式並行指令運算)架构。
通過將多條指令放入一個指令字,有效的提高了CPU各個計算功能部件的利用效率,提高了程序的性能

參考文獻

  1. ^ Randal E. Bryant; David R. O'Hallaron. Computer Systems A Programmer's Perspective Third. Pearson Education. 2016: 352. 

延伸閱讀

外部連結

參見