汇编程序如何工作/如何编写?

时间:2012-10-31 17:00:37

标签: assembly theory

在我的一个课程中,我们从头开始关注计算机体系结构和编程。这意味着我们从pMOS / nMOS电路开始,转向逻辑门,然后使用逻辑门来制作寄存器和组合逻辑单元,然后分析一个小型微处理器架构(LC-3,就我的班级而言)。 p>

我们接下来要做的就是在汇编中编写程序,这是我有点困惑的地方。

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

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

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

2 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:3)

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

Screenshot of Manual Assembler

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

Closeup of manual assembler