---
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: 350
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020?start=350&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=350&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=340&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=360&limit=10"
---

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

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

## PDF_PHYSICAL_PAGE_INDEX=350 | PRINTED_PAGE=334

既然已经知道如何制作存储器板了，应该没有人会把微处理器的整个存储空间都分配给存储器，必须留些空间给输出设备。

电子射线管(cathode-ray tube，CRT)——20世纪上半个世纪，在家庭中常见的物件，它从外观上看就像电视机一样—已经成为最常见的计算机输出设备了。我们称连接到计算机上的CRT为视频显示器（video display）或监视器（monitor)，而称可以为视频显示器提供信号的电子元件为视频适配器（video displayadapter)。通常在计算机中，视频适配器是独立存在的，它们拥有自己的电路板，也就是我们常说的显卡（videoboard)。

表面上看来，视频显示器或电视机的二维图像很复杂，但实际上它是由一束连续的光束射线迅速扫描屏幕而形成的。射线从屏幕左上角开始，从左到右进行扫描，到达屏幕边缘后又折回向左，进行第二行扫描。我们称每一个水平行为扫描行（scanline)，称射线回到每个扫描行的开始位置为水平回归(horizontalretrace)。当完成了对最后一行的扫描时，射线不会停下来，它会从屏幕的右下角返回到屏幕的左上角（垂直回归，verticalretrace)，并重复上一过程。就拿美国的电视信号来说，每秒钟要进行60次（称为场频，fieldrate）这样的扫描。由于扫描的速度很快，所以不会看到图像出现闪烁的现象。

电视机采用的是隔行(interlaced)扫描技术，情况要复杂些。我们先来看一下帧(frame)的概念，帧是一个完整的静态视频图像，两个场（field）才能形成一个单独的帧。整个帧的扫描线分由两个场来完成偶数扫描线属于第一个场，奇数扫描线属于第二个场。这里要说明一下水平扫描频率（horizontal scan rate）的概念，即扫描每个水平行的速率，例如15,750Hz。把这个数除以60Hz，结果是262.5行，这正是每个场所包含的扫描线的数目，整个帧的扫描线的数目是场的两倍，也即525行。

不管隔行扫描技术是怎样实现的，组成视频图像的连续射线都是由一个连续的信号所控制。虽然一套电视节目的声音和图像部分是一起播出的，但若想把它们广播出去或者通过有线电视系统传送出去，就不得不分开进行。这里所说的视频信号其实与VCR、录像机、摄像机及一些电视机上的视频输入或输出信号是一样的。

黑白电视机的视频信号十分简单且易于理解（彩色电视机要稍微复杂些)。每秒钟扫描 60次，扫描信号包含一个垂直同步脉冲(vertical sync pulse)，用来指示一个场的开始。这个脉冲为 0 V，宽度约为 400 ms。相比较而言，水平同步脉冲（horizontal sync pulse）则用来指示每个扫描行的开始：视频信号为0V，宽度为5ms，每秒钟出现15,750次。

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

334

## PDF_PHYSICAL_PAGE_INDEX=351 | PRINTED_PAGE=335

在两个水平同步脉冲之间，信号的电压是在0.5\~2.0V范围内变化的，其中0.5V表示黑色，2.0V表示是白色，处于两者之间的电压则表示一定的灰度。

正是由于上述原因，电视才会出现部分是数字图像、部分却是模拟图像的情况。虽然在垂直方向上，图像被分为525行，但每个扫描行的电压却是连续变化的用来模拟图像的可视强度。这并不等于说，电压可以随意地变化。事实上，电视机能响应的信号变化频率是有上限的，我们称这一上限为电视机带宽（bandwidth)。

在通信领域中，带宽是极其重要的概念，某个特定的传输媒介能够传输的信息量都是受带宽限制的。以电视机为例，带宽限制了视频信号从黑到白然后又回到黑这一变化的速率。对于美国的广播电视来说，带宽大约为4.2MHz。

一旦我们把视频显示器连接到计算机上，就不该把它作为模拟和数字的混合设备来对待，把它看做是完完全全的数字设备更合适一些。从计算机的角度来说，我们可以很方便地把视频图像想象成由离散点组成的矩形网格，这些离散点称为像素（这一术语来自picture element)。

水平扫描行上像素的个数是受带宽严格限制的。在这里，我把带宽定义为视频信号从黑到白然后又回到黑的变化速率。如果电视机的带宽为4.2MHz，它就允许2个像素每秒420万次的变化，或者—用2×4,200,000除以水平扫描速率15,750每个水平扫描行有533个像素。但并不是所有的像素都可用，约1/3的像素被隐藏了起来—处于图像的远端或射线的水平回归中。这样算来，水平扫描行上可用的像素约为320个。

与水平方向类似，垂直方向上525个像素也不是都可用。原因是，像素在屏幕的顶部、底部以及垂直回归期间都会有所损失。当计算机采用电视机作为显示器时，就不依赖于隔行扫描技术了，垂直方向上有着合理的像素数目200。

因此我们可以说，早期普通电视机上的视频适配器的分辨率为320×200，即水平方向上有320个像素、垂直方向上有200个像素。

21 总线

335

## PDF_PHYSICAL_PAGE_INDEX=352 | PRINTED_PAGE=336

如何确定上面网格中像素的总数呢？你可以去数一下，也可以简单地用320乘以200得出结果64,000。每个像素可以是黑色或白色，或者为某一特定的颜色，这要取决于视频适配器的配置。

现在我们想在显示器上显示出一些文本字符，那么到底能显示出多少呢？很明显，这取决于每个字符所用的像素数。下面是一种可行的方法，每个字符使用8×8的网格（64个像素)。

上图中显示出的字符对应的 ASCII码在20h\~7Fh区间（在00h\~1Fh的 ASCII码字符都是无法显示的字符)。

每个字符都被定义为一个7位的ASCI码，但每个字符也与64比特（位）相关，这64比特决定了字符会显示为什么样子。当然，你也可以把这64位信息当做代码看待。

上面我们对字符进行了定义，使用这些定义，分辨率为320×200视频显示器的每一屏就能显示25行、每行40个字符，足够把艾米·洛威尔（AmyLowell，1874-1925）的一首短诗显示出来，看看下面的图。

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

336

## PDF_PHYSICAL_PAGE_INDEX=353 | PRINTED_PAGE=337

视频适配器中必须配置一些RAM，用以存储所显示的内容；微处理器也必须能够向此RAM中写入数据以改变显示器上显示的内容。更方便的是，这个RAM也是微处理器存储空间的一部分。那么，上面描述的显示适配器需要多大的RAM呢？

这个问题并不太好回答！我们只能说，结果可能处于1KB\~192KB之间。

我们从最简单的情况去考虑。怎样减少显示适配器的内存需求呢？一种方法是限制适配器的功能，让其只显示文本。我们已经明确地知道，视频显示器的每屏幕能显示25行、每行40个字符，也可以说，总共能显示1000个字符。这样一来，视频卡上的RAM只需存储这1000个字符的7位ASCI码。1000×7bit，大小约为1024字节，即1KB。

字符生成器（character generator）也是视频适配器板上的一部分，包含了所有ASCII码字符的像素图，这点前面已经讲过。通常，它是只读存储器（read-only memory），即ROM。它是一种集成电路，在生产时里面已经填入了数据，固定的地址输出的数据是不变的。ROM中并没有数据输入信号，这点与RAM不同。

你可以把ROM看成是可以进行代码转换的电路。每片ROM都有7个地址信号（用来表示 ASCII码)及 64个数据输出信号，里面存储了128个ASCII码字符的8×8像素图。因此，ROM可以实现7位ASCI码到64位码（定义了字符显示的外观）的转换。但是你有没有想过，64个数据输出信号会使芯片变得很大。更合适的做法是，用10个地址信号和8个输出信号。其中7个地址信号是用来确定ASCI码字符的（这7个地址位来自视频板上RAM的数据输出)。其他三个地址信号则用来表示行。举个例子来说，最高行用000表示，最低行用111表示。8个输出位就是每行的8个像素。

我们来做个假设，ASCI码为41h，就是大写的字母A。总共有8行，每行8位。下表给出了字母A的10位地址（ASCI码和行代码之间用空格分开）和数据输出信号。

21 总线

337

## PDF_PHYSICAL_PAGE_INDEX=354 | PRINTED_PAGE=338

从上表中，你能看出以0为背景、用1表示的字母A吗？

只显示文本的视频显示适配器还必须支持光标（Cursor）功能。光标是一个小小的下画线，用来表明从键盘上输入的下一字符会在屏幕的什么位置显示出来。光标所在的行和列常被存储在两个8位的寄存器中，这两个寄存器也是视频板的一部分，而且微处理器可以对其进行写操作。

有的显示适配器不仅仅只显示文本，还可以显示其他数据，我们称这样的显示适配器为图形适配器（图形显卡）。通过向图形显卡上的RAM写入数据，微处理器就可以画出图形了，当然能显示各种大小和样式的文本。相比较而言，图形显卡要比只显示文本的显卡所需的存储空间更大。320×200的图形显卡有64,000个像素，如果每个像素需要1位RAM，那么这样的图形显卡就需要64,000位的RAM，即8000字节。然而，这只是最低的要求。1位是和1个像素相对应的，只能用来表示两种颜色—例如黑白两色。0可能对应于黑色像素，1可能对应于白色像素。

让我们仔细观察一下黑白电视机，很快会发现，它们不仅仅只显示黑色和白色，还能显示不同灰度的色彩。为了让图形显卡拥有这种功能，通常每个像素对应于RAM中的一整个字节，其中00h表示的是黑色，FFh表示的是白色，介于两者之间的数值对应不同的灰度。一个320×200的视频板若能显示256种灰度，就需要64,000字节的RAM。这与一直在讨论的某个8位微处理器的整个地址空间非常接近。

如果想显示出丰富多彩的颜色，每个像素就需要至少3个字节。如果现在你手头有放大镜的话，不妨用它观察一下彩色电视机或计算机视频显示器，你会发现，每种颜色都是由红、绿、蓝三原色的不同组合而形成的。为了获取所有的颜色，三原色中每种颜色的强度都需要用一个字节来表示。这么算来，就需要192,000字节的RAM（更多有关彩色图形的内容将在本书最后一章介绍)。

图形显卡到底能显示出多少种不同的颜色呢？这与每个像素所赋予的比特数是有关的。对于这种关系，你可能会感到很熟悉，因为本书中讲到的很多编码都与之类似，它们都涉及2的幂，它们之间的关系如下：

$$
3 ) \textcircled { \div } \frac { 2 } { 3 } \times \frac { 3 } { 2 } = 2 \frac { 3 + 1 0 + 1 0 + 1 0 + 1 2 \times 4 + 1 4 } { 2 }
$$

在标准的电视机上，320×200的分辨率是所能达到的最高分辨率。正是由于这样的原因，我们要为计算机特制显示器，以使其具有比电视机更高的带宽。1981年，第一台显示器随IBMPC一起销售，它可以显示25行，每行80个字符。这正是使用在IBM大型机上的CRT显示器能显示的字符数目。对于IBM来说，80个字符具有特殊的意义，为什么这样说呢？因为它和IBM的打孔卡片（punch card）上的字符数目一样。的确，早期连接到主机上的CRT显示器常被用来显示打孔卡片上的内容。偶尔，你会听到有人称只显示字符的视频显示器为卡片，当然这是一种过时的叫法。

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

338

## PDF_PHYSICAL_PAGE_INDEX=355 | PRINTED_PAGE=339

这么多年以来，视频适配器的分辨率以及能显示的颜色不断增加，这两者也成为了视频显示适配器的重要参数。到了1987年，水平640像素、垂直480像素的视频适配器被 IBM的 PS/2 个人计算机和苹果公司的Macintosh Ⅱ机采用，这种适配器的出现起到了里程碑的作用，因为从那时起640×480就是视频分辨率的最低标准了。

640×480的分辨率具有很重要的意义。也许你可能无法相信，它之所以那么重要，是因为它和托马斯·爱迪生（ThomasEdison，1847-1931）有关。大概在1889年，爱迪生及他的工程师威廉·肯尼迪·劳里·迪克生（William Kennedy Laurie Dickson）正在进行活动电影摄影机和活动电影放映机的研究，他们决定：让电影图像的宽比高多出1/3。图像的宽和高之比，称为屏幕长宽比（aspect ratio)。通常，我们把爱迪生和迪克生所确定的这个比表示成1.33:1，或者不想使用小数点的话，就表示成4:3。60多年了，大多数电影一直采用这个比例，电视机也是如此。但在20世纪50年代早期，好莱坞引入宽屏(widescreen）技术，与电视展开竞争，并最终打破了这个比例。

多数计算机的显示器的长宽比也是4:3，如果你不信的话，可以用尺子实际量一下，就可以证明我所说非虚。640×480分辨率也是这个比例。这就说明（打个比方）100个像素的水平线和100个像素的垂直线有着相同的物理长度。对于计算机图形学来说，这是个非常重要的特性，我们称为正方形像素（squarepixel)。

如今，视频适配器和显示器都支持640×480的分辨率，但同样也支持多种其他的视频模式，包括800×600、1024×768、1280×960、1600×1200。

我们常常认为计算机的显示器和键盘之间存在某种联系——在键盘上输入什么，显示器就会显示什么但物理上它们是分开的。

其实键盘上的每个按键就是一个简单的开关。按键按下，开关就会闭合。现在个人

339

21 总线

## PDF_PHYSICAL_PAGE_INDEX=356 | PRINTED_PAGE=340

计算机的键盘有100多个按键，但类似于打字机的键盘可能只有48个按键。

如果要让连接到计算机上的键盘能正常工作的话，就需要配备一些硬件来为每个按键提供唯一的代码，以便区分哪一个按键被按下了。假定这个代码就是按键的ASCI码，这样可行吗？你的答案或许是肯定的，但要设计出能识别ASCI码的硬件却是不切实际的。举例来说，键盘上的按键A对应的ASCI码可能是41h，也可能是61h，具体是哪个，还取决于用户是否按下了Shift键；另外，现在计算机键盘上有很多的按键并没有ASCII码与之对应。我们称键盘硬件提供的代码为扫描码（scan code)。当按下键盘上的某个按键时，一小段计算机程序就会计算出这个按键对应的ASCI码（如果有的话）。

这里为了避免键盘硬件的电路图太复杂，假设键盘上只有16个按键。任何一个按键被按下，键盘硬件就会产生一个4位的代码，二进制数值范围是0000到1111。

键盘硬件包含了一些前面曾讲过的部件，如下图所示。

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

340

## PDF_PHYSICAL_PAGE_INDEX=357 | PRINTED_PAGE=341

对应的16个编码间快速且重复地循环着，循环的速度必须足够快，以保证在按下并松开一个按键之前循环已经结束。

4位计数器的输出同样也是2-4译码器和4-1数据选择器的输入。在没有按键按下的情况下，选择器的输入全都不为1，因此，其输出也不为1；一旦有某个按键被按下，而且与4位计数器某一特定输出相对应，那么选择器的输出就为1。例如，如果右上角对角线方向的第二个开关被按下，且计数器的输出是0110，选择器就会输出1，如下图所示。

扫描码的位数是由键盘上按键的数目确定的。如果键盘上有64个键，就需要6位的扫描码，也就需要一个6位的计数器。用一个3-8译码器和一个8-1选择器就可以把这些按键组成一个8×8的阵列。如果键盘上的按键数目为65\~128个，就需要7位的扫描码。你就可以用一个4-16译码器和一个8-1的选择器（或者一个3-8译码器和一个16-1选择

21 总线

341

## PDF_PHYSICAL_PAGE_INDEX=358 | PRINTED_PAGE=342

器）把这些按键组成一个8×16的阵列。

在这个电路中，接下来将会发生什么事情呢？这取决于键盘接口。每个按键都应该在RAM中拥有1位的存储空间，这是设计键盘硬件时该考虑的事情。而且这些RAM是由计数器寻址的，RAM的内容为0或1，具体是什么值取决于按键按下（RAM为1）与否（RAM为0)。微处理器是可以读取RAM中的内容的，并通过内容判断每个按键的状态。

中断信号是键盘接口一个很有用的信号。回想一下前面讲过的内容，我们知道8080有一个输入信号允许外部设备中断当前微处理器正进行的工作。微处理器是通过从内存中读取一条指令来响应中断的，通常是一条RST指令。这条指令使微处理器跳转到内存中一个特定的区域并执行其中的中断处理程序。

最后，我们要介绍一下能够长期存储信息的外围设备。前面曾提到，无论是用继电器、电子管，还是用晶体管作为介质构成随机访问存储器，一旦掉电，它存储的内容就会丢失。正因如此，能够在掉电时长期保存信息的存储器，是一台完整的计算机不可或缺的组成部分。长期以来，人们通过在纸上或卡片上打孔来保存永久信息，IBM打孔卡片是其中典型的代表。在早期小型计算机中，为了能够长久保存程序和数据，通常在滚动的纸带上打孔，而在需要时，这些程序和数据可以从纸带加载到内存。

打孔卡片和纸带的使用也不是尽善尽美的，它也存在一些问题。首先是介质的不可重用性，一旦打孔卡片或纸带被打孔后就很难还原为原来的状态。其次是效率很低，假如你有机会看到当时纸带上保留的某一比特信息，就会发现这种做法实在太浪费纸带了。

正是由于这些原因，打孔卡片和纸带慢慢退出了历史的舞台。磁介质存储器(magneticstorage)逐渐发展成目前最为流行的长期存储器。磁介质存储器的起源要追溯到1878年，这一年美国工程师奥柏林·史密斯（OberlinSmith，1840-1926）描述了它的工作原理。1898年，即工作原理被提出20年后，第一块可用的磁介质存储器问世，它由丹麦发明家巴尔德马尔·波尔森（ValdemarPoulsen，1869-1942）制造。波尔森后来发明了录音电话机，当家里没人时，通过它可以记录收到的电话信息。声音通过电磁铁和可变长度的金属丝来记录，其中电磁铁是电报机里很常见的部件，它根据声音的高低来磁化金属丝。当磁化的金属丝切割电磁线圈运动的时候，产生的电流强度与其磁化程度有关。不论使用何种磁化介质，记录和读取信息都是利用电磁铁的磁头（head）来完成的。

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

342

## PDF_PHYSICAL_PAGE_INDEX=359 | PRINTED_PAGE=343

1928年，澳大利亚发明家弗里茨·佛勒玛（FritzPhleumer）发明了一种磁记录设备，并为其申请了专利。此设备采用在生产香烟上的金属带时所用的技术，将铁粒子覆盖在很长的纸带上。不久以后，纸带被强度更高的醋酸盐纤维素取代，而一种更耐久、更知名的记录介质也从此诞生一卷轴式磁带，它被包装在塑料盒里，可以很方便地使用。对于记录和回放音乐及视频来说，卷轴式磁带无疑是很受欢迎的介质。

1950年，雷明顿兰德公司（RemingtonRand）发明了第一个用于记录计算机数字数据的商用磁带系统。当时，磁带的容量有限，一个0.5英寸的卷轴式磁带容量只有几兆字节。在早期家用计算机中，常见的盒式磁带录音机被人们用来保存信息。通过调用一些小的程序，可以将内存块中的内容保存到磁带上，以后再需要时还可以从磁带调入内存中。在第一代IBMPC上，有一个专为连接盒式磁带存储器而设计的接头。至今，磁带仍然是一种很通用的存储介质，对于那些想要长期保存的文档，磁带更是首要的选择。但是，磁盘并不是最理想的存储介质，想要快速地移动到磁盘的任一位置是不可能的，它只能顺序访问，频繁地快进和倒带会花费很多时间。

以几何学角度来看，磁盘是能够实现快速访问的介质。磁盘围绕其中心旋转，连到臂上的一个或多个磁头从磁盘外沿向中间移动，通过磁头可以快速访问磁盘上的任何区域。

在记录声音信息方面，磁盘实际上要早于磁带。早在1956年，IBM公司就发明了世界上首款用来存储计算机数据的磁盘驱动器，称为 RAMAC(Random Access Method ofAccounting and Control，计算与控制过程中的随机访问模式)，它由 50 个金属盘片组成，直径2英尺，存储量为5MB。

自从磁盘被用作记录信息以来，它的体积越来越小而容量越来越大，习惯上将磁盘分为软盘(floppy disk)和硬盘(hard disk，或fixed disk)。软盘是由单面覆盖磁性物质的塑料片组成，外面由厚纸板或塑料包装，起到保护作用（塑料包装主要是防止磁盘弯折，虽然现在的磁盘看起来不像以前的软盘那么松软，而且还有很多的区别，但软盘这个名字一直在用，延续至今)。在使用软盘的时候，必须将其插入到软盘驱动器，软盘驱动器是一个连接到计算机的部件，通过它可以读/写磁盘中的内容。早期的软盘直径为8英寸，第一代IBMPC使用的是5.25英寸的软盘，不过，现在最流行的是3.5英寸的软盘。软盘有很大的灵活性，可以实现在不同计算机之间传递数据。对商用软件来说，磁盘仍然是

21 总线

343

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