PDF 物理页索引 210
文件中的第 211 页 · 印刷页码:194
下面我们来看一个例子,把79ACh转化成为十进制数。需要牢记在心的就是A和C分别代表10和12。
十进制数转换为十六进制数通常涉及除法运算。我们知道,小于或等于255的数用1个字节就足以表示,也就是两个十六进制数。如何来求出这两个数呢?通常可以用这个数除以16,分别得到商和余数,商作为结果保留,而余数则作为下次运算的除数。我们举一个先前讲过的例子来进一步阐述运算法则:十进制数182,除以16,商为11(在十六进制中表示为B),余数为6,所以它的十六进制为B6h。
如果被转化的十进制数小于65,536,那么就可以使用少于4位的十六进制数来表示。下面给出一个十进制向十六进制数转化的一个模板。
使用时首先把十进制写到左上角的方框里。这个方框代表着第一个被除数,然后除以第一个除数4096,得到的商放到被除数所对应的下面的方框里,而将余数放到被除数右边的方框里。这时将余数作为新的被除数去除以256。利用这个规则,通过反复迭代就可以得到最终结果。下面这幅图向我们展示了十进制数31,148转换成十六进制数的过程。
显而易见,十进制数的10和12代表着十六进制中的A和C,计算得到的最后结果就是 79ACh。
编码—隐匿在计算机软硬件背后的语言
194
PDF 物理页索引 211
文件中的第 212 页 · 印刷页码:195
这个方法存在一个小小的问题,那就是如果使用计算器帮助你进行除法运算,它不会显示每步运算得到的余数是多少。如果让计算器去运算31,148除以4096,它的屏幕上只会出现7.6044921875。我们可以用倒推的方法计算余数,用4096乘以7(得到28,672),从31,148中减去它,这是一种办法。也可以用4096乘以0.6044921875,也就是计算器运算结果的小数部分(现在市面上很多计算器已经具备了十进制和十六进制数之间的转换功能)。
还有一种转换小于65,535的十六进制数的方法,首先我们把原数通过除以256的方式将其分为两个字节。接下来对于每个字节,再分别除以16。下图是运算过程使用到的模板。
我们采用自顶向下的方式。每一次除法完成后,就将其得到的商放入除数左下方的方框里,而余数进入右边的方框里。下图举例说明了十进制数51,966的转换过程。
最后我们得到了四个1位的十六进制数字,其十进制值分别是12、10、15和14,转换过来就是CAFE,无论怎么看它都更像一个单词,很难想象它其实是一个数字(我想应该没人愿意点一杯叫做56,495的东西,然后把它当作咖啡喝下去吧)!
对于每种计数系统,我们都可以描绘出相应的操作运算表,下面是十六进制的加法运算表。
15 字节与十六进制
195
PDF 物理页索引 212
文件中的第 213 页 · 印刷页码:196
使用这张表可以方便地仿照一般的加法运算来对十六进制数进行加运算,如下例所示:
4A3378E2
+ 877AB982
D1AE3264
回忆一下第13章的内容,我们讨论过可以用一个2的补数来表示与其相对应的负数。如果我们处理的是带符号的8位二进制数,那么所有负数的最高位都为1。在十六进制系统中,最高位为8、9、A、B、C、D、E或F的两位带符号数都是负数,因为这些十六进制数对应的二进制数的最高位为1。例如99h可以表示无符号的十进制数153(你必须清楚它是单字节的无符号数),也可以表示十进制的-103(这时它被看做有符号数)。
奇妙的是,99h这个十六进制字节从某种意义上来讲,也代表着十进制的99!我们都非常想知道原因,不过这种说法似乎和先前所学到的所有东西相抵触。我会在第23章中进行详细解释。但在此之前,我们必须先讨论一下存储器方面的知识。
编码隐匿在计算机软硬件背后的语言
196
PDF 物理页索引 213
文件中的第 214 页 · 印刷页码:未识别
存储器组织
每天清晨,我们将自己从沉睡中唤醒,这时大脑的空白会很快被记忆填充。我们立刻会意识到自己身在何方,最近做了些什么事情,有什么计划和打算。有的事情我们很快就能想起来,但有时,我们大脑处于失忆状态,有那么几分钟发现自己什么都想不起来(就拿我来说,有时我就是想不起来怎么我上床时还穿着袜子),但总的来说,我们总是能够与自己的过去保持足够的连续性,继续新的生活,展开人生新的一页。
显然,人类的记忆似乎没有什么规律。仔细回想高中的几何课,或许你一下子就能想到是谁坐在你前面,或许你清晰地记得当老师讲到 QED(quod erat demonstrandum,证明与推论)这个概念的时候消防演习开始了。
人类的记忆也并非能面面俱到。书面记录这种技术的引入,从某种层面来讲,就是为了弥补人类记忆容易遗漏这一缺陷。或许在某天夜里凌晨三点,你从床上一跃而起,脑海中突然出现某个剧本的绝妙灵感。你立刻抓起床边提前预备的笔和纸,将它们全部记下防止遗忘,然后才安然入睡。一觉醒来的清晨,再次浏览这个绝妙的灵感,一个新的剧本构想跃然纸上(剧本的内容就是“一次邂逅,汽车追尾与爆炸”?仅此而已吗?)或许远不如此。
我们总是将需要的记住的内容事先记下来,在需要时拿出来阅读;习惯于将可能用到的事物先存起来,在需要时将它们取出。从技术角度来讲,这个过程称为先存储后访问。存储器的职责和作用就在于此,它负责保障这两个过程之间信息完好无损。我们每次存储信息都要利用不同种类的存储器。比如,保存文本信息的不二之选就是纸张,而磁带则更适于存储音乐和电影。
PDF 物理页索引 214
文件中的第 215 页 · 印刷页码:198
电报继电器(TelegraphRelays)—以一定形式组织起来构成逻辑门,然后再形成触发器同样具备保存信息的能力。在前面章节中我们讨论过,一个触发器可以对1位信息进行存储。这样的存储能力要存储一大堆的信息还远远不够,但它却为我们达到目标迈出了坚实的一步。其实知道了如何存储1位信息,很容易就可以想象出如何存储2位、3位或更多位信息。
在第14章的学习过程中,我们一起讨论过由一个反向器、两个与门和两个或非门构成的D型电平触发器,如下图所示。
当时钟输入为1,Q端输出与数据端输入保持一致。但当时钟输入跳变为0时,Q端输出将保持数据端最后一次的输入。除非时钟输入再次还原为1,之后的数据端输入不会影响输出。此触发器的真值表如下。
在第14章的讨论中,这种触发器可以由两种不同特性的电路来实现,而在本章我们仅选择其中一种目的就只是为了保存1位信息。为了更加清楚地表述,我们给输入和输出端重新命名,使其名称与功能相符,如下图所示。
编码—隐匿在计算机软硬件背后的语言
198
PDF 物理页索引 215
文件中的第 216 页 · 印刷页码:199
从结构上来讲,这套电路与先前所学到的是同一种触发器,只是命名的方式不尽相同,现在Q输出端被称为数据输出端(DataOut),时钟输入端(在第14章叫做保持位)命名为写操作端(Write)。就像信息可以被记录在纸上一样,写操作端的信号同样使得数据输入(DataIn)信号被写入(WrittenInto),也可以称之为被存储(stored)到电路中。一般情况下,如果写操作端为0,则数据输入信号的状态对输出无影响。而当我们想把数据输入信号存储在触发器中时,可以把写入信号应先置1后置为 $\scriptstyle \mathbf { 0 } _ { \circ }$ 在第14章讲到过,这种类型的电路也被称为锁存器,因为存储进去的数据就好像被锁住了一样。下面给出了1位锁存器简化框图,框图未画出其内部结构中的部件。
我们很容易想到如何把多个1位锁存器组织成为多位锁存器,所要做的就是把写操作端的信号连接到系统中,就像下面这样。
图中显示的8位锁存器其输入和输出端各有8个。另外还包括一个写操作端,在非工作状态下一般为 $0 _ { \circ }$ 如果要把一个8位二进制数存储在锁存器中,首先要把写操作端置1,然后置0。我们同样可以把这个锁存器以框图的形式表现出来,就像下面这样。
16 存储器组织
199
PDF 物理页索引 216
文件中的第 217 页 · 印刷页码:200
为了和先前提到的1位锁存器保持一致,我们将它可以画成下面这种形式。
还有另一种方法集成8个1位锁存器,但其结构并不像上面的这样直观。假设我们只想用一个数据输入和输出信号端,而且希望锁存器能将输入信号数据分8次独立存储,这个任务可以在长达一天内完成,或者可能迅速在下一分钟内搞定。最后一项要求就是我们还希望能够通过观察数据输出信号端确定实际的8位输出。
换句话说,在这种锁存器中我们只想存储8个单独的比特,而不是存储1个8位二进制数。
为什么会有这种需求呢?原因可能在于仅有一个灯泡!
我们知道现在所需要的是8个1位锁存器。先不去考虑数据如何存储在这些锁存器中,把重点放在如何用一个灯泡来确定锁存器的数据输出信号。最简单的方法就是把这个灯泡依次连接到每个锁存器上,分若干次来测试各个锁存器的输出,但是我们要追求更加自动化的方法。用开关来选择想要检查的锁存器是一个好的办法。
究竟需要多少个开关才能解决问题呢?我们可以把这个过程进一步抽象,问题变成了怎么样从8个物体中选出一个我们想要的,我们需要3个开关。这是因为通过3个开关连通与闭合的排列组合,总共可表示出8个不同的值:000、001、010、011、100、101、110和111。
现在我们手头上已有8个1位锁存器、3个开关、1个灯泡,此外在开关和灯泡之间还有另外一种装置,如下图所示。
编码隐匿在计算机软硬件背后的语言
200
PDF 物理页索引 217
文件中的第 218 页 · 印刷页码:201
这个“额外装置”就是图中的神秘盒子,顶部带有8个输入端,左侧也带有3个输入端。通过三个开关的闭合和断开,对顶部的输入进行8选1操作,输出结果被传递到其底部连接的灯泡,使其发光。
上图标注的“这是什么装置?”到底是什么呢?我们先前曾碰见过类似的东西,当时讨论的装置没有这么多的输入端。这种装置曾出现在第14章中第一个改进的加法机的电路中。在该电路中要在一行开关和一个锁存器的输出之间选择一个,作为加法器的输入,当时称其为2-1选择器。而我们现在所需要的正是8-1数据选择器(8-Line-to-1-LineData Selector)。
8-1选择器有8个数据输入端(在其顶部),以及3个选择输入端(在其左侧)。选择输入端的功能就是选择一个输入端数据,然后使其在输出端输出。如果选择输入端为000,则将 ${ \bf D } _ { 0 }$ 锁存器的值输出;若选择端为111,则 $\mathbf { D } _ { 7 }$ 锁存器的值将被输出;若选择端为101,则相应地输出 $\mathbf { D } _ { 5 }$ 的值。系统的真值表如下所示。
16 存储器组织
201
PDF 物理页索引 218
文件中的第 219 页 · 印刷页码:202
8-1选择器主要组成部件为:三个反向器、八个4端口输入与门、一个8端口输入或门,系统的组织结构如下图所示。
这个电路看上去线路密布,要理解它是如何工作的,最好方式就是一起来看一个例子。假设S2初始化为1,S1初始化为0,So初始化为 $1 _ { \circ }$ 从顶部开始的第6个与门的输入由 ${ \bf S } _ { 0 }$ 、 $\overline { { \mathbf { S } } } _ { 1 }$ 、 ${ \bf S } _ { 2 }$ 组成,初始状态下它们全为1。其余与门的这三项输入数据都与第6个与门不尽相同,这使得其余与门输出全部为 $\mathbf { 0 } _ { \circ }$ 若 $\mathbf { D } _ { 5 }$ 变为0意味着第6个与门输出为0;反之第 ${ \bf 6 }$ 个与门输出则为 $\mathbf { l _ { \varphi _ { \circ } } }$ 对最右边的或门也可以按照同样的方式理解。我们可以总结出下面这个结论:若选择端为101,则数据输出端与 $\mathbf { D } _ { 5 }$ 的输出保持一致。
编码——隐匿在计算机软硬件背后的语言
202
PDF 物理页索引 219
文件中的第 220 页 · 印刷页码:203
让我们重新理一下思路,想想自已究竞要于什么。我们的目的是通过某种方式连接8个1位锁存器,使自已能够从一个输入信号端写入数据,还能从-一个输出信号端鉴别出数据。现在我们已经成功地使用了一个8-1选择器对8个锁存器进行了选择操作,并将相应锁存器的数据输出,下面是电路的结构图。
到这里我们只走完了长征的一半。既然输出端已经满足了要求,现在把注意力集中到输入端。
输入端包括了数据输入信号及写操作信号。可以把所有数据输入信号在锁存器的输入端连接在一起。但8个写入信号是不可以连在一起的,因为我们很可能要向每个锁存器依次写入数据。除此之外还需要一个独立的写入信号,它能被路由到任意(且唯一)的锁存器上,系统的结构可用下图表示。
16 存储器组织
203