关于机器代码实际上是什么似乎有很多意见。我听说有人说它是汇编、二进制或十六进制。
说机器代码本质上是特定处理器的一组指令是否正确?如果是这样,我想这些可以用二进制或十六进制表示法或汇编来表示。但是未翻译的“实际”机器代码是什么样的?是基于架构的字长吗?还是所有意图和目的的十六进制都是默认表示?
坐在硬盘上时会是什么样子?坐在登记簿上时是什么样子的?当它被处理时,它只是在那一点上的一组电压变化吗?
关于机器代码实际上是什么似乎有很多意见。我听说有人说它是汇编、二进制或十六进制。
说机器代码本质上是特定处理器的一组指令是否正确?如果是这样,我想这些可以用二进制或十六进制表示法或汇编来表示。但是未翻译的“实际”机器代码是什么样的?是基于架构的字长吗?还是所有意图和目的的十六进制都是默认表示?
坐在硬盘上时会是什么样子?坐在登记簿上时是什么样子的?当它被处理时,它只是在那一点上的一组电压变化吗?
机器代码只是对应于特定处理器架构的 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 位电荷。
像我一样,您似乎对计算机如何在幕后工作感到好奇。我的知识不足以很好地回答您的问题(无论如何这是一个很大的话题),但我强烈推荐 Steve Gibson 的“让我们设计一台计算机”播客系列。这是“机器语言”成绩单的摘录,让您了解一下。. .
而所有的跳过方式是,我们不是在程序计数器上加一,而是加二,或者加一两次,这实际上是这些机器当时的工作方式。这只会让我们跳过一个跳跃。所以本质上这意味着我们可以分支到内存中我们想要的任何地方或继续前进,这给了我们,即使这很简单,也给了我们足够的权力让机器做出决定。我们有输入/输出;我们有数学;我们有能力将数据从内存中的一个位置传输到另一个位置。这些都是机器运行方式的所有要素。那就是机器语言。
现在,置于其之上的一层人性就是所谓的“汇编语言”,它只不过是命名事物。例如,您为不同的指令创建了一种所谓的助记符。因此,例如,加载累加器将是 LDA。存储累加器 STA。您希望它们简短,因为您将经常输入它们。请记住,您最终会使用大量的小指令来完成某件事。然后,汇编语言唯一真正做的另一件事是,它允许您命名内存中的位置。
因此,例如,您可能会说 LDA,对于负载累加器,当前分数。而当前分数只是指一个,本质上就像一个变量,内存中你标记为“当前分数”的位置。然后,如果您进行 STA,存储累加器,新分数,那么它会首先将当前分数加载到累加器中,然后将其存储到称为新分数的不同位置。所以我们真正谈论的就是一些简单的缩写,用于帮助记住和使用这些单独的指令和方便的标签来标记内存中的位置,这样你就不必记住,哦,那是在位置 329627。我的意思是,谁能做到?因此,您只需用英语标记该位置,某种字母数字短语,
事实上,你并不关心这个数字是多少。那就是汇编程序将为您做的一件事就是您只是说我需要称为这些东西的内存。它担心他们去哪里,因为只要他们一直被提及,这对你来说并不重要。这就是整个过程。那是机器语言和汇编语言。这就是 50 年前的样子,或多或少就是现在的样子。
. . 但他比这更进一步,从晶体管和逻辑门开始。据我所知,这是完整的系列(听众在 wiki 中提供了有用的图表):
如果有人对史蒂夫在这些剧集中所说的任何内容提出异议,提供反馈的最佳位置是http://www.grc.com/feedback.htm或http://www.grc.com/discussions.htm或https:/ /twitter.com/SGgrc
为初学者解释
从一开始,计算机就有很多“开关”。例如,可以关闭
或打开 LED 灯,只有 2 个选项(1=打开或 0=关闭)。如果您有 2 个 LED,您可以关闭 LED 1 并打开 LED
2,反之亦然,或者您可以同时打开或关闭它们。现在有更多的可能性。
你可以计算出有多少种不同的可能性。
1 盏灯 = 2^ 1 = 2 种可能性
2 盏灯 = 2^ 2 = 4 种可能性
8 盏灯 = 2^ 8 = 256 种可能性
所以计算机只读取零和一。一台计算机有很多开关,具体取决于 CPU 容量。要告诉计算机激活灯,您需要在系统中添加 0 和 1,这将是一项非常艰巨的任务。为了避免这种情况,他们将可能性转换为十六进制数。汇编只是一种计算机语言,它将您键入的字母转换为 0 和 1(二进制代码)并按照说明进行操作。