【问题标题】:How does hardware run assembly? How was the first assembler written?硬件如何运行装配?第一个汇编程序是如何编写的?
【发布时间】:2026-02-04 04:00:01
【问题描述】:

在学习了编译器课程并自己做了一个基本的课程后,我仍然对第一个编译器有这个挥之不去的怀疑。

从高到低,我看到运行在 C 或 C++ 中的代码被它的编译器(比如说 gcc)转换为相应的汇编语言等效项。此代码依赖于平台(假设我使用的是 intel x86 架构)。

现在问题来了,硬件如何运行程序集?

我记得在我的计算机组织类中,每个汇编语句都被转换为特定格式(取决于处理器),例如,像 mov ax,bx 这样的语句被转换为它的操作码,比如说 0110 101010 101000。假设汇编器解析我的汇编语言程序中的每一条语句,并将其转换为机器码,那么第一个汇编器是如何编写的?

【问题讨论】:

  • 技术,尤其是计算机,本质上是迭代的;我们一遍又一遍地使用工具来制造更好的工具。第一个“组装机”是打卡机;操作员采用手写或键入的指令并使用打孔器将命令/寄存器/等转换为其二进制操作码,并将这些命令以可重复的、机器可读的形式保存。在此之前,可编程计算机必须通过使用配电盘“硬编码”电气路径来进行编程。
  • 手工编写机器代码本身并不是一个真正的问题。只是乏味。所以任务是自动化的——通过用机器代码编写汇编程序。
  • 主要问题是什么?第一个汇编程序是如何编写的?程序员:programmers.stackexchange.com/questions/129123/… 编译器引导:*.com/questions/1653649/…

标签: assembly


【解决方案1】:

“硬件”,主要是 CPU 和内存,几乎是一个有限状态机。它的状态/输出和输入大致是寄存器和内存的内容。

您的程序编译为 FSM“理解”的机器代码,驱动 FSM 从一个状态到另一个状态。这就是“硬件运行程序集”的方式。

除非第一个汇编器/编译器是交叉编译的(在不同平台上开发和编译),否则第一个是手动编写并翻译成机器代码,然后输入。

【讨论】:

  • 是的,现在对我来说很有意义。谢谢。
【解决方案2】:

其实我想你明白了。首先是标题问题,硬件如何运行程序集。硬件在机器代码或机器指令或任何术语上运行。正如您正确描述的那样,程序集是该机器代码的代表,并不总是但接近于一对一的关系,一条 asm 指令与一条机器指令。这些是位、一和零,硬件现在可以执行位描述的操作。

现在第一个汇编程序是如何编写的?用铅笔和纸。您通常在某种伪汇编中写下指令,因为您可能没有完全定义语言,然后根据编码写下位,汇编器会做同样的事情。然后使用某种机制将这些位输入计算机并告诉它运行。

最终,自然地,这对于大型程序来说变得乏味,因此您决定编写一个更大的程序来解析一种更易于编写的语言,然后用更复杂的语言和程序重复此过程。

即使在今天,这也取决于团队、他们的工作方式以及测试指令解码器的单个工程师等。手工编写机器代码仍然会发生。最终,汇编器被创建,你切换到它,有时会有一个更高级别的编译器,你切换到它来进行大部分编码,但在芯片开发世界中,你仍然非常了解,并且不时会修改机器代码级别的指令位。

【讨论】:

  • 谢谢。将您的解释与 Gaius 下面的答案中发布的链接相结合,帮助我创建了整个过程的良好心理形象。非常感谢。
  • en.wikipedia.org/wiki/… 我父亲上大学时会带回家一盒打孔卡。这些在en.wikipedia.org/wiki/… 中使用fortran EBCDIC 类似于我们今天使用的ASCII(字母等以位模式表示)。我不认为这些卡是机器代码,只是你需要汇编器或编译器的程序(你需要纸带等来启动机器)。
  • 所以您不仅需要加载读卡器软件,还需要加载编译器/汇编器。
  • 注意,有一个字面上的“比特桶”,纸张上的碎屑会落入打孔机(就像打字机)下面。
  • @ShashankVM 一辆汽车在汽油上运行,OP 说硬件在装配上运行,答案是没有硬件在基于 op 语言的机器代码上运行,但更好的是硬件运行机器代码或机器代码运行在硬件上。
【解决方案3】:

它在front panel 上“切换”或从paper tape 读取。您可以计算出二进制文件,然后设置开关或手动打孔,在脑海中转换操作码。传说 Seymour Cray 以这种方式进入了整个第一个 Cray OS。

【讨论】:

  • 感谢您提供有用的链接。