6

在我的一堂课中,我们从头开始学习计算机体系结构和编程。这意味着我们从 pMOS/nMOS 电路开始,然后转到逻辑门,然后使用逻辑门制作寄存器和组合逻辑单元,然后分析了一个小型微处理器架构(LC-3,在我的课堂上)。

我们做的下一件事是用汇编语言编写程序,这让我有点困惑。

举个例子: ADD R0, R1, R2它应该添加寄存器 1 和 2 的内容并将其存储在寄存器 0 中。作为机器字(在我们在课堂上学习的架构中),这条指令将是0001 000 001 000 010,我在某种程度上理解该二进制字如何然后将其转换为电压信号,该信号在处理器中的各种多路复用器和控制单元中设置适当的值。

我的问题是,汇编程序如何ADD R0, R1, R2转换为?0001 000 001 000 010对于以我的理解水平的人来说,这个过程似乎类似于编译更高级别的语言。但是这里不可能没有编译器,因为没有比汇编更基本的语言来编写编译器了!

换句话说,如果程序本身不能用汇编语言编写,如何编写程序来汇编汇编代码。它是由某个天才直接用二进制编写的,然后硬编码到处理器的程序内存中吗?我很难想象一种编写汇编程序的实用方法,而不是可以由微处理器直接执行。

4

2 回答 2

13

很久以前,在遥远的星系中,最早的汇编程序是直接用机器代码编写的。但是,一旦有了汇编器,就可以用它来汇编新的汇编器,也可以用它来汇编编译器。

一旦有了编译器,就可以用它来编译新的汇编器。

所以在实践中,汇编程序现在是用更高级的语言编写的。通常是 C 或 C++。至于它们是如何工作的,一个非常非常简单的汇编器本质上只是一个大的 switch 语句;识别操作码,将其转换为相应的机器编码。

于 2012-10-31T17:06:01.987 回答
5

我实际上正在做这个确切的问题:在没有汇编程序的情况下组装汇编程序。我这样做的方式是使用 Excel 电子表格。电子表格中包含用于查找操作码等并计算二进制输出的公式。在过去,他们做同样的事情,只是他们使用纸质电子表格而不是基于计算机的电子表格。这是我的手动汇编程序的截图,突出显示的区域是机器代码:

手动汇编器截图

右边的区域是汇编代码。左边的区域是中间计算。这是一个特写:

手动组装机特写

所以,这个问题的简短回答是:在过去他们使用纸质电子表格进行手动组装。如今,要进行手动组装,我们使用计算机电子表格(我使用 Excel)。

在我的电子表格中,标有“编码”的列是实际的二进制代码(机器代码)。组装说明在右侧以及他们正在做什么的描述。

于 2012-10-31T17:32:45.220 回答