【问题标题】:How does the CPU translate assembly to binary?CPU如何将汇编翻译成二进制?
【发布时间】:2023-03-02 22:30:01
【问题描述】:

我听说计算机多年来只能理解以二为底(二进制)的数字。 最近,我想通过停止高级脚本语言并阅读一些汇编来深入了解我的机器是如何工作的。 我知道这种语言的目标是让 CPU 速度快:对它来说很简单,CPU 可以轻松解码汇编指令。 抱歉,如果我的问题不清楚,我将尝试消除疑虑: CPU如何将汇编转换为二进制? 我的问题可能毫无意义,因为电脑也玩电,在这种情况下,我的问题是: 什么意思:“计算机只懂二进制”?

【问题讨论】:

标签: assembly cpu


【解决方案1】:

汇编语言只是人类可以阅读的东西(操作码)和机器可以阅读的东西(二进制电气符号)之间的中间表示。

当您用汇编语言编写程序时,您的汇编程序会将其转换为二进制,这种二进制表示会存储到一些支持(硬盘驱动器、软盘、磁带...等)中。

当计算机执行您的二进制文件时,(基本上)会发生以下情况:

  1. 从驱动器中获取二进制格式的程序并加载到 RAM 中;
  2. 指令从 RAM 中一一加载到 CPU 中,指令的二进制形式 (10110 = current, no current, current, current, no current) 会触发 CPU 内部电路的某些操作(它可能会触发例如加法或加载或 CPU 电路支持的任何其他操作)。

了解这一点的最佳方法是尝试构建一个非常简单的 4 位处理器(假设有 4 个操作和 16 个字节的 RAM)。网上有很多教程。

什么意思:“计算机只懂二进制”?

这只是意味着 CPU 仅在其逻辑门中理解以下形式的“指令”:{当前,无当前},并且这些符号的每个特定系列都会触发对 CPU 某些部分的特定操作并提供一些结果。

【讨论】:

    【解决方案2】:

    “计算机只理解二进制”是对现实的过度简化。 CPU(让我们暂时将其限制为 CPU)是一个非常复杂的硬件。它由算术和逻辑单元(ALU)和控制单元(CU)等模块组成。

    现在 CPU 可以“理解”的程序只有二进制,现在要理解这意味着什么,需要了解内存的基本工作原理。内存是使用用于创建逻辑门的晶体管构成的(这里隐藏了更多复杂性)。记忆的工作方式就像它处于一个恒定的循环中。如果您通过它馈送电流(将其值设置为 1),那么只要有电,它就会一直将其馈送回自身。当这种情况发生时,我们说那块内存的值是 1(因为有电流)。如果没有电流,则内存位置的值为 0(无电流)。

    现在“运行”一个程序意味着将一块内存(包含该程序)的内存内容馈送到 CPU。程序有一个入口点,从该点开始,根据内存内容,电源/无电源脉冲块(0 和 1)开始流入 CPU。根据 CPU 在输入中获得的内容以及 CPU 内部架构,电流将遵循不同的路径,并且在 CPU 的输出上,结果将根据输入内容而有所不同。每个 CPU 如何做到这一点非常冗长且复杂(https://en.wikipedia.org/wiki/Processor_design 了解 CPU 内部的外观)。

    现在,如果您用汇编语言编写某些东西,它会通过一个专门的程序,该程序将您编写的内容翻译成等效的二进制表示。 例如,如果您编写类似ADD 2, 3 的内容,那么汇编器会将其转换为 0 和 1 的流,当通过 CPU 时将生成 5(或 5 的二进制表示)

    【讨论】:

      【解决方案3】:

      将汇编语言代码转换为二进制文件的过程称为编码。 假设您对微控制器进行编程,并且您有一个嵌入了 Cortex-M0 处理器的 STM32F0xxxx μC。该处理器的架构是 ARMv6-M。指令编码可以参考架构参考手册https://static.docs.arm.com/ddi0419/d/DDI0419D_armv6m_arm.pdf

      示例:mov r0, #10

      打开手册并找到正确的章节。对于我们的指令,MOV(立即)它是 A6.7.40 - 在那里您可以看到指令框架如下所示:
      位 15:11 - 0b00100
      位 10:8 - Rd
      位 7:0 - imm8

      您必须在 Rd 字段中指定目标寄存器,并在 imm8 字段中指定要放入其中的值。在我们的例子中Rd为r0,所以Rd=0b000,值为10,所以imm8=0b00001010,编码后的整条指令为0b0010000000001010 = 0x200A

      【讨论】:

        【解决方案4】:

        我将尝试集中讨论当我们说计算机只理解二进制时我们的意思是什么

        首先我们来看这个例子

        假设您必须在机器中存储一个字母“g” 首先我们将其转换为 ASCII 值 103 现在 103 的二进制等价物是 1100111

        现在我们没有任何机制可以将这个数字存储在机器中。

        我们想出了一种方法来使用机器或换句话说收集电线来记住这一点

        我们放置了 7 根平行线,让电流从我们看到 1 的电线流出,而其他电线则没有电流,具体按照位的出现顺序,即 0 或 1

        现在每次看到这个图案我就知道这是英文字母g。

        现在我们可以假设我们的存储设备或处理器是一个由这些电线组成的巨大网络,这些电线被协同排列以使我们的逻辑正常工作

        请注意,我采用了一种过于简化的方法,只是它使其更加灵活,并且明确的实际实现显然要复杂得多,正如其他答案中所解释的那样,但基线保持不变

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-13
          • 2011-09-17
          • 1970-01-01
          • 2012-10-17
          • 2016-02-10
          • 1970-01-01
          • 1970-01-01
          • 2021-07-25
          相关资源
          最近更新 更多