二进制如何转换为硬件?

Posted

技术标签:

【中文标题】二进制如何转换为硬件?【英文标题】:How does binary translate to hardware? 【发布时间】:2010-12-03 20:11:51 【问题描述】:

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

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

谢谢。

【问题讨论】:

有涵盖该主题的完整课程。当我在我的 EE 研究中学习微处理器时,我们设计了一个 8 位处理器,但要完成 14 周的笔记。因此,如果您真的想了解,最好的选择是参加 EE 课程,这意味着您必须首先掌握逻辑设计,因为其中大量使用了多路复用器。而现在,使用流水线,它变得更加复杂。要了解您需要参加计算机体系结构课程。 这个主题的一个小方面的答案——“二进制数据是如何放在总线上的”——可以在 Ulrich Drepper 的论文中找到:people.redhat.com/drepper/cpumemory.pdf “二进制代码”是一个比您要问的更广泛的话题;相反,请尝试搜索“机器语言”。将程序集编译成机器代码不一定是 1:1 的过程,即使没有优化。 虽然 CS 课程主要使用 Patterson 和 Hennessy 的计算机组织和设计,但我强烈建议您学习计算系统元素。所有的答案都在里面! 相关How does an assembly instruction turn into voltage changes on the CPU? 【参考方案1】:

(大大简化)

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

我在大学时通过微编码学到了这种水平的东西。

实际上,可能会发生更多步骤,具体取决于处理器的复杂性和功率。处理器由各个部分(ALU、寄存器等)组成,它们在获取指令、数据和处理方面相互协作。如果您对这种理解水平感兴趣并且我建议您提出这个问题,我会说买一本关于计算机体系结构的书。我在大学时使用了 Tanenbaum 的 Structure Computer Organisation。

【讨论】:

谢谢,但我现在正在寻找未简化的 :) 那么很大程度上取决于处理器架构。【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

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

简而言之,通常应用程序将被加载到内存中的某个区域,并且处理器将被赋予起始地址,用于主要或起始部分。

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

因此,对于 if 语句,有一个命令用于判断两个值是否相等以及如果不相等则去哪里(如果不相等则分支)。还有一些其他的,例如等于或大于的分支。

这些将在程序集中。

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

这很简单,但很大程度上,你在汇编中看到的就是微处理器看到的。

更详细的内容可能超出了 *** 的范围。

【讨论】:

【参考方案4】:

您的问题的完整答案将包括一本书,而且是一本相当厚的书。

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

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

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

【讨论】:

965 页,确实是一本厚书。 =)【参考方案5】:

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

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

【讨论】:

【参考方案6】:

这似乎是一个“计算机如何工作”的问题,但您可能不会对您从 Google 获得的答案感到满意。

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

到目前为止,答案都“非常简单”,因为它们必须如此。

一般来说,这些解释对理解该主题的人有意义。我认为我们对此无能为力。

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

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

简而言之,二进制数中的位对应于硬件中的晶体管。正如其他人所说,这是一个巨大的简化。处理一个比特通常需要多个晶体管,但这取决于硬件设计者的聪明才智。

【讨论】:

【参考方案7】:

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

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

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

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

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

根据您的反汇编程序可能从程序开头开始并反汇编到最后的实现方式,您的模拟器将从头开始但遵循不一定从头到尾的代码执行。

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

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

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

【讨论】:

该书链接指向一个视频,该视频描述了一个完整的基于堆栈的虚拟机,具有非常完整的 alu,全部从零开始指令获取/解码。【参考方案8】:

有一本名为 code 的书,其中包含任何计算机组织文本。虽然这里的答案都很好。

【讨论】:

它被称为代码:计算机硬件和软件的隐藏语言,作者 Charles Petzold。 amazon.com/Code-Language-Computer-Hardware-Software/dp/…【参考方案9】:

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

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

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

【讨论】:

【参考方案10】:

这个问题很复杂,我的准确度是2度,我还只是触及了表面。

如果您想了解所有这些如何协同工作,麻省理工学院提供一些免费课程,您可以在线查看。 This 可能是您入门的最佳选择。

【讨论】:

【参考方案11】:

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

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

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

稍微往前走,你可以买一个“内存芯片”。那是大量的寄存器,比如其中的 16 个。它有 4 根线进入(“地址”线),并且有 4 根线出来(“数据”线)。因此,从 0 到 15 的数字可以作为地址输入,并选择 16 个寄存器中的一个,其值显示在输出数据线上(因此“读取”它)。另外几根线可能会导致数据从数据线上进入,从而导致将数字放入(“写入”)寄存器。

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

    将 R 中的值呈现给内存地址 读取该寄存器的 4 位值并将其移至 R 并一遍又一遍地重复此操作

根据已经预加载到内存中的数字,你可以看到这个东西会循环遍历一系列数字地址,因为每个地址的数字决定了下一个地址是什么。

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

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

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

【讨论】:

你会推荐什么关于这个主题的书?我的意思是,从硬件本身(就像你在这里所做的那样),晶体管的工作原理等等。我知道在 EE 课程中他们必须教这个,但我找不到从那个低层次开始的书。 =) @RafaelDiasdaSilva:对我来说已经很久了,但除了基本的电子学之外,我喜欢 Mead 和 Conway、Addison Wesley 的“超大规模集成电路系统简介”,尽管它已经过去了 3 年老的。它们从基本的晶体管一直到 CPU 和内存,特别是在芯片上。【参考方案12】:

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

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

所以二进制是一种视觉表示,它使用数字来描述硬件中的电活动。它们要么是电荷流,要么不是电荷流。电荷从交流电转换为直流电,带电粒子的活动由时钟、流经电路的能量速度、电阻(导致能量损失和产生热量,以及一段电路断电之前的时间总量使我们能够理解并利用我们对这些现象的理解来提出一个度量单位来标准化每单位时间流动的能量量。当我们试图利用能量时,进一步帮助我们。计算机的其余组件就像一个非常先进的晶体管系统,电容器,以及操纵流经这些组件的电荷的电阻器,这些组件暂时或缓慢地捕获电荷它下降,直到组件达到一定的能量水平,然后发生电弧闪光,导致存储的能量以特定(高度控制)量的 e 为系统的另一个组件或区域供电精力充沛。二进制的每个数字是一个位的表示,一个位是对某个电气组件中的电气行为的解释(从这里称为信号),一个字节是8个电信号。人们普遍认为,您至少需要 8 位电信号,计算机才能有序和实际地使用流入其中的电流。

换句话说,电力只是被还原,能量在其行为中稳定下来,然后分裂并引导通过一系列需要电力才能运行的组件,然后新通电的组件会做人类希望做的事情。

【讨论】:

我不确定这是否能回答问题(“if 语句如何在硬件中工作”)。这些问题与 CPU 架构更相关,即指令获取、CPU 流水线等......

以上是关于二进制如何转换为硬件?的主要内容,如果未能解决你的问题,请参考以下文章

Java基础笔记 进制与进制转换

在C语言中如何将10进制转换成16进制?

1. 硬件基本认知 ; 进制转换 2019-10-27

在LINUX 系统下如何将二进制转换成ASCII码?

在Excel中如何将十进制转换成二进制

Erlang - 如何将 \u0000 字符转换为二进制?