指令集

百度百科

计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效的工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集arrow-up-right精简指令集arrow-up-right两部分。

类 型:x86、MIPS、Sparc、Alpha、ARM

简介

在计算机中,指示计算机硬件执行某种运算、处理功能的命令称为指令。指令是计算机运行的最小的功能单位,而硬件的作用是完成每条指令规定的功能。一台计算机上全部指令的集合,就是这台计算机的指令系统。指令系统也称指令集,是这台计算机全部功能的体现。而人们设计计算机首要考虑的是它拥有的功能,也就是首先要按功能档次设计指令集,然后按指令集的要求在硬件上实现。指令系统不仅仅是指令的集合,还包括全部指令的指令格式、寻址方式和数据形式。所以,各计算机执行的指令系统不仅决定了机器所要求的能力,而且也决定了指令的格式和机器的结构。反过来说,不同结构的机器和不同的指令格式应该具有与之相匹配的指令系统。为此,设计指令系统时,要对指令格式、类型及操作功能给予应有的重视。软件是为了使用计算机而编写的各种系统和用户的程序,程序由一个序列的计算机指令组成。从这个角度上说,指令是用于设计程序的一种计算机语言单位 。

计算机的指令系统是指一台计算机上全部指令的集合,也称计算机的指令集。指令系统包括指令格式、寻址方式和数据形式。一台计算机的指令系统反映了该计算机的全部功能,机器类型不同,其指令系统也不同,因而功能也不同。指令系统的设置和机器的硬件结构密切相关,一台计算机要有较好的性能,必须设计功能齐全、通用性强、内含丰富的指令系统,这就需要复杂的硬件结构来支持 。

常见的指令集有:Intel的x86,EM64T,MMX,SSE,SSE2,SSE3,SSSE3 (Super SSE3),SSE4A,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX等指令集;和AMD的x86,x86-64,3D-Now!指令集。

类型

SSE指令集

由于MMX指令arrow-up-right并没有带来3D游戏性能的显著提升,1999年Intel公司在Pentium IIIarrow-up-rightCPU产品中推出了数据流单指令序列扩展指令(SSE)。SSE兼容MMX指令,它可以通过SIMD(单指令多数据技术)和单时钟周期并行处理多个浮点来有效地提高浮点运算速度。在MMX指令集中,借用了浮点处理器的8个寄存器,这样导致了浮点运算速度降低。而在SSE指令集推出时,Intel公司在Pentium III CPU中增加了8个128位的SSE指令专用寄存器。而且SSE指令寄存器可以全速运行,保证了与浮点运算的并行性。

SSE2指令集

在Pentium 4 CPU中,Intel公司开发了新指令集SSE2。这一次新开发的SSE2指令一共144条,包括浮点SIMD指令、整形SIMD指令、SIMD浮点和整形数据之间转换、数据在MMX寄存器中转换等几大部分。其中重要的改进包括引入新的数据格式,如:128位SIMD整数运算和64位双精度浮点运算等。为了更好地利用高速缓存。另外,在Pentium 4中还新增加了几条缓存指令,允许程序员控制已经缓存过的数据。

SSE3指令集

相对于SSE2,SSE3又新增加了13条新指令,此前它们被统称为pni(prescott new instructions)。13条指令中,一条用于视频解码,两条用于线程同步,其余用于复杂的数学运算、浮点到整数转换和SIMD浮点运算。

SSE4指令集

SSE4又增加了50条新的增加性能的指令,这些指令有助于编译、媒体、字符/文本处理和程序指向加速。SSE4指令集arrow-up-right将作为Intel公司未来“显著视频增强”平台的一部分。该平台的其他视频增强功能还有Clear Video技术(CVT)和统一显示接口(UDI)支持等,其中前者是对ATi AVIVO技术的回应,支持高级解码、后处理和增强型3D功能。

3D Now!扩展指令集

3D Now!指令集是AMD公司1998年开发的多媒体扩展指令集,共有21条指令。针对MMX指令集没有加强浮点处理能力的弱点,重点提高了AMD公司K6系列CPU对3D图形的处理能力。由于指令有限,3D Now!指令集主要用于3D游戏,而对其他商业图形应用处理支持不足。3DNow!+指令集:在原有的指令集基础上,增加到52条指令,其中包含了部分SSE指令arrow-up-right,该指令集主要用于新型的AMDarrow-up-rightCPU上。

X86指令集

要知道什么是指令集,要从X86架构arrow-up-right的CPU说起。X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,IBM1981年推出的世界第一台PC机中的CPU—i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器arrow-up-right则另外使用X87指令,arrow-up-right以后就将X86指令集和X87指令集统称为X86指令集。虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486,但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。由于Intel X86系列及其兼容CPU都使用X86指令集,所以就形成了庞大的X86系列及兼容CPU阵容。

EM64T指令集

Intel公司的EM64T(Extended Memory 64 Technology)即64位内存扩展技术。该技术为服务器和工作站平台应用提供扩充的内存寻址能力,拥有更多的内存地址空间,可带来更大的应用灵活性,特别有利于提升音频视频编辑、CAD设计等复杂工程软件及游戏软件的应用。常说的64位指的是AMD公司出的64位CPU,而EM64T则是Intel公司按照自己的意思理解出来的64位,也就是和AMD公司的64位对应的另一种叫法。

RISC指令集

RISC指令集arrow-up-right是以后高性能CPUarrow-up-right的发展方向。它与传统的CISC(复杂指令集arrow-up-right)相对。相比而言,RISC的指令格式统一,种类比较少,寻址方式也比复杂指令集少。使用RISC指令集arrow-up-right的体系结构主要有ARM、MIPSarrow-up-right。MIPS 指令集是最早实现商用的精简指令集arrow-up-right(RISC)之一,上个世纪80年代初由斯坦福大学的研究小组研发,并在1984年成立MIPS计算机公司 [3] 。随后MIPS 成为上世纪90年代最流行的指令集,一度与 x86 和ARM 指令集齐名。RISC具有设计更简单、设计周期更短等优点,并可以应用更多先进的技术,开发更快的下一代处理器。MIPS是出现最早的商业RISC架构芯片之一,新的架构集成了所有原来MIPS指令集,并增加了许多更强大的功能。随着移动互联网的兴起,MIPS 指令集逐渐衰落,公司也多次辗转被收购。

AVX指令集

Intel AVX指令集在SIMD计算性能增强的同时也沿用了的MMX/SSE指令集。不过MMX/SSE的不同点在于增强的AVX指令,从指令的格式上就发生了很大的变化。x86 (IA-32/Intel 64)架构的基础上增加了prefix (Prefix),所以实现了新的命令,也使更加复杂的指令得以实现,从而提升了x86 CPU的性能。AVX并不是x86 CPU的扩展指令集,可以实现更高的效率,同时和CPU硬件兼容性也好,并且也有着足够的扩展空间,这都和其全新的命令格式系统有关。更加流畅的架构就是AVX发展的方向,换言之,就是摆脱传统x86的不足,在SSE指令的基础上AVX也使SSE指令接口更加易用。针对AVX的最新的命令编码系统,Intel也给出了更加详细的介绍,其中包括了大幅度扩充指令集的可能性。比如Sandy Bridge所带来的融合了乘法的双指令支持。从而可以更加容易地实现512bits和1024bits的扩展。而在2008年末到2009年推出的meniikoa CPU“Larrabee (LARAB)”处理器,就会采用AVX指令集。从地位上来看AVX也开始了Intel处理器指令集的新篇章。

维基百科:

指令集架构(英语:Instruction Set Architecture,缩写为ISA),又称指令集指令集体系,是计算机体系结构arrow-up-right中与程序设计arrow-up-right有关的部分,包含了基本数据类型arrow-up-right,指令集,寄存器arrow-up-right寻址模式arrow-up-right存储体系arrow-up-right中断arrow-up-right异常处理arrow-up-right以及外部I/Oarrow-up-right。指令集架构包含一系列的opcodearrow-up-right即操作码(机器语言arrow-up-right),以及由特定处理器执行的基本命令。

不同的处理器“家族”——例如Intelarrow-up-right IA-32arrow-up-rightx86-64arrow-up-rightIBMarrow-up-right/Freescale Power和ARMarrow-up-right处理器家族——有不同的指令集架构。[1]arrow-up-right

指令集体系与微架构arrow-up-right(一套用于执行指令集的微处理器设计方法)不同。使用不同微架构的电脑可以共享一种指令集。例如,Intelarrow-up-rightPentiumarrow-up-rightAMDarrow-up-rightAMD Athlonarrow-up-right,两者几乎采用相同版本的x86arrow-up-right指令集体系,但是两者在内部设计上有本质的区别。

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

指令集分类

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

机器语言

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

复杂的操作可以借由将简单的指令合并而达成,可以(在冯·诺依曼体系arrow-up-right中)连续的运行,也可以藉控制流arrow-up-right来运行指令。

指令类型

有效的指令操作须包含:

复杂指令

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

有一种复杂指令单指令流多资料流arrow-up-right,英文全名是Single-Instruction Stream Multiple-Data Stream。或是向量指令arrow-up-right,这是一种可以在同一时间对多笔资料进行相同运算的操作。SIMD有能力在短时间内将大笔的向量和矩阵计算完成。SIMD指令使并行计算arrow-up-right变得简单,各种SIMD指令集被开发出来,例如MMXarrow-up-right3DNow!arrow-up-right以及AltiVecarrow-up-right

指令的组成

arrow-up-right一条指令往往有好几个区块,这些区块包含要做的运算(加或减),可能还包含资料的原始或是目的地位置,以及常量。图中的MIPS“Add Immediate”指令允许用户选择哪个寄存器是数据源以及哪一个寄存器是要存运算后的结果,还有一个常量

在传统的架构上,一条指令包含op codearrow-up-right,表示运算的方式,以及零个或是更多的操作数arrow-up-right,有些像是操作数的数字可能指的是寄存器arrow-up-right的编号,还有存储器位置,或是文字资料。

超长指令字arrow-up-right(VLIW)的结构中,包含了许多微指令arrow-up-right,借此将复杂的指令分解为简单的指令。

指令的长度

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

设计

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

一些指令集保留了一个或多个的opcode,以运行系统调用arrow-up-right软件中断arrow-up-right

指令集的实现

在设计处理器内的微架构arrow-up-right时,工程师使用藉电路连接的区块来架构,区块用来表示加法器,乘法器,计数器,寄存器,算术逻辑单元等等,寄存器传递语言arrow-up-right通常被用来描述被解码的指令,指令是借由微架构来运行指令。 有两种基本的方法来建构控制单元arrow-up-right,藉控制单元,以微架构作为通路来运行指令:

  1. 早期的电脑和采用精简指令集的电脑藉将电路接线(像是微架构剩下的部分)。

  2. 其他的设备使用微程序arrow-up-right来达成—像是晶体管ROM或PLA(即使RAM已使用很久)。

电脑微处理器arrow-up-right指令集架构(Instruction Set Architecture)常见的有三种:

目前x86arrow-up-right架构微处理器如Intelarrow-up-rightPentiumarrow-up-right/Celeronarrow-up-right/Xeonarrow-up-rightAMDarrow-up-rightAthlonarrow-up-right/Duronarrow-up-right/Sempronarrow-up-right;以及其64位扩展系统的x86-64arrow-up-right架构的Intel 64的Intel Corearrow-up-right/Core 2arrow-up-right/Celeronarrow-up-right/Pentiumarrow-up-right/Xeonarrow-up-right与AMD64的Phenom IIarrow-up-right/Phenomarrow-up-right/Athlon 64arrow-up-right/Athlon IIarrow-up-right/Opteronarrow-up-right/AMD APUarrow-up-right/Ryzenarrow-up-right/EPYCarrow-up-right都属于复杂指令集。主要针对的操作系统是微软arrow-up-rightWindowsarrow-up-right苹果公司arrow-up-rightmacOSarrow-up-right。另外Linuxarrow-up-right,一些UNIX等,都可以运行在x86(复杂指令集)架构的微处理器。

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

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

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

Last updated