compiler-construction - 机器如何解释二进制?

标签 compiler-construction binary operating-system cpu cpu-architecture

我只是在想,机器如何解释二进制代码?我所理解的是你的代码变成了 1 和 0,所以机器可以理解它们,但它们是怎么做到的?它只是二进制翻译的普通文本吗?

最佳答案

首先,“二进制”并不意味着你认为它的意思(计算机上的任何数据,包括文本已经是二进制的,只是我们决定显示和处理的方式不同)。

其次,编译不是对有趣字符的简单转换(如果是这样,我们就不需要为不同的语言使用不同的编译器)。要真正了解机器代码,您需要了解它所针对的架构。有许多计算机架构,您的 PC 只是其中之一。这是一个非常广泛的主题,需要对计算机体系结构有深刻的理解才能掌握。

我将展示一个 MIPS 指令的例子。如果您有兴趣,可以继续阅读并获得有关该主题的一些实际知识,请尝试我帖子末尾的链接。

MIPS 是一门流行的介绍性主题,因为它的指令格式是更容易理解的格式之一。 MIPS 指令为 32 位宽。 MIPS中有3种指令:“R”、“I”和“J”。我们将看一看“I”指令。

当处理器收到一条指令(32 位数据)时,它会读取它并决定如何处理它。 “我”指令看起来像这样:

|------|-----|-----|----------------|
 opcode   rs    rt    immediate
   6      5     5     16               (the numbers show how wide are each part)

这些的含义:
  • 操作码 告诉这是哪种指令(例如:加法、减法、乘法和许多其他指令)。所有指令(包括“R”和“J”类型)都以 6 位操作码开头,这就是处理器知道它是哪种类型的方式。
  • rs rt 是寄存器,处理器中的一种存储器,可以保存 32 位值。 MIPS 有 32 个,它们由它们的编号标识。这与内存不同,它在 CPU 内部。
  • 立即是一个数字。之所以这样称呼是因为数字在指令中“就在那里”,而不是在寄存器或内存中。

  • 将立即数添加到存储在寄存器中的数字的具体示例:
    001000 00001 00010 0000000000000011
    

    在这个例子中,我把指令分解成上面的部分。值的含义如下:
  • 操作码 :001000意味着 addi或“立即添加”。
  • rs :000011十进制,所以这部分指令告诉处理器我们要使用寄存器 1 作为 rs .
  • rd :000102十进制,与 rs 相同的想法。
  • 立即 :00000000000000113十进制。
  • addi指令的工作方式如下:它采用在 中找到的值rs 并添加 立即对它的值(value)。之后它将结果放入 rd .所以,当指令完成后, rd 将包含 3+2=5。

    简而言之,编译器解析您的文本并向目标处理器生成指令,这些指令执行您打算对程序执行的相同操作。如您所见,我们程序员编写的程序的文本表示与可运行的机器代码之间存在巨大差距。

    关于 MIPS 和计算机体系结构的一些有用资源:
  • Video lecture on computer architecture
  • How instruction decoding works inside a MIPS processor
  • Computer organization and design
  • MARS允许你玩 MIPS 机器码
  • 关于compiler-construction - 机器如何解释二进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9547090/

    相关文章:

    php - 如何构建在线 Objective-C 编译器

    SQL - 从 '1' s 的位置查找二进制表示

    c++ - 工具链如何与操作系统和平台架构相关

    windows - C/C++程序中怎么会有静态地址?

    c# - .NET 乘法优化

    compiler-construction - LLVM 无操作指令?

    oop - 为什么几乎所有的面向对象语言都编译为字节码?

    javascript - 在 JavaScript 中将二进制字符串压缩/解压缩为十六进制不起作用

    c# - 如何在 C# 中显示来自 SAP RFC 的 pdf

    caching - 什么是缓存标签目录?