RAM阵列

clip_image002

本人节选自《编码——隐匿在计算机软硬件背后的语言》一书

    让我们来看一下它是怎样工作的:当清零开关第一次断开时,RAM阵列的地址输入是0000h。RAM阵列的该地址中存放的8位数值是加法器的输入数据。加法器的另一个输入数据为00h,因为此时锁存器也已经清零了振荡器提供的时钟信号——一个可以在0,1之间快速切换的信号。清零开关断开后,当时钟信号由0跳变为1时,将有两件事同时发生:锁存器保存加法器的计算结果,同时16位计数器增1,指向RAM阵列的下一个地址单元。清零开关断开之后,时钟信号第一次从0跳变为1时,锁存器就将第一个数值保存下来,同时计数器增加为0001h;当时钟发生第二次跳变时,锁存器保存之前两个数的求和结果,同时计数器增加为0002h;按这种方式往复操作。

    要注意的是,这里首先做了一些假设。最主要的一点就是,振荡器要足够慢以使电路的其他部分可以工作。每次时钟振荡的过程中,在加法器输出有效的结果之前,一些继电器必须去触发其他继电器。

    这个电路存在的一个缺陷是:我们没有办法使它停下来。在某一个时刻,所有灯泡会停止发光,因为RAM阵列的剩余部分存放的数都是00h。这时,你可以读取二进制的运算结果。但是当计数器达到FFFFh时,它会重新回滚(roll over)到0000h(这就好像汽车的里程表一样),这时自动加法器会再一次把所有的数累加到已经计算出来的结果中去。

    这个加法器还存在另一个问题:它只能做加法运算,并且只能做8位数的加法。在这个RAM阵列中,不但每一个数要小于255,而且任意个数相加的结果也要小于255。此外,该加法器也不能处理减法运算,尽管可以用2的补数表示负数,但在这种情况下加法器能处理的数字的范围被限制在-128到127之间。要处理更大的数(例如,16位数)的话,一个简单的方法是:把RAM阵列、加法器、锁存器的位宽全都加倍,同时增加8个灯泡。但这些投资在我们看来是不合算的。

    当然,这里提到这个问题的原因是最终我们要解决它。但首先来关注另一个问题:如果你不需要把100个数加在一起呢?如果你想做的是用自动加法器把50对数分别相加,得出50个不同的结果呢?或者你需要一种万能机,它可以方便地对两个数,10个数甚至100个数求和,并且所有的计算结果都可以很方便地使用。

    先前提到的自动加法器都是用连接在锁存器上的灯泡来显示运行结果的,但是如果你想对50对数分别求和的时候,这就不是一个好的方法了。你可能会想到把运算结果存回到RAM阵列中去,这样的话,就可以在适当的时候用RAM阵列的控制面板来检查运算结果。为了实现这个目的,控制面板上专门设计了灯泡。

    这意味着我们可以去掉与锁存器连接的灯泡,取而代之的是把锁存器的输出端连接到RAM阵列的数据输入端,这样就可以把计算结果写回到RAM阵列中去,如下图所示。

clip_image002

    上图中略去了自动加法器的其他部分,其中包括振荡器和清零开关,这是因为我们不再需要特别标注计数器和锁存器的清零及时钟输入。此外,既然我们现在已经开始利用RAM的数据输入,因此需要一种用来控制RAM写入信号的方法。

    现在我们不需要担心电路能否工作,而要把注意力集中到急需解决的问题上来。目前的当务之急是如何配置一个自动加法器,使它不仅仅可以对一组数字做累加运算,还希望它能够自主地确定要累加多少个数字,而且还能记住在RAM中存放了多少个计算结果,这样就可以简化查询工作。

    例如,假设我们先要对三个数进行求和,然后对两个数进行求和,最后再对三个数进行求和。想象一下,我们可以把这些数保存在RAM阵列中以0000h开始的一组空间中,这些数存储在RAM阵列中的具体形式如下图所示。

clip_image004

    本书中将用这样的形式表示一小段存储器。方格表示的是存储器的内容。存储器的每一个字节写在一个方格里。地址标记在方格的左边,并不是每一个地址都需要标记,因为地址是线性的,所以总是可以通过计算确定某个方格对应的地址。方格右边是关于该存储单元内容的注释,这些标记的单元就是我们想要自动加法器保存三个计算结果的位置(尽管这些方格画出来是空的,但是存储单元内并不是空的,它们总是保存着一些东西,就算只是一些随机数,但此时存放的是一些没有用的数)。

    或许大家都有一种冲动,想亲自去做十六进制计算,并把结果填到那些小格子中去,但这并不是实验的目的,我们想要自动加法器为我们做这些加法。

    我们并不希望自动加法器成为单任务系统——在它的第一个版本中,只是把RAM地址中的内容加到称为累加器的8位锁存器中——实际上我们希望它能做四件事:进行加法操作,首先它要把一个字节从存储器中传送到累加器中,这个操作称为加载(Load)。第二个操作把存储器中的一个字节加(Add)到累加器的内容中去。第三个操作把累加器中的计算结果取出并存放到存储器中。另外我们需要用一个方法令自动加法器停(Halt)下来。

    我们借助具体的例子详细介绍这一过程,以上文提到的自动加法器所做的运算为例来说明。

(1)把0000h地址处的内容加载到累加器。

(2)把0001h地址处的内容加到累加器中。

(3)把0002h地址处的内容加到累加器中。

(4)把累加器中的内容存储到0003h地址处。

(5)把0004h地址处的内容加载到累加器。

(6)把0005h地址处的内容加到累加器。

(7)把累加器中的内容存储到0006h地址处。

(8)把0007h地址处的内容加载到累加器。

(9)把0008h地址处的内容加到累加器。

(10)把0009h地址处的内容加到累加器。

(11)把累加器中的内容存储到000Ah地址处。

(12)令自动加法器停止工作。

    这里要注意,同最初的自动加法器一样,存储器中的每一个字节的地址仍然是以0000h为起点线性排列的。最初的加法器只是简单地把存储器指定地址的内容和累加器中的内容相加,在某些情况下需要这样做。但是有时我们需要把存储器中的某个值直接加载到累加器,或者把累加器中的值直接保存到存储器。做完了这些工作,算得上万事俱备只欠东风了,我们还希望自动加法器能方便地停下来,以便于查看RAM阵列中存放的值。

    该如何来完成这些工作呢?能不能仅仅简单地向RAM阵列中输入一组数,然后期待自动加法器正确地完成所有工作呢?答案是否定的。对于RAM阵列中的每一个数,我们还需要用一些数字代码来标识加法器要做的每一项工作:加载、相加、保存和终止。

    也许存放这些代码的最简单的方法(但肯定不是代价最小的)是把它们存放在一个独立的RAM阵列中。这个RAM应该和第一个RAM同时被访问。但是这个RAM中存放的是不需要求和的数,而是一些数字代码,用来标记自动加法器对第一个RAM中指定地址要做的一种操作。这两个RAM可以分别被标记为“数据”(第一个RAM阵列)和“代码”(第二个RAM阵列)。其结构如下图所示。

clip_image006

我们已经清楚地认识到新的自动加法器能够把数据求和的结果写入到第一个RAM阵列(标记为“数据”),而新的RAM阵列(标记为“代码”)则只能通过控制面板写入。

我们需要四个代码来标记新的自动加法器需要做的四个操作,这些代码可以任意指定。如下所示的是一种方案。

操作码

代码

Load(加载)

10h

Store(保存)

11h

Add(加法)

20h

Halt(停止)

FFh

为了使上面讨论的三组加法得以正常执行,你需要通过控制面板把如下值存入代码RAM阵列。

clip_image002[1]

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

作者:[美]佩措尔德(Petzold,C.)著

译者:左飞,薛佟佟 译

ISBN 978-7-121-10610-1

出版日期:2010年5月

定 价:55.00元

开本:16开

页码:392页

内 容 简 介

这是一本讲述计算机工作原理的书。不过,你千万不要因为“工作原理”之类的字眼就武断地认为,它是晦涩而难懂的。作者用丰富的想象和清晰的笔墨将看似繁杂的理论阐述得通俗易懂,你丝毫不会感到枯燥和生硬。更重要的是,你会因此而获得对计算机工作原理较深刻的理解。这种理解不是抽象层面上的,而是具有一定深度的,这种深度甚至不逊于“电气工程师”和“程序员”的理解。

不管你是计算机高手,还是对这个神奇的机器充满敬畏之心的菜鸟,都不妨翻阅一下本书,读一读大师的经典作品,必然会有收获。

本书购买地址:当当网 卓越网 中国互动出版网

同类书推荐:天书夜读:从汇编语言到Windows内核编程   石成器——Windows环境下32位汇编语言程序设计

本书详细信息:http://www.broadview.com.cn/10610

更多图书信息:www.broadview.com.cn

想即时获取更多图书及活动资讯,赶快加入博文视点读者俱乐部 吧!

posted @ 2010-05-17 08:06  博文视点(北京)官方博客  阅读(669)  评论(0编辑  收藏  举报