指令集架构

指令集架构(英语: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. 

延伸阅读

外部链接

参见