简单计算器的逻辑电路图 指令集vs逻辑控制电路和逻辑计算电路

我们知道,电脑是用晶体管作为逻辑元件来设计逻辑控制电路和逻辑计算电路。这样的电路也就是开关电路,可以用二进制的“0,1”表示。只要有适当的位数(n),就可以组合成足够多的编码(2^n)。现在的晶体管足够小,所以集成电路集成的晶体管数量足够多(20纳米制程工艺的约指甲盖大小的芯片可以集成数十亿个晶体管)。晶体管作为电子元件,其数据传输速度和运算速度(Intel酷睿i5-2320CPU主频:3GHz)也足够快,所以复杂的运算都可以简化组合为基本的加法运算。

1 计算机的逻辑加法运算是如何实现的呢?

1847年,英国数学家布尔发表了《逻辑的数学分析》,建立了“布尔代数”,并创造一套符号系统,利用符号来表示逻辑中的各种概念。布尔建立了一系列的运算法则,利用代数的方法研究逻辑问题,初步奠定了数理逻辑的基础。

1938年香农在MIT获得电气工程硕士学位,硕士论文题目是《A Symbolic Analysis of Relay and Switching Circuits》(继电器与开关电路的符号分析)。当时他已经注意到电话交换电路与布尔代数之间的类似性,即把布尔代数的“真”与“假”和电路系统的“开”与“关”对应起来,并用1和0表示。于是他用布尔代数分析并优化开关电路,这就奠定了数字电路的理论基础。哈佛大学的Howard Gardner教授说,“这可能是本世纪最重要、最著名的一篇硕士论文。”

计算机其实是一个只会做二进制加法的机器,其他算法都是在此基础上复合而来的。

简单计算器的逻辑电路图 指令集vs逻辑控制电路和逻辑计算电路(1)

一位全加器的真值表如下图,其中A为被加数,B为加数,相邻低位来的进位数为Ci,输出本位和为S。向相邻高位进位数为C0。

简单计算器的逻辑电路图 指令集vs逻辑控制电路和逻辑计算电路(2)

2 CPU指令集

计算机是通过执行指令来处理各种数据的。为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息:

(1)操作码。它具体说明了操作的性质及功能。一台计算机可能有几十条至几百条指令,每一条指令都有一个相应的操作码,计算机通过识别该操作码来完成不同的操作。

(2)操作数的地址。CPU通过该地址就可以取得所需的操作数。地址码用来描述该指令的操作对象,它或者直接给出操作数,或者指出操作数的存储器地址或寄存器地址(即寄存器名)。

(3)操作结果的存储地址。把对操作数的处理所产生的结果保存在该地址中,以便再次使用。

(4)下条指令的地址。执行程序时,大多数指令按顺序依次从主存中取出执行,只有在遇到转移指令时,程序的执行顺序才会改变。为了压缩指令的长度,可以用一个程序计数器(ProgramCounter,PC)存放指令地址。每执行一条指令,PC的指令地址就自动 1(设该指令只占一个主存单元),指出将要执行的下一条指令的地址。当遇到执行转移指令时,则用转移地址修改PC的内容。由于使用了PC,指令中就不必明显地给出下一条将要执行指令的地址。

各计算机公司设计生产的计算机,其指令的数量与功能、指令格式、寻址方式、数据格式都有差别,即使是一些常用的基本指令,如算术逻辑运算指令、转移指令等也是各不相同的。因此,尽管各种型号计算机的高级语言基本相同,但将高级语言程序编译成机器语言后,其差别也是很大的。因此将用机器语言表示的程序移植到其他机器上去几乎是不可能的。从计算机的发展过程已经看到,由于构成计算机的基本硬件发展迅速,计算机的更新换代是很快的,这就存在软件如何跟上的问题。大家知道,一台新机器推出交付使用时,仅有少量系统软件(如操作系统等)可提交用户,大量软件是不断充实的,尤其是应用程序,有相当一部分是用户在使用机器时不断产生的,这就是所谓第三方提供的软件。

为了缓解新机器的推出与原有应用程序的继续使用之间的矛盾,1964年在设计IBM360计算机时所采用的系列机思想较好地解决了这一问题。从此以后,每个计算机公司生产的同一系列的计算机尽管其硬件实现方法可以不同,但指令系统、数据格式、I/O系统等保持相同,因而软件完全兼容(在此基础上,产生了兼容机)。当研制该系列计算机的新型号或高档产品时,尽管指令系统可以有较大的扩充,但仍保留了原来的全部指令,保持软件向上兼容的特点,即低档机或旧机型上的软件不加修改即可在比它高档的新机器上运行,以保护用户在软件上的投资。

要理解CPU指令集,首先要理解与之相关的机器语言表示的机器指令集及汇编语言表示的汇编命令集及其二者与CPU指令集的关系。

汇编编程实际上最终实现的是机器码的二进制序列,那么为什么要涉及指令集这个玩意呢?因为没人想对着一堆数字思考。所以,通过指令集可以实现字母序列与二进制序列的一一对应关系。

特定的电脑系列会有特定的CPU指令集(当然电脑厂商为了保持通用和兼容会考虑芯片中电路设计功能实现的标准化问题),所以CPU指令集与汇编语言的指令集有特定的对应关系,也会有特定的汇编器。但最终的目标是通过汇编指令集编写汇编代码,通过汇编器翻译为CPU指令集对应的机器二进制序列,以方便编码编写、阅读、修改的便捷。当然用汇编编程相对于机器语言的二进制序列编程来说是进了一步,但还是处于效率比较低的阶段,而通过高级语言编程,通过编译器将其编译(翻译)到汇编代码,最终汇编到机器码,这样才算是达到了便捷的一个比较高的层次了。

3 计算机的指令是如何执行的

比如我们设计一套指令集,其中肯定有条加法指令。比如Add R1 R2 。我们可以认为这条指令的意思是计算寄存器R1中的内容和R2的和,然后把结果存到R1寄存器中。

那么经过编译后这条指令会变成二进制,比如010100010010 。这条二进制指令一共12位。分为三大部分,最前面的0101表示这是条加法指令,后面0001说的是第一个操作数是寄存器1,最后0010说的是第二个数就是寄存器2(其实实际没有这么简单的指令,至少应该区分操作数是寄存器还是直接的数据,但为了把这说的更容易理解作了简化)。我们可以通过十二根导线把这条指令输入一个CPU中。导线通电就是1,不通电就是0 。为了叙述方便我们从左到右用A0-A11给这12根导线编上号。

然后计算机会分析这条指令,步骤如下:

  1. 第1-2位:01(导线A0和A1),第一根有电第二根没电,表示这是一条运算指令(而非存储器操作或者跳转等指令)。那么指令将被送入逻辑运算单元(ALU)去进行计算。

  2. 第3-4位:01(导线A2和A3),表示加法,那么就走加法运算那部分电路,关闭减法等运算电路。

  3. 第5-8位:01(导线A4-A7),A4-A7将被送入寄存器电路,从中读取寄存器保存的值。送到ALU的第一个数据接口电路上。

  4. 第9-12位:01(导线A8-A11),后面的A8-A11同样被送入寄存器选择电路,接通R2寄存器,然后R2就把值送出来,放到ALU的第二个数据接口上。

  5. ALU开始运算,把两个接口电路上的数据加起来,然后输出。

  6. 最后结果又被送回R1。

基本上简单的运算计算机就是这么操作的。他其实不知道你那些指令都是什么意思。具体的指令编程机器码后就会变成数字电路的开关信号。其中某几段会作为控制信号,控制其他部分的数据走不同的电路以执行运算。他没有一个地方保存着如何翻译这些机器码的字典,所有机器码的意义都被体现在整个电路的设计中了。

当然,从汇编到机器码这步是汇编程序翻译的。汇编程序当然知道某条指令要翻译成什么样的机器码。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页