---
schema_version: "library-reader-v1"
source_type: "original_book"
title: "编码 隐匿在计算机软硬件背后的语言"
author: null
edition: null
publisher: null
year: null
isbn: "9787121181184"
library_document_id: "38270854-596f-4a26-8183-db8c968c6020"
source_sha256: "249786274d83909f0bddc34d77f81ed8f0b14d1eac8843c772a37a3ecbfe2cfc"
pdf_physical_page_count: 438
pdf_physical_page_index_base: 0
range_start: 340
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020?start=340&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=340&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=330&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=350&limit=10"
---

# 编码 隐匿在计算机软硬件背后的语言

> 页码规则：PDF_PHYSICAL_PAGE_INDEX 是从 0 开始的权威文件物理页索引；PRINTED_PAGE 是页面中识别出的印刷页码，可能为空，二者不得混用。

## PDF_PHYSICAL_PAGE_INDEX=340 | PRINTED_PAGE=324

只可惜问题也随之而来，近几十年来出现了许多不同版本的扩展的ASCI码，多个不同的版本严重影响了编码的一致性，导致了混淆和不兼容。ASCI码被扩展到极致，有的甚至可以对中文、日文和韩文进行编码。其中有一种流行的编码Shift-JIS，即日本工业标准(Japanese Industrial Standard)，利用 81h\~9Fh表示双字节字符编码的初始字节。通过这种手段，Shift-JIS可对额外的约6000个字符进行编码。只可惜 Shift-JIS 并不是唯一的采用这种技术的编码系统。在亚洲地区，还有三个类似的双字节字符编码系统(double-byte character sets，DBCS)同样也很流行。

双字节字符集的确有很多版本，但兼容性并不是它最主要的问题。它的另一个缺陷是，一些字符，特别是通用的ASCI码字符，是用单个字节编码表示的，相比而言，成千上万的象形文字则是双字节编码，这在无形之中增加了使用这种字符集的难度。

业界一直有一个目标，那就是建立一个独一无二的字符编码系统，它可以用于世界上所有语言文字，从1988年开始，几大著名计算机公司合作研究出一种用来替代ASCI码的编码系统，取名为Unicode(统一化字符编码标准)。相对于ASCII的7位编码，Unicode采用了16位编码，每一个字符需要2个字节。也就是说Unicode的字符编码范围为0000h\~FFFFh，总共可以表示65,536个不同字符。全世界所有的人类语言，尤其是经常出现在计算机通信过程中的语言，都可以使用同一个编码系统，而且这种系统还具备很高的扩展性。

Unicode编码其实并不是从零开始设计的，前128个字符编码——即 0000h\~007Fh—与 ASCII 码是一致的。Unicode 编码中的 00A0h\~00FFh与先前讲到的第1号拉丁字母表是一致的。全世界很多标准也被一同收录在Unicode中。

尽管相对于之前讲过的一些字符编码系统，可以说Unicode做出了有效地改进，但这也不能确保它被全世界广泛采纳。ASCII码，包括数不清的有一点小缺陷的扩展ASCII码已经在计算机领域根深蒂固，想一下子就取代它们并不是轻而易举的。

对于Unicode来讲，它唯一的问题，就是它改变了字符与存储空间之间“单字符，单字节”的等价对应关系。采用ASCIⅡ编码方式存储的著作《怒火之花》，其所占据的存储空间约为1MB。而如果采用Unicode编码，约占2MB。为了使编码系统兼容，Unicode在存储空间上付出了相应的代价。

编码—隐匿在计算机软硬件背后的语言

324

## PDF_PHYSICAL_PAGE_INDEX=341 | PRINTED_PAGE=NOT_DETECTED

总 线

在一台计算机中，中央处理器无疑是最重要的部件，但它并不是唯一的部件。随机访问存储器（Random AccessMemory，RAM）也是计算机不可或缺的部件，它存放着处理器要执行的机器代码指令。通过怎样的方法才能把指令加载到RAM中？怎样才能把程序的结果变得可见呢？或许你一下子就想到了输入设备(Input Device)和输出设备(OutputDevice)。回想一下前面讲过的内容，RAM是易失性存储器换言之，当掉电的时候其中的内容就会丢失。所以，长期存储设备也是一台计算机必不可少的部件，只有这样，代码和数据才能够被永久保存，不会因为掉电而丢失重要的数据。

搭建一台完整的计算机还需要很多集成电路，这些集成电路都必须挂载（mounted）到电路板上。在一些小型的机器中，一块电路板足以容纳所有的集成电路，但这种情况并不常见。我们通常所看到的是另一种情况：计算机中各部件按照功能被分别安装在两个或更多的电路板上。这些电路板之间通过总线（bus）通信。如果对总线做一个简单的概括，可以认为总线就是数字信号的集合，而这些信号被提供给计算机上的每块电路板。通常把这些信号划分为如下四类。

地址信号。这些信号是由微处理器产生，通常用来对RAM进行寻址操作，当然也可以用来对连接到计算机的其他设备进行寻址操作。

## PDF_PHYSICAL_PAGE_INDEX=342 | PRINTED_PAGE=326

数据输出信号。这些信号也是由微处理器产生的，用来把数据写入到RAM或其他设备。这里特别要注意区分术语输入（input）和输出（output)，来自微处理器的数据输出信号会变成RAM和其他设备的数据输入信号。

数据输入信号。这些信号是由计算机的其他部分提供的，并由微处理器读取。通常情况下，数据输入信号由RAM输出，这就解释了微处理器是怎样从内存中读取内容的。其实，其他部件也可以给微处理器提供数据输入信号。

控制信号。这些信号是多种多样的，通常与计算机内所用的特定的微处理器相对应。控制信号可以产生于微处理器，也可以由与微处理器通信的其他设备产生。比如，当微处理器要把一些数据写入到特定内存单元时，它所使用的信号就是控制信号。

还有一点需要说明：总线还可以为计算机上不同电路板供电。

回顾一下总线的发展历程。在家用计算机领域，早期比较流行的就是S-100总线，1975年第一台家用计算机MITS Altair就率先采用了这种总线。尽管一开始，S-100 总线只是基于8080微处理器的，后来经过改进，也开始适用于其他处理器，例如6800。一块S-100电路板的规格是5.3×10英寸，其中有一边是要插到一个插槽上的，这个插槽有100个连接器（这就是名为 S-100的原因）。

每台 S-100 计算机都有一块很大的被称为母板(motherboard 或 mainboard)的电路板，它有若干相互连接的S-100总线插槽（可能有12个)。有时候，这些插槽也被称为扩展插槽（expansion slots)。S-100电路板（也称为扩展板，expansion boards）就插在这些插槽中。8080微处理器及支持芯片（第19章提到过的其中的一些）分布在一块S-100电路板上，而RAM分布在一块或多块其他电路板上。

S-100总线是专门为8080芯片而设计的，有16个地址信号，8个数据输入信号及8个数据输出信号（仔细回忆一下，8080本身并不区分数据输入和输出信号，这项工作是由电路板上的其他支持芯片完成的)。总线上也含有8个中断信号，其他设备需要CPU立即做出响应时，便会产生这些信号。下面我们看一个例子（本章的后面也要讲到），当某个按键按下时，键盘可能就会产生--个中断信号。接下来8080会执行一段小程序，检测出是什么按键被按下，并做出响应。通常，在安装了8080的电路板上有一个被称为Intel8214优先级中断控制单元的芯片，就是专门用来处理中断的。当中断发生时，这个芯片会产生一个中断信号并送给8080。8080识别出这个中断后，此芯片就会提供一个RST（Restart，重启）指令，在这条指令的作用下，微处理器会把当前程序计数器的值保存下来，并依据中断类型，跳转到地址0000h、0008h、0010h、0018h、0020h、0028h、0030h或0038h处执行。

编码——隐匿在计算机软硬件背后的语言

326

## PDF_PHYSICAL_PAGE_INDEX=343 | PRINTED_PAGE=327

如果你在设计一个新的计算机系统，而这个系统中采用新的总线类型，你可以选择把总线规范公布于众（也可以通过其他方式发布出去）或者使其保密，决定权在于你。

一旦一条指定总线的规范公布开来，其他制造商——称为第三方（third-party）制造商—就可以设计并销售采用了这种总线的扩展板了。这些额外扩展板不仅加强了计算机的实用性，还使其更加满足实际需求。计算机的销售情况越好，扩展板的市场前景也就越好。正是由于这个原因，设计者在设计多数小型计算机系统时，都会坚持开放体系结构（OpenArchitecture）的原则，这样一来，其他制造商就可以生产计算机的外设。最终会有一条总线成为工业标准。在今天，“标准”已经成为个人计算机产业的一个重要组成部分。

1981年秋，最著名的开放体系结构个人计算机——IBM的PC问世。IBM公布了PC的技术参考资料（technical reference)，里面包含了整台计算机的全部电路图，IBM为其制造的扩展板的资料也在其中。这个手册可是很重要的资料，它的出现使得很多制造商可以生产自已的 PC扩展板，实际上，这创造出了整个 PC的克隆体——其实与IBM的PC几乎完全相同，运行的软件也一样。

在如今的桌面计算机领域，从起初的IBM的PC发展而来的计算机数量庞大，占据约90%的市场份额。尽管IBM本身只占很小一部分，但事实上，如果起初的PC采用的是封闭体系结构（closed architecture）且设计是私有化（proprietary）的，其所占的市场份额会更少。苹果公司的麦金托什（Macintosh）起初采用的是封闭体系结构，尽管也曾部分考虑过开放的问题，这也就解释了为什么Macintosh在如今的桌面计算机市场上只占有不到10%的份额。（请记住这一点：一个计算机系统可以是在开放体系结构下设计的，也可以是在封闭体系结构下设计的，无论是哪种情况，其他公司都可以为其设计软件。但也有例外的情况，某些视频游戏的开发商会限制其他公司开发其专用系统上的软件)。

最初的IBM PC采用的是Intel8088 微处理器，可以寻址1MB的存储单元。虽然8088内部是一个16位的微处理器，但外部却只能寻址8位的存储器。工业标准体系结构(Industry Standard Architecture，ISA)总线，是IBM 为最初的 PC 设计的。扩展板上有 62针的连接插头。有20个地址信号，8个复用的数据输入输出信号，6个中断请求信号及3 个直接存储器访问(Direct Memory Access，DMA)请求信号。DMA可以使存储设备(本章最后我们会讲到）快速地执行存储操作，这比采用其他方法快得多。通常情况下，所有读/写内存的操作都是由微处理器来完成的，但采用了DMA后，其他设备可以不通过微处理器而获得总线的控制权，进而直接对内存进行读写。

21 总线

327

## PDF_PHYSICAL_PAGE_INDEX=344 | PRINTED_PAGE=328

在S-100系统中，所有的部件都安放在扩展板上。就拿IBMPC来说，微处理器、支持芯片及一些RAM都安装在一块系统板上，系统板（system board）是IBM的“内部称呼”，但它常常也被称为母板或主板。

1984 年，IBM推出了个人计算机 AT，采用的是16位的Intel 80286微处理器，这个微处理器可以寻址16MB的存储单元。IBM保留了原有的总线，但添加了一个36针的插槽。这个插槽包括7个地址信号（其实只需4个）、8个数据输入/输出信号、5个中断请求信号以及4个DMA请求信号，这些信号都是新增的。

微处理器所使用的数据宽度（从8位到16位再到32位）和输出的地址信号的数目在不断增长，当这些超出总线的承受能力时，总线就需要升级换代了。如果微处理器的处理速度很快时，也会出现这种情况。早期的总线是为当时的微处理器而设计的，它们的时钟频率一般是几兆赫兹而不是几百兆赫兹。如果设计出来的总线不适合高速传输的话，就会出现射频干扰（RFI)，这会使附近的收音机和电视机产生静电或其他噪声。

1987年，IBM推出了微通道体系结构（Micro Channel Architecture，MCA）总线。这种总线的某些部分已经成为IBM的专利，如果其他公司使用这种总线，IBM就会从中收取授权费用。也许就正是由于这个原因，MCA才没能成为一种工业标准。然而就在1988年，9家公司（并不包括 IBM）联合推出的 32 位 EISA（Extended Industry StandardArchitecture）总线取代了MAC，成为了工业标准。近几年，Intel公司设计的外围部件互连（PCI）总线已普遍使用在PC兼容机上。

计算机上的各种不同的部件是如何工作的呢？为了能更好地理解，让我们再次回到20世纪70年代中期去看一看。想象一下，我们正在为Altair设计电路板，或者是在为自己设计的8080或6800计算机做这样的事情。我们不仅要考虑为计算机设计一些存储器，用键盘作为输入，用电视机作为输出；还要考虑关上计算机时，如何把存储器中的内容保存下来。如何把这些部件添加到计算机中呢？下面就来看看能实现这个功能的各种接口(Interface)。

编码—隐匿在计算机软硬件背后的语言

328

## PDF_PHYSICAL_PAGE_INDEX=345 | PRINTED_PAGE=329

现在回想一下第16章所讲的内容，RAM阵列有地址输入、数据输入，以及数据输出信号，另外还有一个用来把数据写入存储器的控制信号。RAM阵列能存放的数据的数量是和地址输入信号的个数有关的，它们之间有着如下的关系：

$$
\mathbf { R A M } \mid \# \neq \nmid \Phi \nmid \Phi \nmid \mathbf { \cdots } \nmid \Phi \nmid \Lambda \nrightarrow \infty 2 \nmid \mathbf { \cdots } \nmid \Phi \nmid
$$

讲到这里你可能会问，数据输入、输出信号又有怎样的作用呢？其实它们决定着所存储的数值的大小（位数)。

20世纪70年代中期，2102是用于家用计算机的一款流行的存储器芯片。其管脚分布如下图所示。

它也是MOS（metal-oxide semiconductor）家族中的一员，与 8080和 6800 微处理器所采用的技术相同。MOS半导体管很容易与TTL芯片连接起来；通常情况下，其内部晶体管的密度要比TTL高，但速度却不如TTL快。

这个芯片存储容量可以达到1024位，这个数值可以根据地址信号（A0\~A9）、数据输出（DO）和数据输入（DI）信号（输入和输出复用一个信号线）的数目计算出来。你所使用 2102芯片型号不同，访问时间（read access time，指从芯片接收到地址信息到输出有效数据所需的时间）也是各有差异，从350ns\~1000ns不等。当需要从存储器中读取数据时， $\mathbf { R } / \overline { { \mathbf { W } } }$ （读/写）信号置1；当向芯片中写入数据的时候，这个信号要置0，而且至少要持续170\~550ns的时间，也是由所使用的2102芯片的型号决定的。

这里我们不得不提到的一个信号就是 $\overline { { \mathbf { C } \mathbf { S } } }$ 信号，也称片选信号。该信号置1时，芯片不被选中，意思就是说，不会响应 $\mathbb { R } / \overline { { \mathbb { W } } }$ 信号。其实， $\overline { { \mathbf { C } \mathbf { S } } }$ 信号的作用不止这些，对芯片还有其他重要的作用，下面我们将简单描述一下。

21 总线

329

## PDF_PHYSICAL_PAGE_INDEX=346 | PRINTED_PAGE=330

想想看，若让你为8位的微处理器组织存储器的话，你会怎么做呢？是选择按8位存储形式，还是1位存储形式？你肯定会选择前者。如果想存储整个字节，则至少需要8个这样的2102芯片。具体的做法就是，把8个芯片对应的地址信号、 $\mathbb { R } / \overline { { \mathbb { W } } }$ 及 $\overline { { \mathbf { C } \mathbf { S } } }$ 信号连接起来，如下图所示。

实际上，这是一个1024×8位的RAM阵列，或者说是容量为1KB的RAM。

把存储器芯片安装在一块电路板上，这是很符合实际的做法。那么，到底一块电路板上能安装多少块这样的芯片呢？如果是紧紧排列在一起的话，一块 S-100板就能容纳64个。这样一来，就提供了一个8KB的存储空间。一般我们不这样做，更合适的方法是，用32个芯片组成一个4KB的存储器。为了存储完整的字节，而连接在一起的芯片的集合，称为存储体（bank）。例如，一个4KB大小的存储器板就由4个存储体组成，而每个存储体又包含8个芯片。

8位微处理器，例如8080、6800，有16位地址，可用来寻址64KB的存储空间。如果你制作了一个包含4个存储体、大小为4KB的存储器板，则存储器板上的16位地址信号就有如下所示的功能。

下面详细解释一下这16位地址信号。A0\~A9直接与RAM芯片相连接；A10和A11用来选择4个存储体中要被寻址的那一个；A12\~A15确定哪些地址申请用这块存储器板，换言之，就是这块存储器板响应哪些地址。微处理器整个存储空间的大小是64KB，被划分成16个不同的区域，每个区域的大小是4KB，我们设计的4KB存储器板占用了其中一个区域。这16个区域划分情况如下。

编码隐匿在计算机软硬件背后的语言

330

## PDF_PHYSICAL_PAGE_INDEX=347 | PRINTED_PAGE=331

0000h\~0FFFh1000h\~1FFFh2000h\~2FFFhF000h\~ FFFFh

举例说明，假定4KB存储器板使用了A000h\~AFFFh地址区域。这就意味着，第一个存储体占用了地址A000h\~A3FFh，第二个占用了地址A400h\~A700h，第三个占用了地址A800h\~ABFFh，剩下的 AC00h\~AFFFh地址空间分给了第四个存储体。

你完全可以制作一块4KB存储器板，在用到它的时候再灵活确定其地址范围。要获得这样的灵活性，可以使用一种名为双列直插式封装（dual inline package，DIP）开关的器件。在DIP中，有一系列极小的开关（从2到12个不等）。DIP是可以插在标准的IC插槽中的，如下图所示。

在一种称为比较器（comparator）的电路中，你可以把这个开关和总线上地址信号的高4位连接起来，就像下面这样。

21 总线

331

## PDF_PHYSICAL_PAGE_INDEX=348 | PRINTED_PAGE=332

回想一下前面讲过的内容，异或（XOR）门电路在两个输入端中只有一个是高电平时，输出才为高电平；当两个输入端同时为低电平或高电平时，输出是低电平。

例如，如果把 $\mathbf { A } _ { 1 3 }$ 和 $\mathbf { A } _ { 1 5 }$ 对应的开关闭合，就意味着让存储器板能响应存储器空间A000h\~AFFFh。若总线上的地址信号 $\mathbf { A } _ { 1 2 }$ $\mathbf { A } _ { 1 3 }$ ${ \bf A } _ { 1 4 }$ 和 $\mathbf { A } _ { 1 5 }$ 与开关上设置的值相同的话，四个异或（XOR）门的输出都是0，或非（NOR）门的输出为1，如下图所示。

接下来我们把Equal信号和一个2-4译码器联合起来使用，就能为四个存储体中的每一个都产生一个 $\overrightarrow { \mathbf { C } \mathbf { S } }$ 信号，便于对存储体进行选择。具体连接图如下图所示。

例如，若想选择第三个存储体，把 $\mathbf { A } _ { 1 0 }$ 、 $\mathsf { A } _ { 1 1 }$ 分别置0和1就可以了。

现在回想一下在第16章中阐述过的如何组织RAM阵列，这一过程的细节是十分繁琐的，你可能会认为我们还需要8个4-1选择器，用来从4个存储体中选择正确的数据输出信号。但我们并没有这么做，下面来讨论下原因。

通常情况下，TTL兼容集成电路的输出信号要么大于2.2V（逻辑1）要么小于0.4V(逻辑 $0 \%$ 试想一下，如果把输出信号连接起来会发生什么呢？一个集成电路的输出为1，另一个集成电路的输出为0，若把这两个输出连接在一起，结果又是什么呢？恐怕谁也无法回答。就是由于这种不确定性，一般不会把集成电路的输出信号连接在一起。

编码—隐匿在计算机软硬件背后的语言

332

## PDF_PHYSICAL_PAGE_INDEX=349 | PRINTED_PAGE=333

2102芯片的数据输出信号是三态（tri-state）的，也就是说，除了逻辑0和逻辑1之外，数据输出信号还有第三种状态。我们必须清楚地认识这种状态一—它其实是一种“真空”态，就像芯片的引脚上什么也没连一样。当片选信号（CS）为1的时，2102芯片的数据输出信号就会进入这种状态。这样一来，我们可以把4个存储体相应的数据输出信号连接在一起，并且可以把8个输出复用作为总线的8个数据输入信号。

之所以强调三态输出的概念，是因为它对总线的操作是至关重要的。几乎所有连接在总线上的器件都使用由总线传递而来的数据输入信号。但不管何时，连接在总线上的电路板中只有一个能确定总线数据输入信号的类型，其他电路板处于三种状态中的无效状态。

或许大家听说过，2102是一款静态随机访问存储器芯片（Static Random AccessMemory，SRAM)，它与动态访问存储器(Dynamic Random Access Memory，DRAM)是不同的。通常对于每1位存储空间，SRAM需要用4个晶体管（在第16章中讲过将触发器作为存储器用，其用到的晶体管更多)，而DRAM只需要1个晶体管，但DRAM需要较复杂的外围支持电路，这正是它的缺点。

SRAM芯片，例如2102，在电源持续供电的情况下，其内容就能保留下来；一旦掉电，其内容就会丢失。在这方面，DRAM和SRAM很类似。但不同的是，DRAM芯片在使用时需要定期访问其存储器中的内容，尽管有时并不需要这些内容。这一过程称之为更新（refresh）周期，每秒钟都必须进行几百次。这种做法就好像为不让某人入睡而每隔一段时间就用手肘轻推他一样。

尽管业界在使用DRAM上有些争论，但近年来，DRAM芯片的容量日益增加，使得DRAM最终成为标准。1975年，英特尔公司推出了一款DRAM芯片，容量为16,384位。其实，DRAM芯片在容量上基本每三年翻两番，符合摩尔定律。如今，计算机主板上一般都配备内存插槽，这些内存插槽可以容纳几块小存储器板，分为单列直插内存模块(single inline memory modules，SIMM)和双列直插内存模块（dual inline memory module，DIMM)两种，里面包含好几个DRAM芯片。如今，花费不到300美元就可以买到128MB的DIMM了。

21 总线

333

下一段：[继续读取](https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=350&limit=10)
