10

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

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

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

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

4

3 回答 3

11

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

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

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

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

于 2012-08-17T14:18:04.850 回答
5

它在前面板上“切换”或从纸带中读取。您可以计算出二进制文件并设置开关或手动制作孔,在您的脑海中转换操作码。传说 Seymour Cray 以这种方式进入了整个第一个 Cray OS。

于 2012-08-17T14:15:56.130 回答
2

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

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

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

于 2012-08-17T15:14:07.300 回答