ZKX's LAB

小速学编程:CPU的结构、指令与程序初探

2020-10-28新闻15

陈小速:一名职业技术学院计算机技术与应用专业的学生,他梦想成为一名程序员。

吴进:一所重点大学软件工程专业大三学生,编程经验丰富。

阅读本文之前,可以先温习一下历史文章:小速学编程:计算机系统的组成 引言

陈小速如约来找吴进了,一见面他就嚷道:“吴大哥,我回去以后就给同学们讲解计算机的系统组成原理了。没想到,同学们问了我很多细节问题,一下子还回答不上来。不过我想既然原理都明白了,那找答案也快吧。果然,我一边教一边找答案,我自己都觉得比以前更明白了。”

“那就好,” 吴进温和地笑着,“我想你也会有新的问题吧?”

“是的,” 陈小速腆着脸笑了起来,“所以这就又过来找吴大哥了。”

“我能理解,学习到一个阶段之后,自然会有新的问题出来,这样才能一直进步嘛。今天我先问你一个问题,你知道CPU是怎么工作的吗?” 吴进说着望向了陈小速。

陈小速默思了一会儿,说:“我看了一些书上的内容,CPU执行运算是通过接收指令的,对吧?然后这个指令,我理解它就像是一个命令一样,让CPU干啥就干啥,是这意思吗?”

“原理没错,” 吴进仍然表示了肯定,“但这样描述的话,模糊的地方太多了。我们应该追问的更深入一些,这样才不会停留在似懂非懂的状态。这也是我学习时的一个习惯,如果我对一个东西好奇,就一定会把它弄透。”

“向吴大哥学习。” 陈小速真心诚意地说。

“好了,我们先从第一个问题开始。CPU的结构是怎样的?”吴进开始了讲解。

CPU的结构

现代计算机的理论基础是冯·诺依曼提出的“存储程序”思想。其实这是一个很简单的概念,就是说处理器要从存储设备中读取指令代码并执行。

说起来好像废话一样,但在谁也不知道该怎么设计计算机的时候,提出了开创性的思想就是相当了不起的成就。

有了“存储程序”的概念,CPU应该包括的功能也就能确定了。首先要能运算,这在CPU内被称为算术逻辑单元ALU(Arithmetic Logic Unit)。

有了ALU,接下来就要从存储中读取数据了。待运算的数据会放在寄存器内,而待执行的指令则会放在L1,L2,L3 cache三级高速缓存中。

有了存储,就需要一个控制器,决定何时从存储中读取指令,并交给ALU进行计算了。这样,一个CPU的基本结构就出来了,它包括ALU、寄存器与高速缓存,还有控制器。

这是核心部件,但数据要送进来,计算完了结果还输出去,那就还需要I/O模块,通过总线完成数据的输入输出操作。

指令

看到上面这张图,陈小速点了点头,说:“吴大哥,我明白了。实际的CPU肯定比这个要复杂得多,但这个原理我是完全理解了。”

吴进赞许地拍了拍陈小速的肩膀,说:“那再问你一个问题,什么是CPU能执行的指令?”

陈小速茫然地摇了摇了头,说:“我只知道它就像命令一样,具体是什么样的我还真不知道。”

吴进又开始对指令进行讲解。

一条指令是CPU能执行的最小功能单元,而单个指令的功能也是很单一的。例如加法指令,就是将两个数相加。而由功能单一的指令所构成的集合,就被称为指令集。

以一个加法的实现为例说明。

现在主内存中有两个数字a和b,我们要计算a+b的结果。我们定义三个指令来完成这件事:

load指令,将数据从内存读取到寄存器中;

add指令,完成加法运算;

store指令,将寄存器中的数据写入到内存中。

一条指令的格式是“操作符 操作数1 操作数2”,其中load、add、store就是操作符,操作数就是存放在寄存器或者内存中的数据。

执行过程如下:load 寄存器1 a; 将数字a从内存中复制到寄存器1中load 寄存器2 b; 将数字b从内存中复制到寄存器2中add 寄存器1 寄存器2; 将寄存器1和寄存器2的内存相加,结果保存在寄存器1中store 寄存器1 主内存; 将寄存器1的内存写到主内存中

看到这里,陈小速拍着脑袋,又站起来口中念念有词,来回踱步了。吴进也没有打扰他,只是微笑地看着他。

陈小速忽然有了灵感,他大声说道:“吴大哥,CPU看起来挺傻的嘛,它每次就干一件特简单的事,而且还一板一眼的。是不是这样意思呢,哈哈!”

“没错,” 吴进笑着表示了肯定,“CPU的单个指令都是很简单的操作。它的特长在于快,就说加法运算,它一秒之内就可以算数十亿次,这个你比不了吧?”

“那是。” 陈小速吐了吐舌头。

程序

“再往下思考一下,” 吴进提示着说,“你现在知道了指令集,那么计算机是怎样完成复杂功能的呢?”

“我想一想。” 陈小速没有马上回答,而是陷入了思索中。

良久,陈小速抬起头来,有些怯意地说:“我想了个大概,不知道对不对?”

“尽管说出来,这才是你进步的时候。” 吴进鼓励着。

“我这是这么想的,既然两个数相加,需要四条指令来完成。那么三个数相加呢?应该是先算出前两个数的结果,才和第三个数相加,那就要增加四条指令了。” 陈小速说着自己的想法,吴进不住地点头。

“那么乘法呢?就可以看成是n个数的相加,也可以转变成多条加法指令来完成。” 陈小速自己好像也越说越自信了,“所以,我觉得计算机完成复杂功能的运算,应该是把一个大任务拆解成一条一条可以让CPU执行的指令。这个指令数量可能会很多,但没关系,CPU它不是快嘛。” 说到最后,陈小速还开起了玩笑。

吴进了竖了个大拇指,说:“你理解得很不错,你说的其实是计算机科学中一个很重要的基本思想。就是分治思想,将一个大问题拆解成若干可以解决的小问题,从而得到问题解。”

这回倒将陈小速闹了个大红脸,他急忙说:“别,吴大哥,我就是随口瞎掰的。”

“那再问一句了,这些完成了复杂功能的指令放在一起,是什么?” 吴进继续提问。

“指令清单,指令列表,还是啥的……” 陈小速自己都觉得不对了。

“这就是程序。” 吴进着重强调了最后两个字。

听到这里,陈小速忽然觉得天顶好像被炸开,一线阳光洒了进来,周围的桌椅板凳都变得清晰起来。他不知道为什么,想起了《黑客帝国》里Neo第一次看到Matrix的本质一样。

结语

“那我们编程序,就是把一个大任务,分解成一条一条的指令,然后写下来吗?” 陈小速喃喃自语,又像在提问。

“可以这么理解,但直接写成CPU指令的话,那人类到现在只怕还停留在做四则运算的水平。因为那样写起来太单调,都是重复性工作,工作量太大。” 吴进解释着。

他继续说道:“这就是为什么我们需要编程语言了,你下次过来,我们就可以好好讨论一下编程语言的话题了。回去别忘了跟你同学讲解今天的内容啊。”

陈小速用力地点着头。他真想赶紧来学下一课啊。

#技术编程

随机阅读

qrcode
访问手机版