2009-10-05 186 views
21

我知道如何将代码编译为程序集,并且该程序集是用二进制代码替代1:1。有人能帮我理解二进制与硬件的连接方式吗?二进制文件如何进行物理读取和运行? if语句如何在硬件中工作?二进制如何转换为硬件?

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

谢谢。

+2

有涵盖此主题的整个课程。当我在EE研究中使用微处理器时,我们设计了一个8位处理器,但是完成了14周的笔记。所以,如果你真的想明白的话,你最好的选择是参加EE课程,这意味着你必须首先掌握逻辑设计,因为多路复用器在这方面有很多用处。而现在,流水线变得更加复杂。要了解您需要参加计算机体系结构课程。 – 2009-10-05 03:56:15

+3

在Ulrich Drepper的论文中可以找到关于这个话题的一个小方面 - “二进制数据如何放在公交线路上”的答案:http://people.redhat.com/drepper/cpumemory。 pdf – Crashworks 2009-10-05 04:24:07

+1

“二进制代码”是一个比你所问的更广泛的话题;相反,尝试搜索“机器语言”。将程序集编译为机器码不一定是1:1的过程,即使没有优化。 – outis 2010-01-15 04:19:05

回答

0

(大大简化)

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

我在大学里通过微码学习了解了这个级别的东西。

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

+0

谢谢,但我现在正在寻找非简化:) – 2009-10-05 03:50:29

+0

然后非常依赖于处理器架构。 – 2009-10-05 03:51:58

0

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

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

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

当然,这一切都相当简化,因为在现代处理器中存在大量的并行性,我甚至不会假装以任何有意义的方式来讨论它。

0

您可能会发现感兴趣的链接: http://www.eskimo.com/~ddf/Theory/Micro_Fund/Commands/AssyLnge.html

在一个简短的说明,一般的应用程序将被加载到一些地区在内存和处理器将给予起始地址,主或开始部分。

处理器可以做两件事情,它可以处理数据和移动数据,所以它会在微处理器上使用称为寄存器的特殊部件来存储它需要的值或位置。

因此,对于if语句,有一条命令用于两个值是否相等,如果不相等则返回到哪里(分支如果不相等)。还会有一些其他的,如平分支或大分支。

这些将在组装中。

这些命令被放入寄存器,并带有适当的参数,它将在下一个时钟周期计算。

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

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

9

对您的问题的完整答案将包括一本书,并在那个相当厚的一本书。

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

好的,现在我们已经介绍了大部分我们不会涵盖的内容,这里通常会发生。而通过“通常”,我的意思是大多数编译语言在DOS,Linux或Windows环境中。源代码被翻译成机器语言,写入可执行文件。这个可执行文件或多或少地包含程序在内存中应该看起来像什么的图像。当您告诉操作系统运行您的程序时,操作系统等同于“加载并执行”。这意味着将可执行文件中的内存映像加载到内存中,然后操作系统执行程序中第一条指令的机器语言JUMP。 CPU然后盲从其上的指令,直到遇到EXIT。

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

+1

在965页,确实是一本厚厚的书。 =) – Crashworks 2009-10-05 03:55:17

1

这似乎是一个'电脑如何工作'的问题,但您不太可能从Google获得的答案中满意。

二进制与硬件“连接”的细节实际上是计算机设计的基本层面的主题。硬件设计的一些知识对程序员非常有用,但不是绝对必要的。

到目前为止,答案是'非常简化',因为它们必须是。

一般而言,只有的解释对理解该主题的人有意义。我不认为我们可以做很多事情。

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

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

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

3

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

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

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

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

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

根据您的反汇编程序在程序开始时如何实现并反汇编到最后,您的模拟器将从开始处开始,但遵循不一定开始结束的代码执行。

像MAME这样的旧游戏机模拟器有处理器模拟器,你可以看看。不幸的是,特别是MAME,代码被设计为执行速度不可读,大多数是完全不可读的。如果你看,虽然有一些可读的模拟器。

一位朋友指着我这本书http://www1.idc.ac.il/tecs/我想读,但还没有。也许这只是你正在寻找的书。

当然,硬件已经从一些微不足道的状态机发展而来,这些状态机需要很多时钟来串行读取,解码和执行。我的猜测是,如果你只是理解经典取指,解码和执行就足以解决这个问题。那么你可能有其他更具体的问题,或者我误解了这个问题,你真的想了解内存总线而不是解码器。

+1

该书链接导致了一个视频描述了一个完整的基于栈的vm,它具有非常完整的alu,全部从零开始 - 取指令/解码。 – 2009-10-24 07:02:05

4

有一本名为代码的书以及任何计算机组织文本。这里的答案都很好。

+2

Charles Petzold称之为“计算机硬件和软件的隐藏语言”。 http://www.amazon.com/Code-Language-Computer-Hardware-Software/dp/0735611319 – 2009-10-05 07:59:52

0

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

  • 在PC读存储器(PC是被递增循环计数器)
  • 解码的命令和操作数
  • 执行命令
  • 写回结果到内存

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

0

这个问题非常复杂,我有2度的精确度,我仍然只是表面。

如果你想介绍一下所有的工作,麻省理工学院有一些免费的课程,你可以在网上查看。 This一个可能是最好的一个让你开始。

20

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

  • 从一些简单的逻辑电路开始,如AND,OR,NOT和一个触发器。触发器是一对晶体管,如果一个接通,另一个断开,反之亦然。这样它就可以“记住”一点信息,所以你可以把它看作是存储一个二进制数字。一些输入行可以把它放在一个状态或另一个状态,从而“写入”它。

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

  • 跳过一点点,您可以购买“内存芯片”。这是一个很好的寄存器,就像其中的16个寄存器一样。它有4根导线(“地址”导线),它有4根导线(“数据”导线)。因此0到15之间的数字可以作为地址进入,并且选择16个寄存器中的一个,其值在输出数据线上呈现(从而“读取”它)。另外几条导线可能会导致数据在数据线上进入IN,导致数字被放入(“写入”)寄存器。

  • 现在假设有一个外部的4位寄存器(称之为R),和一比特的电路,使得其

    1. 呈现中的R到存储器地址的值
    2. 读取在该寄存器和4位值移动它成R
    3. 又一遍地重复此和超过

根据吨他已经预先加载到内存中的数字,你可以看到这个事情将通过一系列的数字地址循环,因为每个地址的数字决定了下一个地址是什么。

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

您可以用一个简单的计数器替换R寄存器,并将其称为“程序计数器”。您可以将数据从内存中取出并称为“指令”,并使用其中的一些位来读取其他内存地址并加载一组计算寄存器。您可以使用一些来控制R寄存器是简单增量还是获取存储在其中的新地址。这就是所谓的“跳跃”。

当然,这是一台非常简单的电脑,但这大概是他们开始的。

+0

你会就这个问题推荐什么书?我的意思是,从硬件本身(就像你在这里做的那样),晶体管如何工作等等。我知道在EE课程中他们必须教这个,但是我找不到从低级开始的书。=) – 2017-04-20 20:56:26

+1

@RafaelDiasdaSilva:对我来说已经很长时间了,但除了基础电子设备之外,我喜欢由Mead和Conway,Addison Wesley提供的“VLSI系统介绍”,尽管它已经有30年的历史了。他们从基本的晶体管一直到CPU和内存,特别是芯片上。 – 2017-04-21 15:12:40

0

软件不仅仅是它写入的SW语言,正如在一张纸上写下的那样。 SW也采取物理形式。在某种程度上,概念层面的软件在物理层面交叉到软件中,当程序员开始在他/她工作的任何SW语言中键入代码到键盘时发生。从击键开始的那一刻起,它就是电子一路下来......这就是接口出现的地方,因为从敲键盘的那一刻起,整个业务就成了电子的操纵 - 复杂的,复杂和巧妙的努力,因为这可能是。在二进制0和1的意义上来看,这只是一个暗示低电压的隐喻,它已经是一个超越击键的物理表现。当您将字母I作为IF ... THEN的第一个字母键入到键盘中时,通过您实际点击I键提示的电脉冲,将对应于01001001的电压放置在注册表的前8个插槽中。从这里出来它是电子产品。

0

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

1

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

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

换句话说,电力只是减少,能量稳定在其行为,然后分裂并指导通过一系列需要电力运行的组件,然后新通电的组件做一件事情,人类希望它做。

+0

我不确定这是否回答了问题(“if语句在硬件中如何工作”)。这些问题与CPU体系结构有关,例如取指令,CPU管线等等。 – 2018-01-18 20:20:33