【发布时间】:2012-03-21 18:29:27
【问题描述】:
我只是在想,机器如何解释二进制代码?我所了解的是您的代码变成了 1 和 0,因此机器可以理解它们,但它们是如何做到的呢?只是普通文本到二进制翻译吗?
【问题讨论】:
标签: compiler-construction binary operating-system cpu cpu-architecture
我只是在想,机器如何解释二进制代码?我所了解的是您的代码变成了 1 和 0,因此机器可以理解它们,但它们是如何做到的呢?只是普通文本到二进制翻译吗?
【问题讨论】:
标签: compiler-construction binary operating-system cpu cpu-architecture
首先,“二进制”并不意味着您认为的意思(计算机上的任何数据,包括文本,都已经是二进制的,只是我们决定显示和处理的方式不同)。
其次,编译不是对有趣字符的简单转换(如果是,我们就不需要针对不同语言使用不同的编译器)。要真正了解机器代码,您需要了解它所针对的体系结构。有许多计算机体系结构,您的 PC 只是其中之一。这是一个非常广泛的学科,需要对计算机体系结构有深刻的理解才能掌握。
我将展示一个 MIPS 指令的示例。如果您有兴趣,可以继续阅读并获得有关该主题的一些实际知识,请尝试我帖子末尾的链接。
MIPS 是一个受欢迎的介绍性主题,因为它的指令格式是最容易理解的一种。 MIPS 指令是 32 位宽的。 MIPS中有3种指令:“R”、“I”和“J”。我们来看看“I”指令。
当处理器收到一条指令(32 位数据)时,它会读取它并决定如何处理它。 “I”指令如下所示:
|------|-----|-----|----------------|
opcode rs rt immediate
6 5 5 16 (the numbers show how wide are each part)
这些的含义:
将立即数添加到存储在寄存器中的数字的具体示例:
001000 00001 00010 0000000000000011
在这个例子中,我把指令分解成上面的部分。值的含义如下:
001000 表示addi 或“添加立即数”。00001 是十进制的1,所以这部分指令告诉处理器我们想使用寄存器 1 作为 rs。00010 是十进制的2,与 rs 相同。0000000000000011 是十进制的3。 addi 指令的工作方式如下:它获取 rs 中的值并将 immediate 值添加到其中。之后,它将结果放入 rd。因此,当指令完成时,rd 将包含 3+2=5。
简而言之,编译器解析您的文本并生成指令给目标处理器,这些指令与您打算对程序执行的操作相同。如您所见,我们程序员编写的程序的文本表示与可运行的机器代码之间存在巨大差距。
一些关于 MIPS 和计算机架构的有用资源:
【讨论】:
这是一个很大的主题,你问的是什么。我会推荐一本优秀的书The elements of computing systems,以概述计算机和编译器的原则构造。这很容易上手,练习也很有趣。大部分内容都可以通过提供的链接在线获得。
This question 也有一些关于这个主题的好链接。
【讨论】:
这样想。您有 8 个电源开关,每个开关有关闭 (0) 或打开 (1)。计算机会将所有 8 个开关都视为 1。它现在很像密码锁。键盘上的每个符号都有它的组合。
【讨论】: