这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战。
大家好,我是程栩,一个即将入职鹅厂的校招新人。本系列文章将会以一个演进的视角介绍计算机组成原理,并以一个采取Mips指令集的CPU作为范例。
引子
自从祖师爷冯诺依曼提出了著名的冯诺依曼结构以后,计算机进入了它的飞速发展时期。如果用一句话来形容冯诺依曼结构,那就是程序存储顺序执行。我们可以想象有个机器,每次取出一个指令,然后根据这个指令做完操作,再取出下一条,如此循环往复。是的,计算机的世界就是这么枯燥。
举例来说,如果我们让CPU简化成为一个最简单的加法器,他只能执行一个加法,那么他所面对的可能就是无穷无尽的加法:1+2、2+3、3+4等等。他每次取出一个加法,加完再取出下一个,再继续。
可是,我们似乎有很多的问题没有解决:如何实现累加?而如果视角不局限于加法器,如何实现跳转?如何让指令执行的更快?这些都是我们要考虑的问题,而在考虑和解决问题的过程中,我们会发现,系统设计的过程中,充满了Tradeoff,我们获得了一些东西,总会失去一些东西。
软硬件接口
聪明的你写代码时一定写过如下的代码:
a=a+b;
如果这样的一条指令给我们的加法器来执行,它一定会摸不着头脑:这都是啥啊,怎么不是数字了? 所以其实计算机并不比我们聪明,只是它执行指令的速度比我们快的多得多。聪明的你一定想到了计算机是0和1的世界,它只能识别0和1,其他的对它来说什么都不是。但是对于人来说,直接写0和1是让人痛苦且效率低下的,所以为了提高效率,人们不断地进行着封装,编译原理帮助我们实现了从我们认知的代码到计算机认识的代码的转变。一般情况下我们会理解成如下的变换过程:
那么问题来了,汇编码是如何变换成01码的呢? 我们来看我们前面写的代码,我们假定它会被编译成如下的Fake汇编指令:
add $a,$a,$b //a=a+b
那计算机怎么知道这个汇编是什么样的01码呢?
这里我们需要介绍一下我认为的软硬件接口:指令集(ISA:Instruction Set Architecture)。指令集就像是一个字典,例如在这里他可能会将我们的Fake汇编按照如下的方式做翻译:
add->00
$a->01
$b->10
$a->01
那么我们的Fake汇编就变成了如下的01码:
00011001
计算机给你点了个赞。 可是又给你提出了新的问题:虽然俺可以读懂这是01码,但是这是什么意思呢?应该按照00-01-10-01的方式进行理解还是按照000-110-01的方式进行理解呢?
聪明的你陷入了沉思,于是你选择……
好了,今天的文章就写到这里,明天我们再继续。祝大家新年快乐!
如果觉得写的还可以的话,可以动动小手点个赞,切莫下次一定。