指令顾名思义就是用来引导某一硬件工作的方式的,集即集合的意思,也就是很多种不同引导指令的集合!
指令集是存储于CPU内部,用来引导CPU进行加减运算和控制计算机操作系统的一系列指令集合!
可以这样说指令集是软件与CPU之间的一个接口而CPU就是接口的实列化。
其实指令集就是一组汇编指令的集合,不同的CPU使用的指令集不同。
过去比较常用的是lntel的X86CPU处理器的指令集!
X86指令的发展过程:
X86指令集是Intel公司为第一16位的CPU(i8086)设计的,1981年IBM推出世界上第一款PC电脑时所使用的CPU是Intel公司推出的i8088(i8086的简化版)但由于运算性能很差所以当时并不太受欢迎!
i8088使用的指令集就是X86指令集,虽然现在X86系列的CPU不常用了但是现在很多新的CPU都兼容了过去X86CPU上的指令集,此外Intel公司还研发了一款处理器-x87数学协处理器用来协助x86处理器做浮点数运算,同时也有自己的指令集-x87指令集,后来将x86和87指令集统称x86指令集。
在指令集中有很多编写方式,这里先说一说最常用的CISC和RISC
CISC:
CISC(复杂指令集),指令集较丰富,对特殊任务有专用的特殊指令,执行特殊功能(科学计算之类的)也就是说指令集里面的每个指令较长,每个指令都分成好几个微指令来处理,正是因为指令集丰富所以在开发程序时较简单,但在执行时效率较低,处理数据时速度较慢,使得译码器翻译二进制代码时较慢。
RISC:
RISC(精简指令集计算机)处理器注重的是指令集的优化,RISC的设计者对哪些常用的指令进行优化使它们更加简单高效,对于那些不常用的指令会将其组合起来去实现某些特殊的功能,所以RISC指令集位数较短,所以执行效率高,译码和处理数据较快。
RISC:
RISC指令集较少对存储器操作较简单,同时对存储器的操作也受到限制。
RISC:
RISC指令集较少对存储器操作较简单,同时对存储器的操作也受到限制。
在RISC处理器上写汇编程序需要很大的内存空间,实现特殊功能时较复杂难写,执行特殊功能时效率相对低!执行常用功能时效率相对较高。
中断机制
CISC:
当CPU使用的指令集是CISC编写技术时遇到操作系统的中断机制那么CPU会把正在执行的这条指令里的所有微指令执行完毕才会响应中断。
RISC:
当RISC遇到操作系统的中断机制时可以在指令执行的任意位置停止!
CPU设计周期
CISC:
使用CISC指令集的CPU在设计时因为指令集很多所有需要很多的电路元件(电容,电阻器,电感器,晶体管)对其它芯片进行不同的指令操作时需要不同的电路元件协调工作!所以采用CISC指令集的CPU设计周期较长,面积大,功耗高。
RISC:
RISC指令集少所以包含的的电路元件(电阻,电感器,晶体管)比较少,所以面积也很小,电子器件布局也较紧密,故有所思既然包含的电子器件较少那么功耗和成本也很低!
RISC:
RISC处理器结构简单,指令较简单,做非特殊功能时性能很好,效率也很高,学习起来比较易学。
RISC:
RISC指令集较少但在编写常用功能效率较高,但是对特殊功能需要组合指令来完成效率和可靠性较低所以RISC指令集的处理器适合用在专用机中。
PS:
X86系列CPU所使用的就是CISC(复杂指令集),ARM和IBM生产的PC电脑中的CPU使用的是RISC,到现在我们所使用的PC机中的CPU兼容了CISC和RISC的两种指令集的优点!
其次有些厂商生产的CPU处理器还兼容了一些其他指令集例如SSE指令集!
这里补充一下SSE指令集
SSE指令集也是Intel公司所生产的,SSE指令集的主要作用是为了提高3D图形浮点运算指令(50条),视频运算指令(12条)和优化内存连续块数据指令(8条)总共提供了70条指令集用来处理3D图像,视频/音频处理,内存连续地址传输数据优化。
简而言之SSE指令为多媒体应用处理的效率以及性能提供了很大的帮助!当我们在写处理视频或图像数据时可以调用SSE指令来协助工作,极大提高程序效率!
SSE指令集前身是MMX指令集,MMX指令集运算时会使用x87浮点运算器的寄存器导致x87浮点运算器不能和MMX指令集一同工作,需要互相切换,但在切换时会造成CPU性能下降导致操作系统运行效率降低,为了弥补这一缺点Intel在MMX的基础上扩展出了SSE指令集!解决了原MMX与X87浮点运算器互斥问题,AMD为了支持SSE指令加入了8个XMM寄存器。
如果你的CPU支持SSE指令集或者MMX可以适用房Visual Stuio提供的C++库函数,如果想知道是否支持可以在MASD里面搜索Visual C++ CPUID的列子,可以帮助你查看CPU是否支持SSE,MMX指令集!
CPU执行命令的过程小知识:
CPU首先通过前端总线与北桥芯片进行交互,北桥芯片从内存中取出指令,传输到指令寄存器中,CPU在从指令寄存器里读取出来通过译码器将其二进制数据翻译成对应的状态并执行!
译码器就是将二进制数据翻译成电路的某种状态,比如“101010”CPU不知道这个二进制指令对应的电路是什么状态,但通过译码器翻译后就是高电平低电平!也就是开关。
只读常数(立即数)存储知识:
在编程语言中我们很常见到只读常数和立即数,但是你知道为什么这些只读常数和立即数不能赋值吗?
只读常数在汇编语言中叫立即数,常数是没有自己的独立内存的,常数和指令共用一块内存,常数可以是8,16,32位,常数通常是跟随在操作码的后面,操作明确表示该常数要进行怎样的操作!但是不能进行赋值,因为常数一般存在于指令寄存器中,执行完立马就被丢弃了,在栈中没有自己的独立内存所以是不可赋值的。
每一个指令都会有一个操作码,这个操作码告诉CPU对这段指令进行怎样性质的操作!
这里说一下常数和只读常数的区别,常数是加了CONST修饰符的关键字变量,但在栈中拥有自己的独立内存,只不过CPU将该变量里的数值放到了只读寄存器中,每次读取都从只读寄存器里去读取而不是从栈中读取,这样效率会有所提升因为不需要进行一级缓存等步骤,但是虽说不能修改我们可以通过指针进行修改值,通过指针指向处于栈中的地址修改值然后在更新到寄存器里就可以了。
以上纯博主手打,如果有错别字或者某些地方写的不对的,欢迎提出来!