那么,就可以交给CPU,让它运行这个程序了。在这儿,我们举个小的例子,来看一下
程序运行到底是怎么来进行的。
这是C++编程工具的一个界面,现在呢,暂时还不需要大家了解。
我们只需要理解红框之内的部分就可以了。
我们来看,这是刚才那段程序:a=4,b=3,c=a+b
非常简单的一段程序。经过C++编译器的编译,会把它编译成这样的一个结果:与每一句程序对应的我们都得到一个汇编的程序。比仿说,
a=4,得到这一句,b=3,得到这一句,c=a+b,得到底下三句。
那么,这样一个结果呢,再转换成相应的二进制代码,
就可以交给CPU去运行了。
我们来看一下这个程序在运行中会发生什么?首先,我们看到这个界面,
这个界面看上去陌生,实际上非常熟悉。这是冯诺依曼式计算机基本的一个架构。
这是控制器,这是运算器,这是存储器。
我只不过把这个图呢竖过来画了。
那首先原始的程序在这里,
原始程序经过编译呢,得到一个编译后的代码。
这个代码转换成二进制就可以让CPU去跑了。 下面我们来解释一下程序的执行过程。
对于某个程序而言,会在内存中开辟两个区域供它们来使用。
一个是代码区,专门用来存放将要执行的代码;一个是数据区,
准备用来存放待处理的数据。
那么,这两个部分呢不在一个内存区域里面,所以说,
在这个图中,我们也分开画,把它体现出来。那么程序的执行过程是这样的:
首先,程序计数器指向待执行的第一条程序:mov
a,4 这条程序的含义呢,是在数据区相应的区域给a赋值为4,程序的执行结果是这样的:
执行结果有两个:第一个,
在数据区开辟了一片空间,在里面存放了值4,把4这个值存放其中。
然后呢在控制器的控制下程序计数器指向下一条要执行的程序:mov b,3
然后这个含义是,在数据区内为变量b开辟一个区域,并且把3赋值给变量b。
程序执行的结果是这样的:
数据区中变量b被赋值为3
并且程序计数器在控制器的驱动下指向下一条要执行的程序:mov eax,a
eax通常代表运算器中的累加计算器。所以,这条语句的含义是,
把变量a的值传递给运算器的累加器。
程序的执行结果是这样,
这条程序的执行过程需要控制器先去访问数据区中a的值,
然后把这个值取出,放入运算器的累加器。
程序的执行结果是这样的,程序计数器指向下一条语句,
并且把变量a的值放入到累加器。
现在程序指向一条新的语句,叫add eax,b
也就是说,要把运算器中累加器的值与变量b的值作一个相加。
要执行这个指令呢,需要控制器先去变量b的存储空间把变量3这个值取出来,
送给运算器的缓冲寄存器,
然后通过ALU完成相加的运算。
其结果呢,存放在累加器中。
执行的结果是这样的。
那么,现在计数器,控制器的计数器指向了最后的一条语句:mov c, eax
它的含义是,
把累加器的值传递给变量3所在的区域, 所以程序的执行结果变成这样:
那么,到现在为止,程序就执行完毕了。
因为程序就执行到最后一个语句了。
我们也获得了相应的结果,a=4,b=3,c=a+b,于是,
c=7。我们也获得了这个结果。
这样呢,这个程序就执行完毕了。在这呢,我们对这个示例做一个小结。
通过刚才的例子呢,我们能够得到这样一些结论:
首先我们知道,程序必须要经过编译才转换成CPU所能接受的指令;因为程序是不可能直接被CPU读懂的。
再一个,我们看到,一句程序有可能转换为多句指令;那么这些指令的执行是
在控制器的协调下连续、依次执行的指令;
程序执行过程是在内存中完成的;我们呢,看到内存中这种数据的变化
那么程序在执行过程中,在内存中利用不同区域,分别存放代码和相关的数据。
这就是通过我们刚才的例子,我们能够得出的小结论。
最后呢,我们来总结一下,我们学到了哪些东西。首先,我们知道,计算机是能用电路来进行计算的。也就是,数可以转化为二进制数,
二进制数都可以用布尔运算来算,而且布尔运算都可以用电路实现。
所以,电路能算数。
第二个,我们知道,CPU是制造好的电路,它能完成指令集里面的运算。
CPU跟指令集是密切不可分的。那么指令呢是二进制码,CPU能看懂,并且能执行它。
第三个,我们想让CPU按照我们的想法做事,
我们就应该,把我们想做的事情写出来
这个写出来大概要用到某种语言吧,比方说,X++
把这个写出来的东西,编译成CPU能看懂的二进制指令。然后,CPU就可以按照我们的想法运行了。
所以,我们接下来的事情就是,我们赶紧去学习一门X++语言吧
它能被翻译成CPU能看懂的指令。
于是,我们就可以利用我们的程序执行CPU如何去运转了。
从下节课开始,我们进入程序基础课的学习。
开始学C++语言。