Unix 的早期版本包括 Doug McIlroy 的工具tmg
(“transmogrifier”),一种早期的编译器-编译器。 TMG 是用 Dennis Ritchie 的汇编语言以及 TMGL 本身(TMG 翻译成汇编语言)实现的。这是TMG 手册(1972)。这里是 Unix 版本 6 的完整源代码。
由于我试图了解 McIlroy 的 TMG 实现是如何工作的,因此我正在阅读该文件,该文件是由 TMG 完成tmgl.s
的翻译。tmgl.t
我对以下摘录感到困惑:
.1=.
1
.2=.
2
.3=.
和:
goto;..2
..3:null
..2:
特别:
.
意思是“位置计数器”,但是什么是.3=.
?..
意思是“重定位计数器”,但是什么是..3
?
(更糟糕的是,这种语法似乎只在 TMG 实现中遇到,而不是 Unix V6 的任何其他源文件。并且,为了排除损坏代码或逐步淘汰语法的可能性,TMG 源实际上编译为Python PDP-11 模拟器运行 Unix V6。)
答案1
.1
,..1
没有特殊意义。它们是简单的标识符(标签、变量等)。除非用 声明.globl
,否则默认情况下它们将是本地的。
当时是这样,现在仍然如此。例如,gcc
用于.
防止静态变量避免与用户定义的符号冲突。
什么是
.3=.
?
.3
它分配给名为位置计数器值(当前段内的偏移量)的本地符号。