<h4> 2.2.1.3 高级语言 <h3>
对于高级语言来说需要一个<strong>编译器来完成高级语言到汇编语言的转换。所以对比不同的CPU结构,只需要有不同编译器和汇编器就能使得我们的程序在不同CPU上都能运行了。如下图在VS2010中,我们可以选择程序编译的目标平台,X86,X64,ARM等。当然除了这些编译类的语言之外还有解释类型的语言如JS,就不在此讨论范围内。
到这里有一个疑问:<strong>当CPU的指令集更新后高级语言会有什么影响和变化?对于目前来说,一般出现了新的指令,会有对应的新的汇编器和编译器。所以编译器可以把一些高级语言的表达式编译成新的汇编指令,这样对于高级来说不会有任何变化; 当然还有一种情况就是高级语言会增加新的语法来对应一些新的汇编语言和指令。但是这种情况出现的几率很小。所以如果编译器不支持新的指令,那么只有只用汇编会来实现了。
<h4> 2.2.1.4 小结 <h3>
从上面的我们可以看出,我们写的程序最终都将变成机器认识的二进制可执行程序,然后加载到内存顺序的执行。 从机器码到汇编到高级语言,我们可以看到计算机中无处不在的分层,抽象的思想。不光光是软件,硬件同样适用。<strong>最后留下一个问题在这里: C#和JAVA程序编译出来的文件不是二进制的机器码,而是中间语言,那么他们又是怎么运行的呢?
<h3> 2.2.2 CPU工作原理 <h3>
<h4> 2.2.2.1 CPU功能 <h3>
<li> <strong>时间控制: 有些控制信号在时间上有严格的先后顺序,如读取存储器的数据,只有当地址线信号稳定以后,才能通过数据线将所需的数据读出,否则读出的数据是不正确的数据,这样计算机才能有条不紊地工作。
<li> <strong>数据加工: 所谓数据加工,就是对数据进行算术运算和逻辑运算处理。 所谓数据加工,电脑维修技术,就是对数据进行算术运算和逻辑运算处理
<h4> 2.2.2.2 CPU基本组成 <h3>
以前CPU主要由<strong>运算器和<strong>控制器两大部分组成,随着集成电路的发展,目前CPU芯片集成了一些其它逻辑功能部件来扩充CPU的功能,如浮点运算器、内存管理单元、cache和MMX等。下面2张图分别是8086和Pentium CPU的结构图。
.
对于一个通用的CPU来说,我们只需要关注他的核心部<strong>件算数逻辑单元和操作控制单元。
1. 控制器的组成和功能: 控制器由程序计数器、指令寄存器、指令译码器、时序产生器和操作控制器组成。它是计算机指挥系统,完成计算机的指挥工作。尽管不同计算机的控制器结构上有很大的区别,当就其基本功能而言,具有如下功能:
<li> 取指令 从内存中取出当前指令,并生成下一条指令在内存中的地址。 <li> 分析指令 指令取出后,控制器还必须具有两种分析的功能。
一是对指令进行译码或测试,并产生相应的操作控制信号,以便启动规定的动作。比如一次内存读/写操作,一个算术逻辑运算操作,或一个输入/输出操作。
二是分析参与这次操作的各操作数所在的地址,即操作数的有效地址。
<li> 执行指令 控制器还必须具备执行指令的功能,指挥并控制CPU、内存和输入/输出设备之间数据流动的方向,完成指令的各种功能。
<li> 发出各种微操作命令 在指令执行过程中,要求控制器按照操作性质要求,发出各种相应的微操作命令,使相应的部件完成各种功能。
<li> 改变指令的执行顺序 在编程过程中,分支结构、循环结构等非顺序结构的引用可以大大提供编程的工作效率。控制器的这种功能可以根据指令执行后的结果,确定下一步是继续按原程序的顺序执行,还是改变原来的执行顺序,而转去执行其它的指令。
<li> 控制程序和数据的输入与结果输出 这实际也是一个人机对话的设计,通过编写程序,在适当的时候输入数据和输出程序的结果。
<li> 对异常情况和某些请求的处理 当计算机正在执行程序的过程中,发生了一些异常的情况,例如除法出错、溢出中断、键盘中断等。
2. 运算器的组成和功能: 运算器由算术逻辑单元(ALU)、累加寄存器、数据缓冲寄存器和状态条件寄存器组成,它是数据加工处理部件,完成计算机的各种算术和逻辑运算。相对控制器而言,运算器接受控制器的命令而进行动作,即运算器所进行的全部操作都是由控制器发出的控制信号来指挥的,所以它是执行部件。运算器有两个主要功能:
<li> 执行所有的算术运算,如加、减、乘、除等基本运算及附加运算; <li> 执行所有的逻辑运算,并进行逻辑测试,如与、或、非、零值测试或两个值的比较等。
<h4 dir="ltr"> 2.2.2.3 CPU工作流程 <h3>
CPU的基本工作是执行存储的指令序列,即程序。程序的执行过程实际上是不断地取出指令、分析指令、执行指令的过程。几乎所有的冯•诺伊曼型计算机的CPU,其工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数和结果写回。
<h4 dir="ltr"> 2.2.2.4 指令周期 <h3>
从上面的定义可以知道,对于CPU来说取出和执行任何一条指令所需的最短时间为两个CPU周期。所以频率越高,那么时钟周期越短,这样CPU周期和指令周期也就越短,理论上程序执行的速度也越快。但是频率不能无限的提高,而且频率的提高也带来了功耗,发热等问题,所以目前也有超线程,流水线等技术来提高CPU执行的速度。
<h4 dir="ltr"> 2.2.2.5 时序发生器
<li> 时序信号: 在计算机高速运行的过程中,计算机内各部件的每一个动作都必须严格遵守时间规定,不能有任何差错。计算机内各部件的协调动作需要时间标志,而时间标志则是用时序信号来体现的。计算机各部分工作所需的时序信号,在CPU中统一由时序发生器来产生。
<li> 时序发生器: 时序信号发生器是产生指令周期控制时序信号的部件,当CPU开始取指令并执行指令时,操作控制器利用时序信号发生器产生的定时脉冲的顺序和不同的脉冲间隔,提供计算机各部分工作时所需的各种微操作定时控制信号,有条理、有节奏地指挥机器各个部件按规定时间动作。
在这里有一个疑问:<strong>指令和数据都存放在内存中,那么CPU怎么区分是指令还是数据呢?
从时间上来说,取指令事件发生在指令周期的第一个CPU周期中,即发生在“取指令”阶段,而取数据事件发生在指令周期的后面几个CPU周期中,即发生在“执行指令”阶段。从空间上来说,如果取出的代码是指令,那么一定送往指令寄存器,如果取出的代码是数据,那么一定送往运算器。
通过以上我们了解了CPU的工作过程。简单来说就是CPU要顺序执行一个程序的指令,首先是控制器获得第一条指令的地址,当CPU取得这个指令并执行后,控制器需要生成下一条要执行的指令的地址。ALU单元负责一些运算操作。下面的FLASH演示了CPU执行一个加法操作的流程。
CPU工作流程FLASH: http://218.5.241.24:8018/C35/Course/ZCYL-HB/WLKJ/jy/Chap05/flash-htm/5.6.swf
ID:2061