PDP11是有史以来最有影响力的小型计算机

卫宗程
导读 计算的历史可以说可以分为三个时代:大型机、小型机和微型计算机。小型机在第一台大型机和当今无处不在的微型机之间架起了一座重要的桥梁。

计算的历史可以说可以分为三个时代:大型机、小型机和微型计算机。小型机在第一台大型机和当今无处不在的微型机之间架起了一座重要的桥梁。这就是 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 行话和编码的出现,/ 之后的任何文本都是注释。)

虽然数值可以用于内存地址,但使用标签而不是硬编码地址可以更容易编程并使代码在内存中可重定位。这在运行代码时为操作系统提供了灵活性,确保每个程序快速高效。

.data 汇编器指令将数据放入可读可写的内存段中。代码的内存段是只读的,以防止编程错误破坏程序并导致崩溃。PDP-11 上的这种指令与数据的分离称为“分离指令和数据”。除了增加稳定性之外,此功能还通过启用 64KB 的代码和 64KB 的数据使地址空间翻倍——这在当时被认为是一项相当大的创新。因此,英特尔的 X86 微机后来大量使用了分段。

PDP-11 架构

PDP-11 怎样让它更好地编程?其简单但功能强大的架构。

八个 16 位寄存器是指令集架构或 ISA 的核心。六个寄存器是通用的,一个是堆栈指针,一个是程序计数器。寄存器可以使用八种不同的寻址模式之一访问任何其他寄存器——以及内存或直接数据。每个寄存器都可以对 16 位数据字、8 位数据字节或访问存储器执行逻辑、数学或测试操作。寄存器还可以读取或写入 16 位内存字或 8 位内存字节。更高版本的 PDP-11 添加了寄存器来直接处理浮点数。

以下是其中一些寻址模式:

/直接注册地址

MOV $1, R0 /将数字 1 移入寄存器 0

/间接注册

MOV $1, (r0) /将数字 1 移动到寄存器 0 指向的内存中

/自动递增

MOV $1,(r0)+ /将数字 1 移动到寄存器 0 指向的内存中,并将寄存器 0 中的地址增加 1 个字

/自动递减

MOV $1,-(r0) /递减寄存器 1 中的地址,然后将数字 1 移动到它指向的内存中

/索引寄存器

MOV $1, START(r0) /将数字 1 移动到通过将寄存器 1 的内容添加到 START 的地址所创建的地址中

堆栈指针和程序计数器

如前所述,PDP-11 将指令和代码保存在单独的内存段中。堆栈指针或 SP 可帮助您管理数据内存,程序计数器或 PC 可帮助您管理代码的执行顺序。

在计算的早期,CPU 的寄存器数量有限,因此大多数操作都在内存中完成。堆栈和堆是程序员在内存中管理数据的方式。堆通常用于全局变量、数据和常量。堆栈用于子程序中使用的动态变量和数据。拥有一个专用的堆栈寄存器对程序员来说是一种真正的奢侈,并有助于更快的程序执行。今天的编程使用现代垃圾收集技术来自动化内存管理。但是在汇编语言编程中,如果需要使用内存,就必须手动管理它的方方面面。堆栈指针指令可以帮助您做到这一点。

以下是堆栈指针寻址模式。

/ 延期

MOV (SP), R0 /将栈指针指向的内存的值移动到寄存器0

/ 自动递增

MOV $1, (SP)+ /将值 1 移动到栈指针指向的内存中,并递增栈指针的值

/ 索引

MOV ARRAYSTART(SP), R0 /通过将 ARRAYSTART 的值添加到堆栈指针的值来创建一个有效地址,将该值的内容移动到寄存器 0

/ 索引延迟

MOV @VAL1(SP),R1

程序计数器的使用

可以像访问任何其他寄存器一样访问程序计数器,但这样做不是一个好主意。在 PDP-11 上,程序计数器一直忙于跟踪内存中的下一条指令。程序计数器旨在支持跳转、分支和其他控制流指令。该指令JMP START的效果与MOV START,PC: 在位置 START 开始执行代码的效果相同。

标签:

免责声明:本文由用户上传,如有侵权请联系删除!