zoukankan      html  css  js  c++  java
  • CPU的硬件结构和汇编语言

    知乎用户、朱超然谭厶 等人赞同
    是,这个解释起来有点长。Be patient
    现代的CPU没拆过,我只在计算机组成原理实验课上用VHDL在某个实验平台上做过一个模拟的CPU。举个例子你可能比较好理解。
    比如我们设计一套指令集,其中肯定有条加法指令。比如Add R1 R2 。我们可以认为这条指令的意思是计算寄存器R1中的内容和R2的和,然后把结果存到R1寄存器中。
    那么经过编译后这条指令会变成二进制,比如010100010010 。这条二进制指令一共12位。明显可以分为三大部分。最前面的0101表示这是条加法指令,后面0001说的是第一个操作数是寄存器1,最后0010说的是第二个数就是寄存器2(其实实际没有这么简单的指令,至少应该区分操作数是寄存器还是直接的数据,但为了把这说的更容易理解作了简化)。我们可以通过十二根导线把这条指令输入一个CPU中。导线通电就是1,不通电就是0 。为了叙述方便我们从左到右用A0-A11给这12根导线编上号。
    然后计算机会分析这条指令。步骤如下:
    1. 最开始的两根导线A0和A1,第一根有电第二根没电,就能知道这是一条运算指令(而非存储器操作或者跳转等指令)。那么指令将被送入逻辑运算单元(ALU)去进行计算。其实很简单。只要这两根线控制接下来那部分电路开关即可。
    2. 接下来的A2和A3,01表示加法,那么就走加法运算那部分电路,关闭减法等运算电路。
    3. A4-A7将被送入寄存器电路,从中读取寄存器保存的值。送到ALU的第一个数据接口电路上。
    4. 后面的A8-A11同样被送入寄存器选择电路,接通R2寄存器,然后R2就把值送出来,放到ALU的第二个数据接口上。
    5. ALU开始运算,把两个接口电路上的数据加起来,然后输出。
    6. 最后结果又被送回R1。
    基本上简单的运算计算机就是这么操作的。他其实不知道你那些指令都是什么意思。具体的指令编程机器码后就会变成数字电路的开关信号。其中某几段会作为控制信号,控制其他部分的数据走不同的电路以执行运算。他没有一个地方保存着如何翻译这些机器码的字典,所有机器码的意义都被体现在整个电路的设计中了。
    当然,从汇编到机器码这步是汇编程序翻译的。汇编程序当然知道某条指令要翻译成什么样的机器码。

     
     
    评分最高的(@Cascade )回答的应该是指令是如何执行的,对题主提的指令集存在CPU哪里,我的回答是:
    1. 指令集是在设计CPU时规定的,指令集规定了有哪些CPU能够“一条条”执行的“指令”是合法的。
    2. 指令集是一个集合,它的功能性体现在每条能够执行的“指令”上面。涉及到具体指令后,就涉及到谁是“操作对象”,和“如何找到操作对象”,“对操作对象进行什么操作”,这些问题上来。
    3. 指令的功能是通过CPU中功能逻辑电路来实现的,之前的“指令设计”决定了如何进行“逻辑电路设计”。而相同的指令可以采取不同的逻辑电路设计。
    4. 因为“指令集”本身没有功能性,所以在CPU中你不能找到“指令集”这个实体,但是指令集中的指令与CPU的内部晶体管组成的逻辑电路是等价的(除了指令部分还有中断,外设等这些暂不考虑),那么非要化等价的话,就是实现指令集中各指令的整体晶体管逻辑电路。
    5. 如果你非要在没给出指令集的CPU来找到它的指令集的话,你可以通过修改PC指向的下一条指令的内容,并观察内存及各寄存器的变化,来试探每条指令编码的功能(这显然没有什么实际价值)(你可以用这种方法去理解指令的功能)。
     
  • 相关阅读:
    uniGUI之uniEdit(23)
    ​Shiro授权
    Shiro密码重试次数限制
    Ehcache基础入门
    Shiro简单加密服务
    Shiro身份验证
    第二章、Web中使用shiro(实现登陆)
    第一章、认识Shiro
    使用IntelliJ/Eclipse生成类图
    Jedis操作Redis实例
  • 原文地址:https://www.cnblogs.com/S-volcano/p/5032478.html
Copyright © 2011-2022 走看看