可能重复:
第一个编译器是如何写出来的?
这个问题一直困扰着我。 想要编译程序,你需要一个编译器,也是一种程序,那么是什么编译了编译器呢? 有人告诉我,最初的编译器是用汇编或机器码编写的。 但是思考一下,这还不是完整的故事。毕竟,机器码如何从硬盘到RAM再到CPU,没有操作系统和驱动程序的帮助呢?驱动程序必须已经被某种方式编程过了。
我知道很早期的计算机有开关,并允许您翻转开关以指示位。我想知道的是,从开关到一种无需计算机程序就可以让CPU读取机器码的方式是如何实现的。
可能重复:
第一个编译器是如何写出来的?
这个问题一直困扰着我。 想要编译程序,你需要一个编译器,也是一种程序,那么是什么编译了编译器呢? 有人告诉我,最初的编译器是用汇编或机器码编写的。 但是思考一下,这还不是完整的故事。毕竟,机器码如何从硬盘到RAM再到CPU,没有操作系统和驱动程序的帮助呢?驱动程序必须已经被某种方式编程过了。
我知道很早期的计算机有开关,并允许您翻转开关以指示位。我想知道的是,从开关到一种无需计算机程序就可以让CPU读取机器码的方式是如何实现的。
总结一下,过去某个可怕的时期,所有事情都必须手工完成,但由于那些做这件事的人的辛勤劳动,我们现在可以在已有的基础上进行建设。
通过这个,您可以设置地址和/或数据位的二进制开关,然后使用其中一个命令切换开关来执行以下操作之一:
Altair在RESET
之后,当前地址设置为零,由于这是CPU开始执行代码的地方,通常足够了。否则,您可以设置地址开关并切换EXAMINE
以将当前地址设置为其他内容。在您输入程序不正确并需要修补它(而不是从头开始重新做)的情况下,也需要进行地址选择过程。
一旦地址是您想要的内容(EXAMINE
会显示它在地址LED上以及数据LED上的当前内容),您将切换数据开关并执行DEPOSIT
以将该数据放入当前地址(DEPOSIT-NEXT
相同,但它首先增加当前地址再存储,对于顺序输入很有用)。
EXAMINE/DEPOSIT/DEPOSIT-NEXT
过程将每个字节输入内存,非常小心地确保LED正确指示您刚刚存储的字节。第二个要点可能是最难的部分,因为您需要调整跳转到尚未组装的指令,所以您基本上是一个缓慢的、生物多通道组装器。
例如,考虑以下(非常简单的)8080代码,从在线资源中获取:
0000 c3 00 00 jmp 0000 ; Infinite loop.
请注意,数据字节c3 00 00
是十六进制的,但人们通常使用八进制,因为Altair开关分组成三个,而不是四个;这将给出303 000 000
。
因此,对于那个特定的程序,您应该:
RESET
,将当前地址设为零。101 000 101
对应八进制数 303
,即 JMP
操作码。DEPOSIT
开关,将该字节存入内存位置 0,并在 LED 上显示地址和存入数据以进行检查。000 000 000
对应八进制数 000
,表示要跳转到的第一个地址字节。DEPOSIT-NEXT
开关,将当前地址增加到 1,将该字节存入该地址并再次显示地址和数据在 LED 上。DEPOSIT-NEXT
开关,将当前地址增加到 2,将该字节存入该地址并再次显示地址和数据在 LED 上。由于它们与前一个字节相同,因此不需要更改数据开关。此时,程序已经在内存中,您可以切换 RESET
然后切换 RUN
来查看它的运行情况。不过,如果您想要在运行时看到 LED 灯的变化,您可能会不断地切换 SINGLE-STEP
。