【问题标题】:How does machine code communicate with processor?机器代码如何与处理器通信?
【发布时间】:2012-04-02 23:08:40
【问题描述】:

我们以 Python 为例。如果我没记错的话,当你在其中编程时,计算机首先将代码“翻译”为 C。然后再从 C 到汇编。汇编是用机器代码编写的。 (这只是我对此的一个模糊想法,如果我错了,请纠正我)但是机器代码是用什么写的,或者更准确地说,处理器如何处理它的指令,它如何“找出”怎么办?

【问题讨论】:

  • 我在github.com/dwelch67 meecoate 有一些模拟器,例如,它是一个干净、简单的指令集,我有逻辑和软件模拟器。虽然可能不是最漂亮的逻辑解决方案,但它可以/将作为硬件工作,但对于软件程序员来说也应该是可读的。同样,软件指令集模拟器绝对应该是程序员可读的。
  • 这就是它的真正完成方式,逻辑“查看”某些位,并从那里做出决定。现实是来自 hdl 的每件小事都有很长的逻辑方程。有点类似于高级语言成为实现该高级程序的更长的汇编指令列表。
  • 查找/借阅 Petzold 的《代码》一书。

标签: interpreter processor machine-code microcoding


【解决方案1】:

如果我没记错的话,当你在其中编程时,计算机首先将代码“翻译”为 C。

不,它没有。 C 没有什么特别之处,只是它是用于系统编程的最广泛的编程语言。

Python 解释器将 Python 代码翻译成由虚拟机执行的所谓 P 代码。该虚拟机是读取 P-Code 的实际解释器,P-Code 的每个 blip 都会使解释器执行预定义的代码路径。这与本机二进制机器代码控制 CPU 的方式并无太大区别。一种更现代的方法是将 P-Code 翻译成本地机器码。

CPython 解释器本身是用 C 语言编写的,并已编译为原生二进制文件。基本上,本机二进制文件只是一长串数字(操作码),其中每个数字指定一个特定的操作。一些操作码告诉机器,它后面定义的数字不是操作码而是参数。

CPU 本身包含一个所谓的指令解码器,它按数字读取本机二进制数,并且对于它读取的每个操作码,它都会为执行此特定操作码的 CPU 电路供电。有用于寻址内存的操作码、将数据从内存加载到寄存器的操作码等等。

处理器如何处理它的指令,它如何“找出”要做什么?

对于每个只是二进制模式的操作码,CPU 上都有自己的电路。如果操作码的模式与启用此操作码的“开关”匹配,则其电路会对其进行处理。

这是一本关于它的 WikiBook: http://en.wikibooks.org/wiki/Microprocessor_Design

几年前,有人用简单的功能逻辑和内存 IC 构建了一个完整的工作计算机,即不涉及微控制器或类似设备。整个名为 "Big Mess o' Wires" 的项目或多或少是一个从头开始构建的 CPU。唯一更书呆子的就是用单个晶体管构建那个东西(实际上并没有那么困难)。他还提供了一个模拟器,可以让你看到 CPU 内部是如何工作的,解码每条指令并执行它:Big Mess o' Wires Simulator

编辑:自从我最初写下这个答案以来,已经完成了使用现代分立组件构建成熟的 CPU:请考虑使用 MOS6502(为 Apple II、Commodore C64、NES、BBC 提供动力的 CPU Micro 等等)从磁盘构建: https://monster6502.com/

【讨论】:

    【解决方案2】:

    机器代码不“与处理器通信”。

    相反,处理器“知道如何评估”机器代码。在 [widespread] Von Neumann 架构中,这个机器代码(程序)可以被认为是一个可索引的数组,其中每个单元格都包含一个机器代码指令(或数据,但我们暂时忽略它)。

    CPU“查看”当前指令(通常由 PC 或 Program Counter 识别)并决定要做什么(这可以直接使用晶体管/“裸机”完成,也可以转换为低级代码):这称为fetch-decode-execute 循环。

    当指令执行时副作用发生,例如设置控制标志,将值放入寄存器,或跳转到程序中的不同索引(更改PC)等。请参阅此simple overview of a CPU,它更好地涵盖了上述内容。

    这是对每条指令的评估——当它遇到时——以及导致传统处理器运行的副作用的交互。

    (当然,现代 CPU 非常复杂并且可以做很多巧妙而棘手的事情!)

    【讨论】:

      【解决方案3】:

      这就是microcode。是 CPU 中的代码读取机器代码指令并将其转换为低级数据流。

      例如,当 CPU 遇到 add 指令时,微码描述了它应该如何获取这两个值,将它们提供给 ALU 进行计算,以及将结果放在哪里。

      【讨论】:

      • 虽然在简单的处理器上根本不需要涉及任何这样的微码。我认为在这种情况下,只需简单地了解一下 PC/FETCH/EXECUTE 的工作原理将是一个好的开始。..
      • 微码是 CISC 架构的特殊之处,其中每条指令都被分解为一系列微操作。还有一些没有微码的架构,直接执行操作码。 Pentium之前的所有x86都是这样的。
      • @datenwolf CISC 不需要微码。 RISC 可以有微码。
      • @pst:嗯,不。 CISC 通常利用微码将 CISC 指令解码为一系列 RISC 指令。大多数 RISC 架构 OTOH 没有微码。这正是 CISC 和 RISC 的含义: CISC:复杂指令集代码。 RISC:精简指令集代码。使用纯 RISC 机器,微码几乎没有什么可做的,因为一切都已经分解成最简单的指令。
      • @datenwolf 对于现代 CISC CPU。没有什么固有的说这是 CISC 的属性,尽管在许多情况下它是有道理的。同样,对于 RISC,这是相反的。因此“不需要”和“可以”。
      【解决方案4】:

      电力。电路、内存和逻辑门。

      另外,我相信Python通常是解释型的,而不是通过C→汇编→机器码编译的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 2014-09-01
        • 2019-08-18
        相关资源
        最近更新 更多