实际的机器代码在各个方面是啥样的? [关闭]

Posted

技术标签:

【中文标题】实际的机器代码在各个方面是啥样的? [关闭]【英文标题】:What does actual machine code look like at various points? [closed]实际的机器代码在各个方面是什么样的? [关闭] 【发布时间】:2012-05-06 16:17:46 【问题描述】:

对于机器码到底是什么似乎有很多意见。我听说有人说它是汇编、二进制或十六进制。

说机器代码本质上是特定处理器的一组指令是否正确?如果是这样,我想这些可以用二进制或十六进制表示法或汇编来表示。但是未翻译的“实际”机器代码是什么样的?是基于架构的字长吗?还是所有意图和目的的十六进制都是默认表示?

坐在硬盘上会是什么样子?坐在登记簿上时是什么样子的?在处理的时候怎么样,是不是只是那个时候的一组电压变化?

【问题讨论】:

它是二进制值,仅对特定处理器有意义。如果您愿意,您可以将其表示为十六进制,或者您碰巧喜欢的任何其他基数。无论您选择如何表示它,它都“看起来像”。 它不是汇编、二进制或十六进制,它们都是 :-) 它们都只是同一事物的表示。最终汇编和十六进制都映射到二进制。该二进制映射到 CPU 中一堆晶体管的状态。该状态可以表示要处理的指令,也可以表示要处理的数据。 零和一,仅此而已。十六进制和组装说明适用于人,而不是计算机。 我很感谢您的回复,但也许您可以回答而不是 cmets?这样我们就可以对您的答案进行投票和评论:) 它甚至不是零或一,它们是我们附加到物理状态的方便标签。宇宙法则不在乎我们使用什么作为标签。 :) 【参考方案1】:

机器代码只是对应于特定处理器架构的 CPU 指令的二进制数据。

我不会过多地讨论它是如何存储的,因为这取决于它的存储位置。例如,在磁盘上,它通常存储为一系列磁化区域。机器码在存储方面与其他二进制数据没有什么不同。如果您的问题更多关于数据如何存储在计算机上,您应该研究计算机中的各种数据存储设备,例如 HDD、RAM 和寄存器等。

可视化机器代码的存储方式最简单的方法是在十六进制编辑器中查看一些代码。这向您显示了由十六进制数字表示的二进制数据。以指令为例:

0xEB 0xFE

这很容易写成 1110101111111110 或 60414。这取决于您希望如何将二进制转换为人类可读的形式。

这条指令代表一个无限循环。 (这是假设它在 x86 CPU 上运行。其他 CPU 可以根据需要对其进行解释。)它可以像这样在汇编中编码:

j:
jmp j

当你运行汇编程序时,它会将上面的代码转换成上面的二进制机器码。

指令实际上是两部分。第一个是所谓的操作码,是0xEB。当这段代码进入 CPU 时,意味着: 从程序中读取一个字节,并跳过那么多字节的数据。然后 CPU 读取字节0xFE。由于它需要一个有符号整数,因此它将二进制数据解释为数字 -2。然后指令被读完,指令指针向前移动 2 个字节。然后执行该指令,使指令指针向前移动 -2 (0xFE) 个字节,这实际上将指令指针设置为与指令启动时相同的值。

我希望这能回答您的问题。如果您想了解 CPU 的内部工作原理,请阅读微码和电子逻辑门。基本上就是一堆电压差,比如1位代表5伏电荷,0位代表0位电荷。

【讨论】:

所以澄清一下,将机器码称为字节码更准确,而不是真正表示为二进制码。当然,一组位组成一个字节,但机器指令的最小原子大小实际上存在于字节级别? 在实践中,几乎总是如此,因为当前的技术旨在处理字节,而不是位。理论上,没有。例如,基于 Brainf*ck 语言的 CPU 可以有 3 位指令。 感谢 Kendall,很高兴了解数据抽象在您使用多位(通常是字节)指令之前不会开始。我想现在我说出来很明显,但这是一个启示。【参考方案2】:

为初学者解释

从一开始,计算机就有很多“开关”。例如,可以关闭或打开 LED 灯,只有 2 个选项(1=打开或 0=关闭)。如果您有 2 个 LED,您可以关闭 LED 1,2 打开,反之亦然,或者您可以同时打开或关闭它们。现在有更多的可能性。

您可以计算出有多少种不同的可能性。 1 盏灯 = 2^1 = 2 种可能性 2 盏灯 = 2^2 = 4 种可能性 8 盏灯 = 2^8 = 256 种可能性

所以计算机只读取零和一。 一台计算机有很多开关,具体取决于 CPU 容量。要告诉计算机激活灯,您需要在系统中添加 0 和 1,这将是一项非常艰巨的任务。为了避免这种情况,他们将可能性转换为十六进制数字。汇编只是一种计算机语言,它将您输入的字母转换为 0 和 1(二进制代码)并按照说明进行操作。

【讨论】:

【参考方案3】:

和我一样,您似乎对计算机如何在后台工作感到好奇。我的知识不足以很好地回答您的问题(无论如何这是一个很大的话题),但我强烈推荐 Steve Gibson 的“让我们设计一台计算机”播客系列。这是“机器语言”成绩单的摘录,让您了解一下。 . .

所有跳过的意思是,我们不是给程序计数器加一,而是加二,或者加一两次,这实际上是这些机器当时的工作方式。这只会让我们跳过一个跳跃。所以本质上这意味着我们可以分支到内存中我们想要的任何地方或继续前进,这给了我们,即使这很简单,也给了我们足够的权力让机器做出决定。我们有输入/输出;我们有数学;我们有能力将数据从内存中的一个位置传输到另一个位置。这些都是机器运行方式的基本要素。那是机器语言。

现在,置于其之上的一层人性就是所谓的“汇编语言”,它只不过是命名事物。例如,您为不同的指令创建了一种所谓的助记符。因此,例如,加载累加器将是 LDA。存储累加器 STA。您希望它们简短,因为您将经常输入它们。请记住,您最终会使用大量的小指令来完成某件事。然后,汇编语言唯一真正做的另一件事是,它允许您命名内存中的位置。

因此,例如,您可能会说 LDA,表示负载累加器,当前分数。当前分数只是指一个,本质上就像一个变量,内存中您标记为“当前分数”的位置。然后,如果您进行 STA,存储累加器,新分数,那么它会首先将当前分数加载到累加器中,然后将其存储到称为新分数的不同位置。所以我们真正谈论的就是一些简单的缩写,用于帮助记住和使用这些单独的指令和方便的标签来标记内存中的位置,这样你就不必记住,哦,那是在位置 329627。我的意思是,谁能做到?因此,您只需使用英语、某种字母数字短语来标记该位置,然后通过该短语而不是其实际数字来引用该位置。

事实上你并不关心这个数字是多少。那就是汇编程序将为您做的一件事就是您只是说我需要称为这些东西的内存。它担心他们去哪里,因为只要他们一直被提及,这对你来说并不重要。这就是整个过程。那是机器语言和汇编语言。 50 年前就是这样,现在也差不多这样。

。 .但他比这更进一步,从晶体管和逻辑门开始。据我所知,这是完整的系列(听众在 wiki 中提供了有用的图表):

让我们设计一台计算机:晶体管、逻辑门(Security Now 233, 42:00)http://www.grc.com/sn/sn-233.htm 和 http://wiki.twit.tv/wiki/Security_Now_233 机器语言(Security Now 235, 46:00)http://www.grc.com/sn/sn-235.htm 和 http://wiki.twit.tv/wiki/Security_Now_235 听众反馈(Security Now 236, 51:43)http://www.grc.com/sn/sn-236.htm 和 http://wiki.twit.tv/wiki/Security_Now_236 间接:指针的力量(安全现在 237, 27:45)http://www.grc.com/sn/sn-237.htm 和 http://wiki.twit.tv/wiki/Security_Now_237 听众反馈(Security Now 238, 40:28)http://www.grc.com/sn/sn-238.htm 和 http://wiki.twit.tv/wiki/Security_Now_238 堆栈、寄存器和递归(Security Now 239, 1:01:00)http://www.grc.com/sn/sn-239.htm 和 http://wiki.twit.tv/wiki/Security_Now_239 听众反馈(Security Now 240 48:16, 1:01:21)http://www.grc.com/sn/sn-240.htm 和 http://wiki.twit.tv/wiki/Security_Now_240 硬件中断(Security Now 241, 42:25)http://www.grc.com/sn/sn-241.htm 和 http://wiki.twit.tv/wiki/Security_Now_241 听众反馈(Security Now 242, 59:27)http://www.grc.com/sn/sn-242.htm 和 http://wiki.twit.tv/wiki/Security_Now_242 Multiverse:多线程、多任务、多处理、多核(Security Now 247, 47:15)http://www.grc.com/sn/sn-247.htm 和 http://wiki.twit.tv/wiki/Security_Now_247 听众反馈(Security Now 249, 1:30:21)http://www.grc.com/sn/sn-249.htm 和 http://wiki.twit.tv/wiki/Security_Now_249 操作系统(Security Now 250, 43:22)http://www.grc.com/sn/sn-250.htm 和 http://wiki.twit.tv/wiki/Security_Now_250 听众反馈(Security Now 251, 1:00:22)http://www.grc.com/sn/sn-251.htm 和 http://wiki.twit.tv/wiki/Security_Now_251 RISC 与 CISC(Security Now 252, 53:31)http://www.grc.com/sn/sn-252.htm 和 http://wiki.twit.tv/wiki/Security_Now_252 听众反馈(Security Now 253, 50:38)http://www.grc.com/sn/sn-253.htm 和 http://wiki.twit.tv/wiki/Security_Now_253 我们将为速度做些什么:流水线、分支预测(Security Now 254, 29:30)http://www.grc.com/sn/sn-254.htm 和 http://wiki.twit.tv/wiki/Security_Now_254

如果有人对史蒂夫在这些剧集中所说的任何内容提出异议,提供反馈的最佳位置是 http://www.grc.com/feedback.htm 或 http://www.grc.com/discussions.htm 或 https://twitter.com/SGgrc

【讨论】:

以上是关于实际的机器代码在各个方面是啥样的? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Objective C 中的 Get Big Endian 函数是啥样的? [关闭]

Dreamweaver 自动生成的代码是啥样的?

GraphQL 文件上传请求应该是啥样的?

DDMS 分析器中的本机代码是啥样的?

非凡的发布过程是啥样的?

当循环之间的值增加 1 时,如何播放声音?标识增量为 1 的代码是啥样的?