实际的机器代码在各个方面看起来像什么?

时间:2012-04-25 22:39:43

标签: assembly hex machine-code machine-instruction

关于什么机器代码实际上似乎有很多意见。我听说有人说它是汇编,二进制或十六进制。

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

坐在硬盘上时看起来像什么?坐在登记册上看起来像什么?处理它的时候,它只是那时的一组电压变化吗?

3 个答案:

答案 0 :(得分:17)

机器代码只是二进制数据,对应于特定处理器体系结构的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位电荷。

答案 1 :(得分:6)

像我一样,你似乎对计算机如何在幕后工作感到好奇。我不太了解你的问题(这无论如何都是一个很大的话题),但我强烈推荐Steve Gibson的“Let's Design a Computer”播客系列。这是“机器语言”成绩单的摘录,为您提供一些风格。 。

  

所有跳过方法都是,不是在程序计数器中添加一个,而是添加两个,或者我们添加两个,这实际上就是这些机器的工作原理。这只会让我们跳过跳跃。所以基本上这意味着我们可以分支到我们想要的任何内存或继续我们的方式,这给了我们,即使这非常简单,它给了我们足够的能力,让机器做出决策。我们有输入/输出;我们有数学;我们有能力将数据从内存中的一个位置传输到另一个位置。这些都是机器运行方式的基本要素。那是机器语言。

     

现在,人类的最重要的一层就是所谓的“汇编语言”,这只不过是命名事物。例如,您为不同的指令创建了一种所谓的助记符。因此,例如,加载累加器将是LDA。存储累加器STA。你希望它们很短,因为你要打字很多。请记住,为了完成某些事情,您最终会使用许多小指令。然后是汇编语言所做的唯一其他事情,它允许您在内存中命名位置。

     

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

     

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

。 。但是他的支持比这更远,并从晶体管和逻辑门开始。从我可以看出,这是完整的系列(并且听众在wiki中提供了有用的图表):

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

答案 2 :(得分:-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(二进制代码)并按照说明进行操作。