诺依曼计算机CPU
<h3> 前言 对于80后来说,最早接触计算机应该是在95年左右,那个时候最流行的一个词语是多媒体。 依旧记得当时在同学家看同学输入几个DOS命令就成功的打开了一个游戏,当时实在是佩服的五体投地。因为对我来说,屏幕上的东西简直就是天书。有了计算机我们生活发生了巨大的变化,打游戏,上网,聊天,甚至到现在以此为业。有时无不感叹计算机的强大。
人类总是聪明的而又懒惰的。即便是1+1这种简单的计算都不想自己做,1623年Wilhelm Schickard 制作了一个能进行六位以内数加减法,并能通过铃声输出答案的"计算钟"。通过转动齿轮来进行操作。 这已经相当高端了,说起计算器,我们5000年文明古国在东汉末年就有记载了<strong>---算盘。
计算机的发展也是随着科技的发展经历了机械计算机、电子计算机、晶体管计算机、小规模集成电路和超大规模集成电路计算机。我们无意讨论整个计算机的发展过程,主要还是介绍基于冯诺依曼体系结构的现代计算机。
<h3> 1. 计算机的发展 <h3>
计算机的发展包括了硬件和软件的发展,硬件的发展为计算机提供了更快的处理速度,而软件的发展为用户提供了更好的体验。两者相辅相成,密不可分。
<li dir="ltr"> <strong>第一阶段: 60年代中期以前,是计算机系统发展的早期时代。在这个时期通用硬件已经相当普遍,软件却是为每个具体应用而专门编写的,大多数人认为软件开发是无需预先计划的事情。
这时的软件实际上就是规模较小的程序,程序的编写者和使用者往往是同一个(或同一组)人; <li dir="ltr"> <strong>第二阶段:从60年代中期到70年代中期,是计算机系统发展的第二代。
在这10年中计算机技术有了很大进步。多道程序、多用户系统引入了人机交互的新概念,开创了计算机应用的新境界,使硬件和软件的配合上了一个新的层次; <li dir="ltr"> <strong>第三阶段:计算机系统发展的第三代从20世纪70年代中期开始,并且跨越了整整10年。在这10年中计算机技术又有了很大进步。
分布式系统极大地增加亍计算机系统的复杂性,局域网、广域网、宽带数字通信以及对“即时”数据访问需求的增加,都对软件开发者提出了更高的要求; <li dir="ltr"> <strong>第四阶段:在计算机系统发展的第四代已经不再看重单台计算机和程序,人们感受到的是硬件和软件的综合效果。由复杂操作系统控制的强大的桌面机及局域网和广域网,与先进的应用软件相配合,已经成为当前的主流。计算机体系结构已迅速地从集中的主机环境转变成分布的客户机/服务器。
<h3> 2. 计算机基本原理 <h3>
Copy了点计算机的发展历史,现在可以来看看计算机的基本工作原理了。现代计算机,大部分都是基于冯诺依曼体系结构,而我们这里谈论的也是此问前提。<strong>冯诺依曼的核心是:存储程序,顺序执行。所以不管计算机如何发展,基本原理是相同的。计算机程序实际上是告诉计算机做什么。
<h2> 2.1 冯诺依曼体系结构 <h3>
<li> 计算机处理的数据和指令一律用二进制数表示; <li> 指令和数据不加区别混合存储在同一个存储器中; <li> 顺序执行程序的每一条指令; <li> 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。
冯诺依曼体系结构的计算机必须具有如下功能:
<li> 把需要的程序和数据送至计算机中; <li> 必须具有长期记忆程序、数据、中间结果及最终运算结果的能力; <li> 能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力; <li> 能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作; <li> 能够按照要求将处理结果输出给用户。
<h2> 2.2 计算机工作原理 <h3>
对于我们现代计算机来说,最关键的2个部件就是CPU和内存。内存存储了要执行的程序指令,而CPU就是用来执行这些指令。CPU首先要知道这些指定存放在存储器的那个区域,然后才能执行,并且把执行的结果写入到执行区域。
<h3> 2.2.1 CPU指令和编程语言 <h3>
在了解CPU和存储器工作原理之前,先来了解一下CPU指令和我们编程语言之间的一些关系。
<h4> 2.2.1.1 CPU指令 <h3>
因为在计算机中指令和数据都用二进制来表示,也就是说它只认识0和1这样的数字。最早期的计算机程序通过在纸带上打洞来人工操操作的方式来模拟0和1,根据不同的组合来完成一些操作。后来直接通过直0和1编程程序,这种称之为机器语言。这里就会有一个疑问,<strong>计算机怎么知道你这些组合的意思?
于是就出现了CPU指令,我们现在买CPU都会听到指令集这一说。CPU指令其实就对应了我们这里说的0和1的一些组合。每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。有了CPU指令集的文档你就可以通过这个编写CPU认识的机器代码了。所以对于不同CPU来说可能会有不同的机器码。比如下面我们就定义了一套我们CPU硬件电路可以完成的CPU指令。
<table border="1" cellpadding="1" cellspacing="1" style="width:372px;height:106px;" width="372"> <tbody> <tr> <td> <strong>指令</td> <td>
<strong> 格式</td> <td>
<strong> 说明</td> </tr> <tr> <td> 0001</td> <td> <strong>[address][register]</td> <td> <strong>读取存储取值到寄存器 </td> </tr> <tr> <td> 0010</td> <td> <strong>[register][address]</td> <td> <strong>写入寄存器的值到存储器</td> </tr> <tr> <td> 0011</td> <td> <strong>[register1][register2]</td> <td> <strong>加法操作</td> </tr> </tbody> </table>
随着计算机的发展,CPU支持的指令也越来越多,功能也越来越强,上图就是现在Core I5处理器支持的指令集。
<h4> 2.2.1.2 汇编语言 <h3>
<table align="left" border="1" cellpadding="1" cellspacing="1" style="width:413px;height:90px;" width="413"> <tbody> <tr> <th scope="col"> 指令</th> <th scope="col"> 汇编指令</th> <th scope="col"> 格式</th> <th scope="col"> 说明</th> </tr> </tbody> <tbody> <tr> <td> 0001</td> <td> READ</td> <td> <strong>[addLable][regLab]</td> <td> <strong>读取存储取值到寄存器</td> </tr> <tr> <td> 0010</td> <td> WRITE</td> <td> <strong>[addLable][regLab]</td> <td> <strong>写入寄存器的值到存储器</td> </tr> <tr> <td> 0011</td> <td> ADD</td> <td> <strong>[var1][var2]</td> <td> <strong>加法操作</td> </tr> </tbody> </table>