硬件如何运行汇编代码?第一个汇编器是如何编写的?

11

我曾学习编译器,并亲自制作了简单的编译器,但对于第一款编译器仍有疑虑。

从高级别到低级别,C或C++代码通过相应的编译器(例如gcc)转换为特定平台的汇编语言等效代码(例如,我在intel x86架构上)。这段代码是依赖于平台的。

现在问题来了,硬件如何运行汇编代码?

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


技术,尤其是计算机技术,本质上是迭代的;我们使用工具来制造更好的工具,一次又一次地。最初的“汇编器”是卡片打孔机;操作员将手写或打字指令输入,并使用打孔机将命令/寄存器等翻译为它们的二进制操作码,并以可重复、机器可读的形式保存这些命令。在此之前,可编程计算机必须通过使用交换机板硬编码电路路径来进行编程。 - KeithS
1
手写机器码并不是问题,只是比较繁琐。因此,这项任务被自动化了 - 通过用机器码编写汇编器。 - harold
什么是主要问题?第一个汇编程序是如何编写的?关于程序员:http://programmers.stackexchange.com/questions/129123/were-the-first-assemblers-written-in-machine-code 编译器引导:https://dev59.com/InI-5IYBdhLWcg3w0cOG - Ciro Santilli OurBigBook.com
3个回答

12

我认为你应该已经理解了。首先,关于标题问题,“硬件如何运行汇编语言”。硬件运行的是机器码、机器指令或者其他类似的术语。正如你所描述的,汇编语言代表了机器码,而且通常情况下,一条汇编指令会对应一条机器指令,虽然不总是如此。这些指令都是由二进制的0和1构成的,硬件可以根据这些比特位来执行相应的操作。

那么第一个汇编器是如何写出来的呢?用铅笔和纸。你通常会以某种伪汇编的形式写下指令,因为你可能还没有完全定义好这个语言,然后你会按照编码方式将指令转换为比特位,这就是汇编器所要做的事情。然后使用某种机制将这些比特位输入到计算机中,并让它运行。

随着程序变得越来越大,这种方法最终变得单调乏味,因此你会决定编写一个解析更易于书写的语言的更大型的程序,然后在更复杂的语言和程序中重复这个过程。

即使在今天,根据团队如何进行以及个人工程师测试指令解码器等因素,手动编写机器码仍然会发生。最终,汇编器被创建出来,你就可以使用它了。有时还会有更高级别的编译器,你会在大部分编码中使用它,但是在芯片开发领域,你仍需要非常清楚地了解并不时地修改机器代码层面上的指令比特位。


谢谢。您的解释与Gaius在下面回答中提供的链接结合起来,帮助我形成了整个过程的良好心理图像。非常感谢。 - user720694
当我父亲在大学时,他会带回家一些装满纸片卡的盒子。这些纸片卡是使用Fortran和EBCDIC进行编程的,而EBCDIC与我们今天使用的ASCII相似(字母等用位模式表示)。我不认为这些纸片卡是机器码,只是需要汇编器或编译器的程序(你需要纸带等来启动机器)。 - old_timer
所以不仅需要加载读卡器软件,还需要编译器/汇编器。 - old_timer
铅笔和纸张。这让人想起在旧版本的Turbo Pascal中编写内联机器代码的回忆。你拿一张纸,写下汇编代码,然后手动将其转换为Turbo的“inline”语句理解的机器代码。以某种方式,使用铅笔和纸比直接在计算机上操作更加舒适。 - ninjalj
1
@ShashankVM 一辆汽车使用汽油行驶,OP说硬件是运行在汇编语言上的,答案是否定的,因为硬件是基于机器码运行的。但最好说硬件运行机器码或机器码在硬件上运行。 - old_timer
显示剩余2条评论

5

这种程序被“切换”到前面板上或从纸带中读取。你可以计算出二进制并手动设置开关或打洞,将操作码转换为人脑可识别的形式。传说Seymour Cray就是用这种方式输入了整个第一个Cray OS。


2

"硬件",主要是CPU和内存,基本上是一个有限状态机。它的状态/输出和输入大致是寄存器和内存的内容。

你的程序编译成机器码后,驱动FSM从一个状态到另一个状态。这就是“硬件运行汇编代码”的原理。

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


是的,现在我明白了。谢谢。 - user720694

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接