这两天了解了一下处理器比较底层的知识,发现处理器指令集架构(Instruction Set Architectures)是个挺有意思的存在。于是就简单记录一下学习心得。
目前市面上存在两种指令集架构类型:Reduced Instruction Set Computing (RISC) 精简指令集,比如ARM,MIPS等
Complex Instruction Set Computing (CISC) 复杂指令集,比如Intel的X86等
简单说,一个就是只规定非常简单的2进制处理器指令,复杂的指令也只能是最基本的指令的叠加组合。二复杂指令集代表着本身就有一个很庞大的指令集库,一些复杂的指令已经在指令集库里,只需要调用即可。
当然,目前最火的当属基于RISC开发的ARM架构,在移动通信时代,凭借着低功耗打遍天下无敌手。手机,平板,自动驾驶等等等等,一招鲜吃遍天。而且RISC的构架也是ARM低功耗原因之一。RISC的CPU包含有较少的单元电路,因而面积小、功耗低;而CISC的CPU包含有丰富的电路单元,因而功能强、面积大、功耗大。
X86,依靠强有力的Intel,强势控制产业链,获取价值链上最丰厚的那部分利润.
ARM, 靠IP授权的商业模式,且技术上走与Intel差异化路线,加上一些些运气(踏对了手机这条路,谢谢TI-Nokia,Apple,Samsung for big.Little)走小而美的路线,但是凭借已经形成巨大的生态系统,占据优势.
MIPS,很学术很精美很帅,但是对指令集控制松散,导致生态系统分裂,没有形成合力,最终被市场抛弃。
下面就看一下最学术最精美的MIPS的指令集是个什么样子吧。首先了解一下CPU的工作原理,如下图:简单例子,如何用指令集控制CPU完成2+5=7的运算
CPU里自带几个寄存器(32位或64位),三条总线连接内存(RAM).每一次执行指令,都包含了控制信息,地址信息,以及数据信息。而所有指令的集合就是CPU的指令集。如上图所示,左下角就是指令集,他有LOAD和STORE指令,也有数学运算指令。可以通过他们,来控制CPU和内存进行交流,比如: 从内存读取数据,CPU内部数学运算,然后存贮数据到内存。
对于32位MIPS指令集,共三种形式:R型 I型 J型
先说J型,就是让CPU调到一个地址,然后从这个地址开始执行指令:J型指令对应的二进制机器码
接下来是I型指令,它可以将一个任意数(立即数 immediate value)加上寄存器里的数字,然后把结果存储到另外一个寄存器里面:I型指令对应的二进制机器码
最后是R型指令,它用连续三个5位二进制码来表示三个寄存器的地址,然后用一个5位二进制码来表示移位的位数(如果未使用移位操作,则全为0),最后为6位的function码(它与opcode码共同决定R型指令的具体操作方式);
R型指令对应的二进制机器码
以上就是MIPS指令集的小笔记,基本上能有个初步的了解。当然,用01010101这种二进制代码写程序,可能会死人,毕竟难记还容易出错。所以大家用汇编程序来标记这些晦涩的2进制机器指令集代码,比如下面这个例子: 把数字5加上2号寄存器里面的数字,然后把结果存储到6号寄存器里。汇编小例子: 把数字5加上2号寄存器里面的数字,然后把结果存储到6号寄存器里。
当然人类又发明了更高级的计算机语言,比如C,C++甚至java, python, matlab等等等等, 其实只是需要用编译器把高级语言最终编译成这些010101组成的指令集指令而已,当然在编译过程中,有很多可以优化的地方。这也是为什么高级语言执行速度比较慢,而越低级的语言执行效率越快,因为越低级的语言越接近真实的机器代码。比如下面这个例子: 用c写的代码,被编译成了机器指令:C代码相应的部分汇编代码
而最后,每条汇编代码,都对应着唯一的一个32位(或者64位)二进制指令。依次顺序执行,然后就可以得到程序结果,是不是很神奇?
当然以上只是很宏观的角度分析了CPU指令集的概念,要想跟深入,恐怕要花更多的时间去学习每一个细节了。