指令集就是软硬件交互的桥梁。编译器将软件编译成二进制机器码存入Memory中,硬件要做的就是识别指令,完成指令的电路设计。指令有规定的格式标准,寄存器也各司其职,不同的指令会用到不同的寄存器,当然有些寄存器是重复利用的。
一、精简指令集与复杂指令集
经典的复杂指令集CISC的经典代表是x86,精简指令集RISC的代表有ARM,MIPS,RISC_V,SPARC。现在主流的就是ARM,X86,RISC_V。
CISC有30-40条指令,CISC有100-200条,有些指令是用户定义的,所以指令条数是一个范围,毕竟有些指令用不到,我们就少一些硬件实现,降低功耗,降低成本。属于是共性与个性并存了。每一条指令,CISC需要用到多周期。RISC单周期即可实现。RISC有着同样的指令格式,编译器一颗完成解码,CISC不同的指令类型有着不同的指令格式,解码起来更费力,所以解码还需CPU参与。CISC的指令执行也是有并行的,中间嵌套这使用精简指令集。RISC的寄存器以及Memorry读取都会更为简洁。
51单片机使用表广泛,也比较耐打,8051最初的版本追溯到上20世纪80年代,现在的基本上是增强型8051处理器,指令集还是40年前的,但是内部实现已经在原型的基础上进行了RISC改造(intel的x86处理器也干过这种改造)。但是由于指令集本身的缺陷,在进行改造的时候,相比于RISC,必不可少的需要额外的逻辑资源。这就意味着更大的面积,更大的能耗,对于电源要求高。这就不适合移动设备了,这也是IIntel的x86始终无法在移动设备市场上打开局面的原因之一。
二、指令集微架构
微处理架构是的是处理器的内部组织结构,包括流水线设计,带宽,地址字节单元,cache的组织结构等等,左侧是MIPS的R1w微架构可以在一个周期实现四条指令,右侧架构只能实现一条指令,这也是架构的一种属性(IPC)。
1. 冯·诺依曼
冯诺依曼架构:ALU是算术单元,Control unit执行指令与中断,PC指向下一条所需要执行指令的地址,Memory存储指令与数据,I/O则是输入输出接口,将指令与数据输入至存储器,计算后将结果输出到外部。冯诺依曼架构是以运算器为中心的,现代大多数的处理器是以存储器为核心;
2. 哈佛:
哈佛结构图,与冯的区别是将存储器分成指令存储器和数据存储器,可以实现数据与指令的同时访问,而冯的只有一个通道,通知时间只能访问数据或者指令。所以哈佛结构需要引进新的机制,每条指令要对应好数据。 冯诺依曼与哈佛的比较:计算机组成原理
流水线设计实例:
这里是设计五级流水线,分为指令抓取,指令译码,执行指令,存储器访问,回写。这里看出要实现流水线并行就必须能同时访问指令和数据。并行执行两条指令只需要六个周期即可完成。频率上限取决于这五个部分执行最慢的部分,上图中IF执行所需要的时延最长,译码部分的逻辑最为简单,延迟比较低,灰色区域就是多余的时间。
三、程序执行过程:
先经过预编译进行宏展开,去注释等操作,通过Compiler编译成汇编程序,生成*.s文件,在经过汇编器,转成*.o二进制文件,接着进行映射Linker,load到存储单元。编译器是按顺序编译,一段一段的。
上图是i现代计算机的基本结构,我们编译出的可执行程序从disk从高速IO送到Memory中,CPU直接访问Memory进行操作。另外IO下还挂在了一些低速设备。