通过上一篇 认识CPU 分析到,计算机使用的是二进制编码格式,并使用 01 组合表示来操作计算机来进行运算。
这时CPU就出来规定 哪些01 组合是数学符号,哪些01 是数据。
CPU将 + 号,使用规定好的 01 组合来表示,1 转化为二进制。
如果我们去编码,只需要对着开发手册,敲01即可。
我们将二进制 0 和 1 这样多种多样的组合称为指令。
而CPU在执行一条指令时,需要经历如下步骤:
1CPU控制单元去主存中获取指令
2识别指令并 (将指令 01 的串进行拆分为 操作码和操作数 )所以指令 = 操作码 + 操作数
3运算器去执行指令
4将计算完成的数据进行写回
现在我们就可以使用 二进制编码来完成开发任务,但是二进制编码这样的代码风格根本不符合人类的习惯,将一堆01组合成文件,根本看不懂,而指令越来越多,01组合越来越长,如果写错一位二进制,对比起来成本非常巨大。而这样的编码十分的劝退程序员。需要一个一个的对表,查找指令的含义和01组合是否匹配。
基于这样的问题,我们来继续思考。
现在的问题是由于 01 组合过于复杂,编码时对开发人员不够友好,代码可读性太差,排错成本大,维护成本高。
这时候可读性太差,这样映射关系查找交给计算机去处理。而人只需要去写简单的指令就行。
我们再建一张映射表来表示操作码
比如:mov 0101001010101 add 01010101001
开发工程师只需要写 (mov 操作数,指定寄存器)即可,这样的风格就解决了代码可读性的问题。
这样汇编语言就孕育而生了。而汇编语言就是二进制编码的抽象。
但是这样的话,就额外增加了CPU的处理逻辑,原先CPU直接读取的二进制。现在汇编代码的产生,而计算机只能识别二进制的数据,就存在汇编语言转化为二进制的处理过程。
这部分工作就放在CPU上。CPU说,
1我是只处理简单的指令一条一条的,汇编指令交给工程师随意组合?
2还是将多个指令打包成一组指令,上层工程师只需要写一条命令就可完成复杂操作呢?
由于这两个问题,我们引入两个老大哥:
指令集:ISC
精简指令集:RISC
复杂指令集:CISC
显而易见针对这两个问题,即可分辨出两套指令集使用了哪一种方案。
而精简指令集和复杂指令集哪一个更好呢?
经过市场的鉴定,复杂指令集被疯狂吐槽,一方面,复杂指令集的特点是将多个指令糅合成一个指令。如果CPU的人员在在复杂指令集的基础上新增了一条指令集,这条指令进行版本升级,而上层的开发人员也需要对该指令进行升级,CPU的人员在不断的升级CPU的性能,从而迭代出更多的指令,而上层的开发人员在面临如此繁多的指令就感到不满,明明是一个微小的升级,就让我去不断的改代码,写汇编器的开发人员,选择了不用这条指令,而CPU的开发人员,说既然你都不用,我为什么还要继续研究,新开发的特性上层根本就不用,陷入了僵局。
所以诞生的精简指令集,上层的开发人员就舒服了,我一条指令随意组合,更加的灵活。但是编写代码时就代码就变多了。
这两套指令集各有优缺点,我们学习是还是选择 复杂指令集 较为合适,因为在阅读汇编代码是比较容易。
每种CPU选择了上述两种方案其中一种,或者两种相结合的方式,对于汇编语言进行了支持。
所以学习汇编语言一定要注意平台,例如 Intel 和 AMD 等。在此我们选择 Intel