二进制如何转换为硬件?

时间:2009-10-05 03:39:00

标签: assembly binary runtime operating-system

我理解如何将代码编译为程序集,并且该程序集是使用二进制代码的1:1替换。有人可以帮我理解二进制文件如何连接到硬件?二进制文件如何物理读取和运行? if语句如何在硬件中起作用?

来自google searches我在想,也许我的问题标题应该是“如何将二进制数据放在公交线路上”,但我不确定。

感谢。

14 个答案:

答案 0 :(得分:20)

我认为这实际上是一个有趣的问题。我会说“这里是如何通过几个简单的步骤构建计算机”。

  • 从一些简单的逻辑电路开始,例如AND,OR,NOT和触发器。触发器是一对晶体管,如果一个是ON,另一个是OFF,反之亦然。这样它就可以“记住”一点信息,因此您可以将其视为存储单个二进制数字。某些输入行可以将其置于一种状态或另一种状态,从而“写入”它。

  • 您可以通过使用一堆触发器来存储更大的数字,并将其称为“寄存器”。例如,如果寄存器中有四个触发器,则有16种可能的组合,因此您可以将其视为保持0到15之间的数字。

  • 稍微向前跳过,你可以买一个“内存芯片”。这是多少个寄存器,比如16个寄存器。它有4条线(“地址”线),它有4根线(“数据”线)。因此,0到15之间的数字可以作为地址输入,并选择16个寄存器中的一个,其值显示在输出数据线上(因此“读取”它)。另外几根导线可能导致数据在数据线上进入,导致数字被放入(“写入”)寄存器。

  • 现在假设您有一个外部4位寄存器(称之为R)和一些电路,以便它

    1. 将R中的值显示给内存地址
    2. 读取该寄存器的4位值并将其移至R
    3. 并反复重复

根据已预先加载到内存中的数字,您可以看到此内容将通过一系列数字地址循环,因为每个地址的数字决定下一个地址将是什么。

现在,你可以通过很多方式修饰这个东西。您可以将内存扩展为具有5位地址(32个寄存器)。然后,如果其中一个地址线连接到外部世界,它将根据外部世界做不同的事情。这是一个“有限状态机”。

您可以用简单的计数器替换R寄存器,并将其称为“程序计数器”。您可以从存储器中获取数据并将其称为“指令”,并使用其中的一些位来读取其他存储器地址并加载一组算术寄存器。您可以使用一些来控制R寄存器是否增加,或者可能获得存储在其中的新地址。那被称为“跳跃”。

当然,这是一台非常简单的计算机,但这大致就是它们的开始。

答案 1 :(得分:9)

对你的问题的完整答案将涵盖一本书,而且相当厚实。

当你说“代码”时,我假设你指的是高级编译语言,比如C ++。通常,编译器会将此代码转换为机器语言,或者您在问题中声明的二进制文件。我们将整齐地避免所有关于托管代码和非托管代码,p代码等的讨论。也就是说,我们只讨论针对特定处理器/操作系统的编译器。例如,Java编译成一个称为字节码的伪代码。我们还将避免链接编辑或链接的全部问题,即多个源模块如何编译成机器语言然后绑定到一个可执行程序中。

好的,既然我们已经涵盖了大部分我们不会涵盖的内容,那么通常会发生这种情况。而“通常”,我指的是DOS,Linux或Windows环境中的大多数编译语言。源代码被翻译成机器语言,写入可执行文件。该可执行文件或多或少地包含程序在内存中应该是什么样子的图像。当您告诉操作系统运行程序时,执行操作系统相当于“加载和运行”。这意味着可执行文件中的内存映像被加载到内存中,然后操作系统对程序中的第一条指令执行机器语言JUMP。然后,CPU盲目地遵循其上的指令,直到遇到EXIT。

这整个JUMP ...... EXIT nastiness是对现代操作系统的过度简化。正如你可以想象的那样,如果CPU遵循盲目服从,程序中的指令误入歧途,计算机就会崩溃......或者更糟。这是早期许多错误计划的命运,也是许多BSOD的主要贡献者。

答案 2 :(得分:4)

这是一个庞大而复杂的话题。我在这个主题上看过的最好的教科书是Patterson/Hennesy's "Computer Organization and Design",它有很多版本。

除了建议您阅读之外,我不敢尝试将一学期课程填入500个字符的答案框中。

答案 3 :(得分:4)

有一本名为“代码”的代码可以覆盖该代码以及任何计算机组织文本。这里的答案都很好。

答案 4 :(得分:3)

我不认为这是巨大而复杂的,越接近硬件就越简单。

写一个反汇编程序,这就是硬件是如何做到的。大多数处理器在与汇编语言相同的手册中包含操作码或指令集。

请看操作码是否使用寄存器说​​一个add指令,一些位确定源寄存器,一些位用于目标寄存器,一些位表示这是一个add指令。假设您正在查看的这个指令集仅使用两个寄存器来进行基于寄存器的添加。有一些逻辑,一个加法器,可以添加两个寄存器大小的项目,并输出一个结果和一个进位。寄存器存储在芯片上的存储器位中,有时称为触发器。因此,当解码添加时,输入寄存器使用电子开关连接到添加逻辑。这些天发生在时钟周期的开始,到时钟周期结束时,加法器有结果,输出被路由到目标寄存器的位,并捕获答案。通常,add会修改标志寄存器中的标志。当结果太大而无法存储在寄存器中时(考虑一下当你添加十进制数字9和1时会发生什么,你得到一个0携带1对吧?)。有一些逻辑会查看加法器的输出,并将这些位与设置或清除标志寄存器中的z标志的零值进行比较。另一个标志位是符号位或n位为负,这是答案中最重要的位。这一切都是并行完成的。

然后说你的下一条指令是跳零(跳跃,如果相等),逻辑看z标志。如果置位则接收的下一条指令基于指令中通过相同或另一个加法器添加到程序计数器的位。或者,指令中的位可能指向内存中保存程序计数器新值的地址。或者条件可能是假的,那么程序计数器仍然通过加法器运行,但添加到它的是指令的大小,以便它获取下一条指令。

从反汇编程序到模拟器的延伸时间不长。您为每个寄存器创建变量,解码指令,执行指令,继续。内存是您读取或写入的数组。反汇编程序是您的解码步骤。模拟器执行与硬件相同的步骤,硬件使用不同的编程技巧和不同的编程语言并行执行。

根据反汇编程序在程序开始时的实现方式以及反汇编到结尾的方式,您的模拟器将从头开始,但遵循代码执行,但不一定要开始结束。

像MAME这样的旧游戏机模拟器有你可以看到的处理器模拟器。不幸的是,esp与MAME,代码是为执行速度而设计的,而不是可读性,大多数都是完全不可读的。如果你看的话,那里有一些可读的模拟器。

一位朋友在本书中http://www1.idc.ac.il/tecs/向我指出了我想阅读的内容,但还没有。也许这只是你要找的那本书。

当然,硬件已经从琐碎的状态机演变而来,这些状态机需要很多时钟才能获取,解码和串行执行。我的猜测是,如果你只是理解经典的提取,解码和执行就足够了解这个问题。那么你可能有其他更具体的问题,或者我误解了这个问题你真的想了解内存总线而不是解码器。

答案 5 :(得分:1)

这看起来像是“计算机如何工作”的问题,但您不太可能对从Google获得的答案感到满意。

二进制文件如何“连接”到硬件的细节实际上是基本级别的计算机设计的主题。一些硬件设计知识对程序员非常有用,但并非严格必要。

到目前为止,答案是“大大简化”,因为它们必须是。

一般来说,解释只会 对了解主题的人有意义。我认为我们无能为力。

编辑:也许我们可以说最好的是二进制数中的位(零和1)直接对应于硬件中的电路,因为电路可以配置为“存储”一点值,这些位可由电路操纵。

也就是说,它们可以存储,计数,添加(以及所有其他基本算术函数),输出和输入组成整数。

简而言之,二进制数中的位对应于硬件中的晶体管。正如其他人所说的那样,这是一个巨大的简化。它经常需要不止一个晶体管来处理,但这取决于硬件设计师的聪明才智。

答案 6 :(得分:1)

当我们查看二进制或编程语言时,我们正在研究人类可以理解的符号和单词,这些符号和单词基本上描述了电子系统的电活动。最终,能量的速度,能量的量,能量的损失,热量和光的产生,以及能量流过的物质由于被激励而经历的变化以及它如何影响能量的活动。因为它流动是由人类理解并且用一块电子设备操纵或利用。理解作为计算机或其他设备的复杂系统的一个因素是知道其内部流动的电流在做什么。为了解这一点,我们使用数字1和0描述了电力行为之一。您必须知道物理元素正在做什么,并能够对其进行标准描述,以便跟踪在更改因素时发生的情况。您认为有助于控制元素/物质/亚原子粒子,这些数字可以帮助您合理化您无法看到的粒子所发生的事情。

所以Binary是一种视觉表示,它使用数字来描述硬件中的电活动。要么他们是充电流,要么他们没有充电流。电荷从AC转换为D / C,带电粒子的活动由时钟,流过电路的能量速度,电阻(导致能量损失和热量产生,以及一段电路断电之前的时间全部汇集在一起​​,使我们能够理解并利用我们对这些现象的理解来提出一个度量单位来标准化每单位时间内的能量流量。当我们试图利用能量时,我们会进一步帮助我们。其余的计算机组件就像一个真正先进的晶体管,电容器和电阻器系统,它们控制流向和流经这些组件的电荷,这些组件暂时或缓慢地捕获电荷直到组件达到一定的能量水平然后发生电弧闪光,导致存储的能量以特定(高度控制)的量e激励系统的另一个组件或区域NERGY。二进制的每个数字是一个比特的表示,一个比特是某个电子部件中的电气行为的解释(从这里称为信号),一个字节是8个电信号。一般认为您需要至少8位电信号才能使计算机有序和实际地使用流入其中的电力。

换句话说,电力只是减少了,能量在其行为中得到了稳定,然后通过一系列需要电力运行的部件进行分离和引导,然后新通电的部件做了人类希望它做的事情。

答案 7 :(得分:0)

(非常简化)

二进制文件(比如一行机器码/ asm中的二进制字符串)从磁盘加载到内存中。然后,处理器逻辑将指令发送到存储器控制器,以将存储器的内容加载到处理器本地寄存器中。然后它被解释为处理器要执行的指令。

我通过在大学进行微编码来学习这一级别的东西。

实际上,根据处理器的复杂性和功耗,可能会出现更多步骤。处理器由各种部分(ALU,寄存器等)组成,它们协作获取指令,数据和处理。如果你对这个层次的理解感兴趣,我推荐你提出这个问题,我想说得到一本关于计算机体系结构的书。我在大学时使用了Tanenbaum的Structure Computer Organisation

答案 8 :(得分:0)

基本上,从广义上讲,指令最终存储在存储器中,程序计数器(PC)寄存器保存第一条指令的地址。

处理器支持加载可以将数据移入/移出存储器到寄存器的指令。处理器将数据移入指令寄存器,该指令在下一个时钟周期执行。

我没有资格解释背后的电气工程,但你可以查一查。

当然,这一切都相当简单,因为现代处理器中存在大量的并行性,我甚至不假装以任何有意义的方式解决这个问题。

答案 9 :(得分:0)

您可以找到感兴趣的链接: http://www.eskimo.com/~ddf/Theory/Micro_Fund/Commands/AssyLnge.html

在简短的解释中,通常应用程序将被加载到内存中的某个区域,处理器将被赋予主要或起始部分的起始地址。

处理器可以做两件事,它可以操作数据和移动数据,因此它将使用称为寄存器的微处理器上的特殊部分来存储它所需的值或位置。

因此,对于if语句,有一个命令,指出两个值是否相等以及它们不在哪里(如果不相等则为branch)。还会有一些其他的,例如相等的分支或大于的分支。

这些将在集会中。

使用适当的参数将命令放入寄存器,并在下一个时钟周期计算。

这是非常简化的,但在很大程度上,您在汇编中看到的是微处理器将看到的内容。

进入更多细节可能超出了StackOverflow的范围。

答案 10 :(得分:0)

以非常简单的方式,计算机可以表示为无限循环(在硬件中实现)和执行简单算术运算的能力(也在硬件中实现)。在循环中,它执行以下操作:

  • 在PC上读取内存(PC是增加的循环计数器)
  • 解码命令和操作数
  • 执行命令
  • 将结果写回内存

就是这样。还有一些控制命令可以改变PC,哪些用于“if ... then ... else”语句。

答案 11 :(得分:0)

这个问题非常复杂,我确实有2度,而且我仍然只是表面上看。

如果你想介绍一起如何协同工作,麻省理工学院有一些免费的课程,你可以在网上查看。 This一个可能是最适合你入门的人。

答案 12 :(得分:0)

SW不仅仅是它所写的SW语言,就像在一张纸上记下来的那样。 SW也采用物理形式。在某些时候,概念级别的软件在物理层面上交叉进入软件,当程序员开始在他/她正在使用的任何SW语言的键盘中键入代码时就会发生这种情况。从点击击键的那一刻开始,电子就一直向下......这就是接口发生的那一点,从敲击键盘的那一刻开始,整个业务变成了对电子的操纵 - 复杂,这可能是一种复杂而巧妙的努力。用二进制0和1来思考只是对高和低的隐喻。低电压,已经超出击键的物理表现。当你输入字母I作为IF的第一个字母...那么进入键盘时,对应于01001001的电压被放置在注册表的前8个插槽中,通过物理点击I键提示的电脉冲。从这里开始它的电子产品。

答案 13 :(得分:0)

您在文本编辑器上编写的所有内容,首先,无论在哪个代码(ascii,...)中,它都存储在内存中(从键盘生成的电子信号)。从内存中,这些信号被送入计算机显示器,您可以看到您输入的源代码。然后,运行编译器(或汇编程序),读取内存中的源代码(电子信号)并将其转换为机器代码,将转换后的电信号存储在存储器的另一个区域(再次发出电信号)。当cpu读取机器代码时,它看到的是电信号。没有逻辑电平,因此无需在电压电平中转换逻辑电平。