计算的历史可以说可以分为三个时代:大型机、小型机和微型计算机。小型机在第一台大型机和当今无处不在的微型机之间架起了一座重要的桥梁。这就是 PDP-11 的故事,这是有史以来最有影响力和最成功的小型计算机。
当时,小型计算机被用于各种应用。它们用作通信控制器、仪器控制器、大型系统预处理器、台式计算器和实时数据采集处理器。但它们也为硬件架构的重大进步奠定了基础,并为我们今天所知的现代操作系统、编程语言和交互式计算做出了巨大贡献。
在当今的计算世界中,每台计算机都运行 Windows、Mac 或 Linux 的某些变体,很难区分操作系统下的 CPU。但是曾经有一段时间,CPU 架构的差异很重要。PDP-11 有助于解释为什么会这样。
PDP-11 于 1970 年推出,当时大多数计算都是在昂贵的 GE、CDC 和 IBM 大型机上完成的,很少有人可以使用。没有笔记本电脑、台式机或个人电脑。编程仅由少数几家公司完成,主要是在组装、COBOL 和FORTRAN方面。输入是在穿孔卡片上完成的,程序以非交互式批处理运行。
尽管第一台 PDP-11 规模不大,但它为微型计算机的入侵奠定了基础,这将使新一代计算机更容易获得,本质上是一场计算革命。PDP-11 帮助诞生了UNIX 操作系统 和 C 编程语言。它还将极大地影响下一代计算机体系结构。在 PDP-11 的 22 年使用寿命期间——按照今天的标准,这是闻所未闻的任期——售出超过 600,000 台 PDP-11。
早期的 PDP-11 模型并不过分令人印象深刻。第一台 PDP-11 11/20 售价 20,000 美元,但它只配备了大约 4KB 的 RAM。它使用纸带作为存储设备,并有一个 ASR-33 电传打印机控制台,每秒可打印 10 个字符。但它也有一个惊人的正交 16 位架构、8 个寄存器、65KB 的地址空间、1.25 MHz 的周期时间,以及支持未来硬件外围设备的灵活 UNIBUS 硬件总线。对于其创建者 Digital Equipment Corporation 来说,这是一个成功的组合。
PDP-11 的初始应用包括实时硬件控制、工厂自动化和数据处理。由于 PDP-11 在灵活性、可编程性和经济性方面享有盛誉,它在交通灯控制系统、耐克导弹防御系统、空中交通管制、核电站、海军飞行员训练系统和电信中得到了应用。它还开创了我们现在认为理所当然的文字处理和数据处理。
PDP-11 的影响在设备的装配编程中最为明显。
汇编程序编程基础
在 Python、Java 和 Fortran 等高级语言被发明之前,编程是用汇编语言完成的。汇编语言编程可以用很少的 RAM 和存储完成——非常适合早期计算环境。
汇编语言是一种低级的中间格式,可以转换为机器语言,然后可以直接由计算机运行。它是低级的,因为您直接操纵计算机体系结构的各个方面。简而言之,汇编编程通过硬件寄存器和内存逐字节移动数据。对 PDP-11 进行编程的不同之处在于小型机的设计非常优雅。每条指令都有它的位置,每条指令都有意义。
16 位地址空间意味着每个寄存器可以直接寻址高达 64KB 的 RAM,顶部的 4K 保留用于内存映射的输入和输出。PDP-11 可以使用寄存器段寻址总共 128KB 的 RAM(稍后会详细介绍)。因此,尽管 PDP-11 系统只有 4KB 的 RAM,但通过巧妙地使用早期的编程技术,它们仍然高效。
一个汇编语言程序
通过一个简单的 PDP-11 汇编语言程序的例子来理解这个概念是最容易的,我们将在下面进行介绍。以“.”开头的关键字 是对汇编器的指令。.globl
将标签作为符号导出到链接器以供操作系统使用。.text
定义代码段的开始。.data
定义单独数据段的开始。以“:”结尾的关键字是标签。汇编编程使用标签来象征性地寻址内存。(注意:随着 PDP-11 行话和编码的出现,/ 之后的任何文本都是注释。)
关键词 | 翻译 |
.globl _main | 导出标签_main作为操作系统使用的入口点 |
。文本 | 只读代码所在的指令段的开始 |
_main:MOV VAL1,R0 | 将内存位置 VAL1 的字值复制到寄存器 0 |
加 10 美元,R0 | 将寄存器 0 中的值加 10 |
移动 R0, VAL1 | 将寄存器 0 中的值复制到内存位置 VAL1 |
_.data | 读/写数据所在的数据段的开始 |
VAL1:.成为 100 美元 | 预留 2 个字节的存储空间来保存 Val1,初始化为 100 |
虽然数值可以用于内存地址,但使用标签而不是硬编码地址可以更容易地编程并使代码在内存中可重定位。这在运行代码时为操作系统提供了灵活性,确保每个程序快速高效。
.data 汇编器指令将数据放入可读可写的内存段中。代码的内存段是只读的,以防止编程错误破坏程序并导致崩溃。PDP-11 上的这种指令与数据的分离称为“分离指令和数据”。除了增加稳定性之外,此功能还通过启用 64KB 的代码和 64KB 的数据使地址空间翻倍——这在当时被认为是一项相当大的创新。因此,英特尔的 X86 微机后来大量使用了分段。
博客园是一个面向开发者的知识分享社区