计算机系统:核心概念及软硬件实现(原书第5版)
作者 : [美] J. 斯坦利·沃法德(J. Stanley Warford)著
译者 : 贺莲 龚奕利 译
丛书名 : 计算机科学丛书
出版日期 : 2019-01-08
ISBN : 978-7-111-61684-9
定价 : 99.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 585
开本 : 16
原书名 : Computer Systems,Fifth Edition
原出版社: Jones and Bartlet Publishers
属性分类: 教材
包含CD : 无CD
绝版 :
图书简介

本书从逻辑门、微编码、指令集体系结构、操作系统、汇编、高阶语言和应用等层级,系统而全面地介绍了计算机系统、C++、信息表示、计算机体系结构、汇编语言、汇编级编译、语言翻译原理、进程管理、存储管理、组合电路、顺序电路、计算机组成。书后配有练习答案。本书全面而系统地介绍了计算机组成、汇编语言和计算机体系结构的核心概念。通过自顶向下的方法,引导读者探索不同规模的计算机系统以及抽象级。通过检查不同的抽象级如何彼此相关,来帮助读者了解计算机系统及其组件。

图书特色

图书前言

本书清晰详尽、循序渐进地揭示了计算机组成、汇编语言和计算机体系结构的核心思想。本书大部分以虚拟机Pep/9为基础,该虚拟机用于讲解经典冯·诺依曼机器的基本概念。这种方式的优点是,既教授了计算机科学的核心概念,又不会与相关课程的许多无关细节纠缠不清。该方式还为学生奠定了基础,鼓励他们思考计算机科学的基本主题。本书的范围也比较广泛,重点强调了与硬件及其相关软件的处理有关但却少有提及的计算机科学主题。
内容一览
计算机运行于多个抽象层,高抽象层上的编程只是其中的一部分。本书以图P-1所示的分层结构为基础,提出了计算机系统的统一概念。
按照图P-1的层次结构,本书分为七个部分:
App7层 应用
HOL6层 高级语言
ISA3层 指令集架构
Asmb5层 汇编
OS4层 操作系统
LG1层 逻辑门
Mc2层 微代码
用文字描述时通常是按照从上到下的顺序,从最高层到最低层。把ISA3层放在Asmb5层之前,以及把LG1层放在Mc2层之前讨论是为了教学目的。对这两个特例来说,暂时将顺序变为从下往上会更加自然一些,因为这样一来在构建高层时可以使用低层模块。
App7层。App7层是关于应用程序的独立一章,叙述了抽象层次的思想与二进制信息,并为本书其他章节搭建了框架。这一章还以典型计算机应用程序示例的方式描述了一些关系数据库的概念。
HOL6层。HOL6层也是一章,回顾了C编程语言。这一章假设学生已经学习过一些命令式语言,比如Java或Python,不一定是C。如果必要的话,指导老师可以轻易地把C语言示例翻译为其他常见的HOL6层语言。
这一章的重点在于C内存模型,包括全局和局部变量、带参数的函数,以及动态分配的变量。此外,还讲解了递归,因为它要依赖运行时堆栈的内存分配机制。函数调用中的内存分配过程阐释得相当详细,而且后续章节还会在较低抽象层上回顾这个机制。
ISA3层。ISA3是指令集架构层。这一层用两章来描述Pep/9——一种用于说明计算机概念的虚拟机。Pep/9是一个小型的复杂指令集计算机(CISC),也是冯·诺依曼计算机。它的中央处理器(CPU)包含一个加法器、一个变址寄存器、一个程序计数器、一个栈指针寄存器和一个指令寄存器。它有八种寻址方式:立即数寻址、直接寻址、间接寻址、栈相对寻址、栈相对间接寻址、变址寻址、栈变址寻址和栈间接变址寻址。在模拟只读存储器(ROM)中,Pep/9的操作系统可以从学生的文本文件中加载并执行十六进制格式的程序。学生可以在Pep/9模拟器上运行小程序,学习执行不会改变内存值的ROM存储指令。
学生将学习信息表示和位级计算机组成的基本原理。由于本书的中心主题是计算机各层间的相互关系,因此,Pep/9相关章节展示了ASCII表示(ISA3层)和C的char类型变量(HOL6层)之间的关系。此外,这些章节还展示了补码表示(ISA3层)和C的int类型变量(HOL6层)之间的关系。
Asmb5层。Asmb5是汇编层,它把汇编器的概念表示为两个层次——汇编层和机器层——之间的翻译器。它引入了Asmb5符号和符号表。
这里是统一方法派上用场的地方。第5章和第6章将编译器表示为从高级语言到汇编语言的翻译器。前面学生已经学习了一种特定的HOL6层语言C和一种特定的冯·诺依曼型机器Pep/9。这两章通过展示层次之间的对应关系来继续揭示它们之间的关系,其中包括:HOL6层的赋值语句与Asmb5层的装入/存储指令;HOL6层的循环和if语句与Asmb5层的分支指令;HOL6层的数组与Asmb5层的变址寻址;HOL6层的过程调用与Asmb5层的运行时栈;HOL6层的函数和过程参数与Asmb5层的栈相对寻址;HOL6层的switch语句与Asmb5层的跳转表;HOL6层的指针与Asmb5层的地址。
统一方法之美就在于可以在较低层次上实现C章节中的例子。比如,第2章递归示例说明的运行时栈就直接对应于Pep/9主存的硬件栈。学生可以通过两个层次之间的手动翻译来理解编译过程。
这种方法为讨论计算机科学中的核心问题提供了一种很自然的环境。例如,本书介绍了HOL6层的结构化编程,可以和Asmb5层的非结构化编程的可能性进行对比。书中讨论了goto争议、结构化编程/效率之间的折中,给出了两个层次上语言的实际例子。
第7章向学生介绍了计算机科学理论。现在学生已经对如何将高级语言翻译为汇编语言有了直观的了解,那么,我们就要提出所有计算中最基本的问题:什么可以被自动化?理论在这里自然又合适,因为学生现在已经知道了什么是编译器(自动化翻译器)必须做的。他们通过识别C和Pep/9汇编语言的语言符号来学习语法分析和有限状态机——确定性的和非确定性的。这一章包含了两种小语言之间的自动翻译器,说明了词法分析、语法分析和代码生成。词法分析器是有限状态机的实现。还有比这更自然的介绍理论的方法吗?
OS4层。OS4层用两章来讲述操作系统。第8章是关于进程管理的,其中有两节讲解了Pep/9操作系统的概念,一节是装载器,另一节是陷阱处理程序。七条指令具有产生软件陷阱的未实现的操作码。操作系统将用户正在运行进程的进程控制块保存到系统栈,中断服务例程解释该指令。通过具体实现一个挂起进程来强化操作系统中运行和等待进程的经典状态转换图。第8章还描述了并发进程和死锁。第9章阐述了关于主存和磁盘存储器的存储管理。
LG1层。LG1层用两章来讲述组合电路与时序电路。从布尔代数的定理开始,第10章强调了计算机科学的数学基础的重要性。它展示了布尔代数和逻辑门之间的关系,然后描述了一些常用的逻辑设备,包括一个完整的Pep/9算术逻辑单元(ALU)的逻辑设计。第11章用时序电路的状态转换图讲解了有限状态机的基本概念,还描述了常见的计算机子系统,包括双向总线、内存芯片以及双端口存储器组。
Mc2层。第12章描述了Pep/9 CPU的微程序设计控制部分,给出了一些示例指令和寻址方式的控制序列,还提供了有关其他指令和寻址方式的大量练习。这一章还介绍了装入/存储架构的概念,对比了MIPS精简指令集计算机(RISC)和Pep/9复杂指令集计算机(CISC)。此外,还通过对高速缓存、流水线、动态分支预测以及超标量机器的描述,介绍了一些性能问题。
教学建议
本书涵盖内容相当广泛,教师在设计课程时可以省略一些内容。我把第1~7章用于计算机系统课程,第10~12章用于计算机组成课程。
本书中,第1~5章必须顺序讲解,第6章和第7章可以按任意顺序讲授。我通常会省略第6章而直接讲第7章,开始一个大型软件项目——为Pep/9汇编语言的子集写汇编器,这样学生在一学期中有足够的时间完成它。第11章明显依赖于第10章,但这两章都与第9章无关,因此,第9章可以省略。图P-2是章节关系依赖示意图,总结了可以省略哪些章节。

图P-2 章节关系依赖图
第5版的变化
第5版中的每一章都有改进,主要集中在两个方面:一个是虚拟机从Pep/8变为Pep/9;另一个是内容上的变化。第二点涉及面太大,无法一一列出,这里只给出其中的主要变化。
HOL6语言——第5版中的HOL6语言从C++变为C。C作为系统编程语言更为常见,而且也更加适合计算机系统文本。上一版指出C++的内存模型包括在内存固定位置分配的全局变量、在运行时栈上分配的局部变量与参数以及从堆分配的动态变量。但C++是一种面向对象(OO)的语言,它的内存模型要复杂得多。相比C++,上述模型用C语言表述要更加精确一些。变化体现在三个地方:示例程序的输入/输出(I/O)用scanf()和printf()替代了cin和cout;在C的传递引用机制里,实际参数显式地使用地址运算符&,形式参数则使用对应的指针类型;堆的内存分配用malloc替代了new。
补充示例——第5版把之前每一章的简要人物传记改为不同的补充示例,放在特殊格式的文本框中。每一个补充示例都是该章所描述概念的真实示例。大多数章节都是描述Pep/9虚拟机的,这些章节的补充示例给出了Intel x86架构中相应部分的实现。新补充示例提供了与该架构一致的运行实例,学生能更好地理解虚拟机概念与真实实现之间是如何对应的。
新主题与扩展主题——第1章现在强调的是如何利用性能公式和带宽概念在空间和时间上量化二进制信息。QR代码和颜色显示是这些概念的详细示例。第3章描述了Unicode、UTF-32和UTF-8编码。第4章讨论了大端顺序和小端顺序。第7章用Java而不是C++语言实现示例翻译器。第12章的微代码示例使用了Pep/9 CPU模拟器新的UnitPre和UnitPost特性。双字节数据总线现在得到了模拟器的支持,这使得讨论主题可以扩展到内存对齐问题和新的.ALIGN伪指令。
Pep/9取代了前两版所用的虚拟机Pep/8。由于这两种机器指令集的不同,Pep/8的源程序和目标程序不能与Pep/9的兼容。不过只有几条指令会受到影响,多数还是和原来一样,包括八种寻址方式。Pep/9有下述变化:
RET代替了RETn——Pep/8有八种返回语句,分别为RET0,RET1,…,RET7。RETn从运行时栈释放n个字节,然后执行从函数调用的返回。这样做的理由是,返回之前总要释放局部变量,所以,如果汇编语言程序员不需要在返回前用ADDSP指令显式释放局部变量的话,程序就会更短一些。
虽然这种ISA设计在体系结构原理上可能是合理的,但在教学上却存在缺陷。问题是学生必须学习两种不同的概念:数据的释放机制和控制流的返回机制。将这两种不同的概念组合在一条语句中,在学习时可能会造成混淆。现在,Pep/9要求学生用ADDSP语句显式地释放局部变量。另一个格式上的优势是,函数结束时显式使用ADDSP释放局部变量直接与函数开始时用SUBSP分配局部变量相对应。
内存映射I/O——对Pep/8指令集中的所有指令来说,最不切实际的就是用于字符输入/输出的CHARI和CHARO。大多数真实计算机系统都把输入/输出映射到内存,Pep/9现在就是这样设计的。在新指令集中没有原生的输入/输出指令。相反,Pep/8的指令

被如下Pep/9指令所替代,其中的charIn是输入设备。

而Pep/8指令

也被如下Pep/9指令所替代,其中的charOut是输出设备。

在上述指令中,ad表示该指令的任意一种合法的寻址方式。符号charIn和charOut在Pep/9操作系统中定义,并作为机器向量保存在内存底部。它们的值会自动包含进汇编器的符号表中。
内存映射I/O的一个缺点是,Pep/8程序中的每一个CHARI和CHARO语句现在都需要编写为两条语句,这使得程序变长。不过,陷阱指令DECI、DECO、STRO与原来一样,这使得问题得以控制,因为原生I/O指令隐藏在它们的陷阱例程中。
学生通过从输入设备地址装入以及向输出设备地址存储直接学习内存映射I/O是如何工作的,这是非常有利的。这个要求还说明了内存映射的概念和用法,在Pep/8中,这是学生想要避开的问题。此外,这与第11章的地址解码示例也有很好的关联,它展示了怎样把一个八端口I/O芯片连接到内存映射。
新的原生指令CPBr——在Pep/8中,字节量必须用CPr比较,该指令比较两字节的对象。因此,比较也包括了高字节,有时在比较之前要清除寄存器的高字节。这使得进行字节比较的汇编代码有些复杂。
CPBr是新的字节比较指令,通过设置状态位而不再考虑寄存器的高字节。其结果代码更易于理解和编写。
改进的助记符——Pep/9重新命名了比较指令、装入指令和存储指令的助记符,如图P-3所示。新方案保留了比较中的CP、装入中的LD和存储中的ST,同时又在这组指令中一致使用字母W表示字(这是现在需要的),字母B表示字节。这个命名规则一致性更强,并且针对学生有遗忘“字”(Pep计算机中的双字节)含义的倾向,把字母W加到双字节指令的助记符中加强了对“字”的强调。
指令 Pep/9 Pep/8
比较字 CPWr CPr
比较字节 CPBr 不可用
装入字 LDWr LDr
装入字节 LDBr LDBYTEr
存储字 STWr STr
存储字节 STBr STBYTEr

图P-3 新的Pep/9指令助记符
新的陷阱指令HEXO——在Pep/9指令集中,与RETn和字符I/O指令一起删除的还有陷阱指令NOP2和NOP3,取而代之的是一条非一元陷阱指令HEXO。HEXO代表的是十六进制输出,存在于Pep/7中,现在在Pep/9中再次出现。它输出的一个字包含四个十六进制字符。
寻址方式的名称——Pep/9将栈变址间接寻址改为栈间接变址寻址,相应的汇编器符号也从sxf改为sfx。这个变化更准确地反映了寻址方式的语义,因为栈间接操作发生在变址操作之前。
扩展的MIPS内容——MIPS架构仍然是与Pep/9 CISC模型形成对比的RISC模型。其内容得到了扩展,对所有的MIPS寻址方式、指令类型以及它们在LG1层上的实现进行了更加广泛和系统的描述。在说明MIPS架构的同时,第5版也包括了对RISC设计原则更加宽泛的阐述。
本书特性
本书有几个独特的方面,使之有别于其他计算机系统、汇编语言和计算机组成方面的书籍。
以概念为核心——许多教科书试图跟上领域的变化,包括最新的技术发展。比如,最新外围设备的通信协议规范。通常,这类书通篇都在描述性地解释“设备是如何工作的”。本书避开了这类资料,而只选择基础的计算概念,掌握了这些就有了理解当前和未来技术的基础。例如,在掌握空间/时间折中概念的时候,让学生实践数字电路设计问题的方案比单纯阅读笼统的描述要重要得多。再举一个例子,通过学习如何在ISA指令的微代码实现中合并周期来掌握硬件并行的概念,才是最好的。
强调解决问题——在讨论某个主题时,如果只是采用听讲或阅读的方式,那么学生能记住的内容就很少;如果采用的是实践的方式,他们能记住的就会更多。本书强调解决问题,全书章节后面有将近400道练习,其中很多练习有多个部分。这些练习不会让学生重复课本中的原话,而是要求量化地解答、分析或者设计系统某个抽象层次上的程序或数字电路。
一致的机器模型——Pep/9机器是一个小型的CISC计算机,是描述系统所有层次的载体。学生可以清晰地看到抽象层次之间的关系,因为他们要在所有的层次上为这个机器编程或者设计数字电路。例如,当在LG1层设计ALU组件时,他们知道ALU在ISA3层的实现中应该在哪个位置。通过像编译器那样把C程序翻译成汇编语言,他们将学到优化编译器和非优化编译器之间的差别。在不同层次上都使用同样的机器模型对学习活动来说在效率上有很大的优势,因为模型从上至下都是一致的。不过本书也讲述了MIPS机器,对比了RISC设计原理和微程序设计的CISC设计。
完整的程序示例——许多计算机组成和汇编语言的书会受到代码片段综合征的影响。Pep/9的内存模型、寻址方式和输入/输出特性使得学生能写出完整的程序,而不只是代码片段,这些程序执行和测试起来也很容易。真实的机器,特别是RISC机器,有复杂的函数调用协议,涉及寄存器分配、寄存器溢出和内存对齐限制之类的问题。Pep/9是少数几种教学机之一(有可能是唯一一个),允许学生书写具有输入/输出的完整程序,可以使用全局变量和局部变量、全局数组和局部数组、传值调用和传引用调用、数组参数、具有转移表的switch语句、递归、具有指针的链式结构和堆。写完整程序的作业进一步实现了通过动手来学习的目标,而不是通过读代码片段来学习。
理论与实践相结合——有些读者注意到了,讲述语言翻译原理的第7章在计算机系统书中不常见。这种现象可悲地说明了计算机科学课程体系甚至计算机科学领域自身存在的理论和实践之间的鸿沟。既然本书讲述了HOL6层的C语言、Asmb5层的汇编语言和ISA3层的机器语言,而且都有一个目标,即理解层次之间的关系,那么一个更好的问题是:“为什么不能包括讲述语言翻译原理的一章呢?” 本书尽可能地加入理论以支持实践。例如,介绍布尔代数并将其作为一个公理系统,配合练习来证明定理。
广度和深度——第1~6章中的内容对计算机系统或汇编语言编程的书来说是很典型的,第8~12章对计算机组成的书来说是很典型的。在一本书中包括这么广泛的内容是很独特的,而且还在一个完整机器的各个抽象层次上使用一致的机器模型。数字电路LG1层内容的深度也是很特别的,它使得CPU的组成部分不再神秘。例如,本书描述了Pep/9 CPU的复用器、加法器、ALU、寄存器、内存子系统和双向总线的实现。学生学习逻辑门层的实现后,没有概念上的空洞,而如果只是泛泛地描述,学生就只能选择相信而不能完全理解。
本书回答了这个问题:“汇编语言编程和计算机组成在计算机科学课程体系中的位置是什么?”它提供了对无处不在的冯·诺依曼机器架构的深入理解。本书保持了独特的目标,即提供本领域内所有主要知识域的综合概述,包括软件和硬件的结合、理论和实践的结合。
计算机科学课程体系2013
本书第1版出版于1999年,从那时开始本书的目标就是通过一个虚拟机器(初版中是Pep/6)来讲解典型计算机系统全部七个抽象层之间的关系,从而统一呈现计算机系统。当时(甚至现在也是)本书的内容跨越了多个标准课程,增加了知识面的宽度,这样的做法同时牺牲了标准汇编语言、操作系统、计算机体系结构、计算机组成和数字电路设计课程中传统内容的深度。
最新的ACM/IEEE课程指南——计算机科学课程体系2013(CS2013) 特别指出领域快速扩张带来的课程挑战:
与计算机科学教育领域相关的主题越来越多样化,以及计算与其他学科的日益融合给这一努力带来了特殊的挑战。在教学内容增加和保持建议在本科教育背景下具备可行性和可操作性之间平衡是相当困难的。
对这一挑战的应对之一就是指导方针的不断演进,而这恰好就是本书从第1版起就坚持贯彻的方向。CS2013重组了之前的“知识体”,删除了一些旧领域,增加了一些新领域。指南中的一个新知识领域(Knowledge Area,KA)就是系统基础:
在以前的课程内容中,典型计算系统的交互层——从硬件构建块到架构组织,到操作系统服务,再到应用程序执行环境——都表示为独立的KA。而新的系统基础KA则为其他KA展示了统一的系统视角和共同的概念基础……
CS2013中新系统基础KA的目标与本书的目标是一致的,即为计算机科学的其他主题提出一个“统一的系统视角”和共同的概念基础。本书是一本成熟的教材,它难得地满足了最新计算机科学课程体系指南的这一重要新目标。
教辅资源
从出版商网站(go.jblearning.com/warford5e)可以获取下列资源。
Pep/9汇编器和模拟器。Pep/9机器在MS Windows、Mac OS X和UNIX/Linux系统上都可运行。汇编器的特性包括:
集成的文本编辑器。
在源代码中发现错误的地方插入错误消息。
对学生友好的、十六进制的机器语言目标代码。
能跳过汇编器,直接用机器语言编写代码。
能够重定义触发同步陷阱的未实现操作码的助记符。
模拟器的特性包括:
模拟的ROM,存储指令不能修改ROM中的内容。
在模拟的ROM中烧入了一个小的操作系统,包括一个装载器和一个陷阱处理程序。
一个集成的调试器,允许设置断点、单步执行、CPU跟踪和内存跟踪。
能以任何组合跟踪应用程序、装载器或操作系统的选项。
具备从无限循环中恢复的能力。
能够通过为未实现操作码设计新的陷阱处理程序来修改操作系统。
从应用程序中构建的每个示例都成为课堂演示的有用工具。
Pep/9 CPU模拟器。包括MS Windows、Mac OS X和UNIX/Linux系统版本,可以用在计算机组成课程中。CPU模拟器的特性包括:
颜色编码的展示通路,根据多路复用器的控制信号跟踪数据流。
操作的单周期模式,用GUI输入每个控制信号,立即展示信号的效果。
操作的多周期模式,学生可以在集成的文本编辑器中编写Mc2微代码序列并执行它们以便实现ISA3指令。
第5版的新特点:针对应用程序的每个微代码问题和每个示例的单元测试。
课程课件。一套完整的课件,每章约有50~125页PDF格式的课程幻灯片。幻灯片包括课本中所有的图和总结信息,通常以标号的形式给出。不过其中没有太多的例子,给教师展示示例和指导讨论留出了空间。
考试题目。提供一组考试题目,包括参考信息,例如ASCII表、指令集表等,供考试和自学之用。
数字电路实验。6个数字电路实验,能够让学生在物理实验电路板上亲身体验。这些实验说明了第10章和第11章的组合和时序设备,使用了许多本书中没讲到的电路。学生可以自学实际的数字设计和实现概念,这些超出了本书的讲述范围。实验时可以按照书中讨论的主题顺序,从组合电路开始,然后是时序电路和ALU。
答案手册。附录中有部分练习的答案,全部练习和编程题的答案对采用本书作为教材的教师开放。
若想了解指导教师如何获得访问上述资源的资格,请联系Jones & Bartlett Learning的代理商。
致谢
Pep/1有16条指令、一个累加器和一种寻址方式。Pep/2增加了变址寻址。John Vannoy用ALGOL W语言写了两个模拟器。Pep/3有32条指令,用Pascal语言编写,是学生软件项目,由Steve Dimse、Russ Hughes、Kazuo Ishikawa、Nancy Brunet和Yvonne Smith完成。Harold Stone在早期审阅中提出许多对Pep/3架构的改进意见,后来被加到Pep/4中,并延续到后续的机器中。Pep/4有特殊的栈指令、模拟ROM和软件陷阱。Pep/5有更正交的设计,允许任何指令使用任何寻址方式。John Rooker写了Pep/4系统和早期的Pep/5版本。Gerry St. Romain实现了Mac OS版本和MS-DOS版本。Pep/6简化了变址寻址方式,也包括了一组完整的条件分支指令。John Webb用BlackBox开发系统编写了跟踪功能。Pep/7把安装的内存从4KiB增加到了32KiB。Pep/8把寻址方式的数量从4增加到8,安装的内存增加到64KiB。Pep/8汇编器和模拟器的GUI版本由一组学生用Qt开发系统和C++实现和维护,小组成员包括Deacon Bradley、Jeff Cook、Nathan Counts、Stuartt Fox、Dave Grue、Justin Haight、Paul Harvey、Hermi Heimgartner、Matt Highfield、Trent Kyono、Malcolm Lipscomb、Brady Lockhart、Adrian Lomas、Scott Mace、Ryan Okelberry、Thomas Rampelberg、Mike Spandrio、Jack Thomason、Daniel Walton、Di Wang、Peter Warford和Matt Wells。Ryan Okelberry也参与编写了Pep/8 CPU模拟器。Luciano d’Ilori编写了汇编器的命令行版本。最新版本的Pep/8和Pep/8 CPU以及当前版本的Pep/9和Pep/9 CPU由Emily Dimpfl和本书作者用Qt重新编写。
Tanenbaum的《Structured Computer Organization》比其他任何一本书都更大地影响了本书的编写。本书扩展了Tanenbaum书中的层次结构,在上面增加了高级语言层和应用层。
许多书稿审阅者、学生和前一版本的用户极大地影响了本版本的终稿,他们是:Kenneth Araujo、Ziya Arnavut、Wayne P. Bailey、Leo Benegas、Jim Bilitski、Noni Bohonak、Dan Brennan、Michael Yonshiki Choi、Christopher Cischke、Collin Cowart、Lionel Craddock、William Decker、Fadi Deek、Peter Drexel、Gerald S. Eisman、Victoria Evans、Mark Fienup、Paula Ford、Brooke Fugate、Robert Gann、David Garnick、Ephraim P. Glinert、John Goulden、Dave Hanscom、Michael Hennessy、Paul Jackowitz、Mark Johnson、Michael Johnson、Amitava Karmaker、Michael Kirkpatrick、Peter MacPherson、Andrew Malton、Robert Martin、Johnon Maxfield、John McCormick、Richard H. Mercer、Jonathon Mohr、Randy Molmen、Hadi Moradi、John Motil、Mohammad Muztaba Fuad、Peter Ng、Bernard Nudel、Carolyn Oberlink、Nelson Passos、Wolfgang Pelz、James F. Peters III、James C. Pleasant、Eleanor Quinlan、Glenn A. Richard、Gerry St. Romain、David Rosser、Sally Schaffner、Peter Smith、Harold S. Stone、Robert Tureman、J. Peter Weston和Norman E. Wright。Joe Piasentin提供了艺术方面的咨询。有两个人极大地影响了Pep/8的设计:一位是Myers Foreman,有关指令集的很多想法都来自于他;另一位是Douglas Harms,他提出很多改进意见,其中之一是MOVSPA指令,使得可以用传引用方式传递局部变量。
Jones and Bartlett Learning的策划编辑Laura Pagluica、产品主管Amy Rose、制作编辑Vanessa Richards和编辑助理Taylor Ferracane提供了宝贵的支持,很高兴与他们一起工作。Kristin Parker设计的吸引人的封面正符合本书的风格。
我很幸运工作于一所致力于在本科教学中追求卓越的学校。佩珀代因(Pepperdine)大学的Ken Perrin提供了富有创造性的环境和专业的支持,正是在这种环境中,本书得以孕育成形。妻子Ann给予我无尽的支持,我要为本书占用的时间向她道歉,并送上我由衷的感谢。

J. Stanley Warford  
于加州马里布 

上架指导

计算机\计算机组成

封底文字

本书采用七层结构讲解计算机系统的核心概念及软硬件实现方法,关注基础的计算概念而非追踪新的技术进展,并且特别强调通过实践培养学生解决问题的能力。全书以Pep/9虚拟机模型贯穿各章,清晰呈现了各个抽象层次之间的关系,并配有完整的程序示例和丰富的习题。图书配套网站(computersystemsbook.com)提供了丰富的教学资源。

重要更新
Pep/9取代了前两版所用的虚拟机Pep/8。除了更新指令集外,Pep/9还采用了内存映射I/O,改进了部分指令的助记符,并扩展了MIPS内容。
高级语言从C++变为C。C作为系统编程语言更为常见,而且也更加适合计算机系统文本,从而能够更加精确地描述内存模型。
新增Intel x86架构的实现示例。作为补充材料,这些示例取代了上一版中的人物传记,以帮助读者理解虚拟机概念与真实实现的对应关系。
大量新主题与扩展主题。如用Java而不是C++语言实现翻译器、使用Pep/9 CPU模拟器新的UnitPre和UnitPost特性等,丰富了全书内容。

作者简介
J. 斯坦利·沃法德(J. Stanley Warford) 现为美国佩珀代因大学计算机科学系教授,曾任计算机科学系主任,由于杰出的教学成果而获得了Howard A. White优秀教学奖并被评为Luckman杰出教师。他从伦斯勒理工学院获得硕士学位,从加州大学洛杉矶分校获得博士学位。在进入学术界之前,Warford教授曾是一名航空工程师。

作者简介

[美] J. 斯坦利·沃法德(J. Stanley Warford)著:作者简介:
J. 斯坦利•沃法德(J. Stanley Warford) 现为美国佩珀代因大学(Pepperdine University)大学计算机科学系教授。Warford教授在进入学术界前是航空工程师,他任教30余年,曾担任佩珀代因大学计算机科学系主任。他从伦斯勒理工学院获得硕士学位,从加州大学洛杉矶分校获得博士学位。Warford教授获得Luckman杰出教学奖,是Pepperdine大学科学学部的Frank R. Seaver教授。

译者简介:
龚奕利 本科毕业于武汉大学,在中国科学院计算技术研究所获得博士学位,曾在美国印第安纳大学从事博士后工作和美国密歇根大学从事访问学者工作,现为武汉大学计算机学院副教授。主要研究方向为高性能计算和分布式系统,包括云计算和广域文件系统。翻译过《深入理解计算机系统》(第一、二版)等计算机专业书籍。

译者简介

贺莲 龚奕利 译:暂无简介

译者序

本书以计算机层次结构为主线,从LG1逻辑门层到App7应用层,内容涵盖数字逻辑、计算机组成、汇编语言和计算机体系结构等方面,主要包括计算机组织结构、时序电路、布尔代数和逻辑门、进程和存储管理、信息表示、汇编语言、C语言以及计算机系统。与之前的版本相比,本书使用的虚拟机从Pep/8变成了Pep/9,两者在机器指令集上存在不同,此外,Pep/9还采用了内存映射I/O,改进了部分指令的助记符,扩展了MIPS内容。
本书内容翔实,着重于基础计算概念,强调解决问题,使用一致的机器模型,配以完整的程序示例,在理论与实践相结合的基础上,注重内容的广度和深度。本书章节结构明晰,适用于相关课程教学,在进行课程设计时,可以根据需要选择不同的章节进行组合。
感谢机械工业出版社华章分社的编辑姚蕾,由于她的热心推荐,我们才有幸翻译了这本优秀的专业书籍。
在翻译中我们秉持认真细致的态度,但是由于能力所限,还是会存在错误与疏漏,希望广大读者批评指正。

贺莲 龚奕利
2018年11月于珞珈山

图书目录

出版者的话
译者序
前言
第一部分 应用层(第7层)
第1章 计算机系统 2
1.1 抽象层次 2
1.1.1 艺术中的抽象 3
1.1.2 文档中的抽象 4
1.1.3 机构中的抽象 5
1.1.4 机器中的抽象 6
1.1.5 计算机系统中的抽象 6
1.2 硬件 7
1.2.1 中央处理单元 8
1.2.2 主存储器 9
1.2.3 磁盘 10
1.3 软件 11
1.3.1 操作系统 12
1.3.2 软件分析与设计 13
1.4 数字信息 14
1.4.1 空间量化 14
1.4.2 时间量化 16
1.4.3 快速响应码 18
1.4.4 图像 21
1.5 数据库系统 27
1.5.1 关系 27
1.5.2 查询 28
1.5.3 语言结构 30
本章小结 31
练习 32
第二部分 高级语言层(第6层)
第2章 C 36
2.1 变量 36
2.1.1 C编译器 36
2.1.2 机器无关性 37
2.1.3 C的内存模型 37
2.1.4 全局变量和赋值语句 38
2.1.5 局部变量 40
2.2 控制流 42
2.2.1 if/else语句 42
2.2.2 switch语句 43
2.2.3 while循环 44
2.2.4 do循环 44
2.2.5 数组和for循环 45
2.3 函数 46
2.3.1 空函数和传值调用的参数 46
2.3.2 函数的例子 48
2.3.3 传引用调用的参数 48
2.4 递归 51
2.4.1 阶乘函数 52
2.4.2 递归的思考方式 55
2.4.3 递归加法 55
2.4.4 二项式系数函数 57
2.4.5 逆转数组元素顺序 61
2.4.6 汉诺塔 61
2.4.7 相互递归 63
2.4.8 递归的成本 64
2.5 动态内存分配 65
2.5.1 指针 65
2.5.2 结构 67
2.5.3 链式数据结构 68
本章小结 69
练习 70
编程题 71
第三部分 指令集架构层(第3层)
第3章 信息的表示 76
3.1 无符号二进制表示 76
3.1.1 二进制存储 76
3.1.2 整数 77
3.1.3 基数转换 78
3.1.4 无符号整数的范围 80
3.1.5 无符号加法 80
3.1.6 进位位 81
3.2 二进制补码表示 81
3.2.1 补码的表数范围 83
3.2.2 基数转换 84
3.2.3 数轴 85
3.2.4 溢出位 86
3.2.5 负数和零位 87
3.3 二进制运算 88
3.3.1 逻辑运算符 88
3.3.2 寄存器传送语言 89
3.3.3 算术运算符 90
3.3.4 循环移位运算符 91
3.4 十六进制与字符表示 92
3.4.1 十六进制 92
3.4.2 基数转换 92
3.4.3 ASCII字符 94
3.4.4 Unicode字符 97
3.5 浮点数表示 100
3.5.1 二进制小数 100
3.5.2 余码表示 102
3.5.3 隐藏位 103
3.5.4 特殊值 104
3.5.5 IEEE 754浮点数标准 108
3.6 模型 109
本章小结 111
练习 111
编程题 117
第4章 计算机体系结构 120
4.1 硬件 120
4.1.1 中央处理单元 120
4.1.2 主存储器 121
4.1.3 输入/输出设备 122
4.1.4 数据和控制 123
4.1.5 指令格式 123
4.2 直接寻址 126
4.2.1 停止指令 126
4.2.2 字装入指令 126
4.2.3 字存储指令 127
4.2.4 加法指令 128
4.2.5 减法指令 128
4.2.6 与和或指令 129
4.2.7 按位取反和取负指令 130
4.2.8 字节装入和字节存储指令 131
4.2.9 输入和输出设备 132
4.2.10 大端顺序和小端顺序 133
4.3 冯·诺依曼机器 134
4.3.1 冯·诺依曼执行周期 134
4.3.2 一个字符输出程序 135
4.3.3 冯·诺依曼漏洞 138
4.3.4 一个字符输入程序 139
4.3.5 十进制转换为ASCII 139
4.3.6 一个自我修改程序 140
4.4 ISA3层的编程 142
4.4.1 只读存储器 143
4.4.2 Pep/9操作系统 144
4.4.3 使用Pep/9系统 145
本章小结 146
练习 146
编程题 148
第四部分 汇编层(第5层)
第5章 汇编语言 150
5.1 汇编程序 150
5.1.1 指令助记符 150
5.1.2 伪操作 152
5.1.3 .ASCII和.END伪操作 153
5.1.4 汇编器 154
5.1.5 .BLOCK伪操作 155
5.1.6 .WORD和.BYTE伪操作 155
5.1.7 使用Pep/9汇编器 156
5.1.8 交叉汇编器 157
5.2 立即数寻址和陷阱指令 158
5.2.1 立即数寻址 158
5.2.2 DECI、DECO和BR指令 159
5.2.3 STRO指令 161
5.2.4 解释位模式:HEXO指令 162
5.2.5 反汇编器 163
5.3 符号 165
5.3.1 带符号的程序 165
5.3.2 一个冯·诺依曼示例 166
5.4 从HOL6层翻译 168
5.4.1 Printf()函数 169
5.4.2 变量和类型 170
5.4.3 全局变量和赋值语句 171
5.4.4 类型兼容 174
5.4.5 Pep/9符号跟踪器 175
5.4.6 算术移位和循环移位指令 175
5.4.7 常量和.EQUATE 176
5.4.8 指令与数据的放置 178
本章小结 179
练习 180
编程题 182
第6章 编译到汇编层 185
6.1 栈寻址和局部变量 185
6.1.1 栈相对寻址 185
6.1.2 访问运行时栈 186
6.1.3 局部变量 188
6.2 分支指令和控制流 190
6.2.1 翻译if语句 191
6.2.2 优化编译器 192
6.2.3 翻译if/else语句 192
6.2.4 翻译while循环 194
6.2.5 翻译do循环 195
6.2.6 翻译for循环 197
6.2.7 面条代码 198
6.2.8 早期语言的控制流 199
6.2.9 结构化编程定律 200
6.2.10 goto争论 200
6.3 函数调用和参数 201
6.3.1 翻译函数调用 201
6.3.2 用全局变量翻译传值调用参数 204
6.3.3 用局部变量翻译传值调用参数 207
6.3.4 翻译非空函数调用 209
6.3.5 用全局变量翻译传引用调用参数 211
6.3.6 用局部变量翻译传引用调用参数 215
6.3.7 翻译布尔类型 218
6.4 变址寻址和数组 220
6.4.1 翻译全局数组 221
6.4.2 翻译局部数组 224
6.4.3 翻译作为参数传递的数组 226
6.4.4 翻译switch语句 230
6.5 动态内存分配 235
6.5.1 翻译全局指针 235
6.5.2 翻译局部指针 240
6.5.3 翻译结构 243
6.5.4 翻译链式数据结构 246
本章小结 250
练习 251
编程题 251
第7章 语言翻译原理 259
7.1 语言、语法和语法分析 259
7.1.1 连接 260
7.1.2 语言 260
7.1.3 语法 261
7.1.4 C标识符的语法 262
7.1.5 有符号整数的语法 263
7.1.6 上下文相关的语法 264
7.1.7 语法分析问题 264
7.1.8 表达式的语法 265
7.1.9 C语法的一部分 266
7.1.10 C的上下文相关性 269
7.2 有限状态机 270
7.2.1 用有限状态机分析标识符 270
7.2.2 简化的有限状态机 271
7.2.3 非确定性有限状态机 271
7.2.4 具有空转换的状态机 272
7.2.5 多语言符号识别器 274
7.2.6 语法与有限状态机 276
7.3 实现有限状态机 277
7.3.1 编译过程 278
7.3.2 查找表分析器 278
7.3.3 直接编码分析器 280
7.3.4 输入缓冲区类 282
7.3.5 多语言符号分析器 283
7.4 代码生成 288
7.4.1 语言翻译器 288
7.4.2 语法分析器特性 302
本章小结 303
练习 303
编程题 306
第五部分 操作系统(第4层)
第8章 进程管理 312
8.1 装载器 312
8.1.1 Pep/9操作系统 312
8.1.2 Pep/9装载器 314
8.1.3 程序的终止 315
8.2 陷阱 315
8.2.1 陷阱机制 316
8.2.2 RETTR指令 317
8.2.3 陷阱处理程序 317
8.2.4 陷阱寻址方式断言 319
8.2.5 陷阱操作数地址计算 320
8.2.6 空操作陷阱处理程序 323
8.2.7 DECI陷阱处理程序 324
8.2.8 DECO陷阱处理程序 329
8.2.9 HEXO和STRO陷阱处理程序和操作系统向量 332
8.3 并发进程 334
8.3.1 异步中断 334
8.3.2 操作系统中的进程 335
8.3.3 多处理 336
8.3.4 并发处理程序 337
8.3.5 临界区 338
8.3.6 第一次尝试实现互斥 339
8.3.7 第二次尝试实现互斥 339
8.3.8 Peterson互斥算法 340
8.3.9 信号量 342
8.3.10 带信号量的临界区 343
8.4 死锁 343
8.4.1 资源分配图 344
8.4.2 死锁策略 345
本章小结 346
练习 346
编程题 351
第9章 存储管理 353
9.1 内存分配 353
9.1.1 单道程序设计 353
9.1.2 固定分区多道程序设计 354
9.1.3 逻辑地址 355
9.1.4 可变分区多道程序设计 356
9.1.5 分页 359
9.2 虚拟内存 361
9.2.1 大程序的行为 361
9.2.2 虚拟内存 361
9.2.3 按需分页 362
9.2.4 替换页 363
9.2.5 页替换算法 363
9.3 文件管理 365
9.3.1 磁盘驱动器 365
9.3.2 文件抽象 366
9.3.3 分配技术 367
9.4 错误检测与纠错码 369
9.4.1 错误检测码 369
9.4.2 编码要求 370
9.4.3 纠正一位错误编码 372
9.5 RAID存储系统 373
9.5.1 RAID 0级:无冗余条带化 374
9.5.2 RAID 1级:镜像 374
9.5.3 RAID 01和10级:条带化和镜像 375
9.5.4 RAID 2级:内存风格的ECC 376
9.5.5 RAID 3级:位交叉奇偶校验 377
9.5.6 RAID 4级:块交叉奇偶校验 377
9.5.7 RAID 5级:块交叉分布奇偶校验 378
本章小结 379
练习 379
第六部分 逻辑门(第1层)
第10章 组合电路 384
10.1 布尔代数和逻辑门 384
10.1.1 组合电路 385
10.1.2 真值表 385
10.1.3 布尔代数 386
10.1.4 布尔代数定理 387
10.1.5 互补证明 388
10.1.6 逻辑图 389
10.1.7 其他表示方式 391
10.2 组合分析 392
10.2.1 布尔表达式和逻辑图 392
10.2.2 真值表和布尔表达式 393
10.2.3 两级电路 395
10.2.4 无处不在的NAND 397
10.3 组合设计 398
10.3.1 范式 398
10.3.2 三变量卡诺图 399
10.3.3 四变量卡诺图 403
10.3.4 对偶卡诺图 406
10.3.5 无关条件 406
10.4 组合设备 407
10.4.1 视角 407
10.4.2 复用器 408
10.4.3 二进制译码器 409
10.4.4 多路分配器 410
10.4.5 加法器 410
10.4.6 加法器/减法器 412
10.4.7 算术逻辑单元 413
10.4.8 LG1层的抽象 419
本章小结 420
练习 420
第11章 时序电路 426
11.1 锁存器与时钟触发器 426
11.1.1 SR锁存器 426
11.1.2 钟控SR触发器 428
11.1.3 主从SR触发器 429
11.1.4 基本触发器 433
11.1.5 JK触发器 434
11.1.6 D触发器 435
11.1.7 T触发器 436
11.1.8 激励表 437
11.2 时序分析与设计 437
11.2.1 时序分析问题 438
11.2.2 预设置与清除 441
11.2.3 时序设计 441
11.2.4 一个时序设计问题 441
11.3 计算机子系统 444
11.3.1 寄存器 444
11.3.2 总线 445
11.3.3 内存子系统 446
11.3.4 地址译码 449
11.3.5 双端口寄存器组 453
本章小结 455
练习 455
第七部分 微代码(第2层)
第12章 计算机组成 460
12.1 构建一个ISA3层机器 460
12.1.1 CPU数据区 460
12.1.2 冯·诺依曼周期 463
12.1.3 存储字节直接寻址指令 467
12.1.4 总线协议 468
12.1.5 存储字直接寻址指令 468
12.1.6 加法立即数寻址指令 469
12.1.7 装入字间接寻址指令 470
12.1.8 算术右移指令 473
12.1.9 CPU控制区 474
12.2 性能 476
12.2.1 数据总线宽度和内存对齐 476
12.2.2 内存对齐 480
12.2.3 n位计算机的定义 483
12.2.4 高速缓存 484
12.2.5 系统性能公式 490
12.2.6 RISC与CISC 491
12.3 MIPS机器 494
12.3.1 寄存器组 494
12.3.2 寻址方式 495
12.3.3 指令集 498
12.3.4 MIPS的计算机组成 501
12.3.5 流水线 505
12.4 结论 512
12.4.1 模型简化 512
12.4.2 全局架构 513
本章小结 514
练习 514
编程题 517
附录 Pep/9体系结构 519
部分练习参考答案 529
索引 543

教学资源推荐
作者: David E.Culler,Jaswinder Pal Singh,Anoop Gupta
作者: 李平 杜涛 罗和平
作者: Linda Null, Julia Lobur
参考读物推荐
作者: [土耳其] 卡格特·古尔图克(Cagatay Gurturk)著
作者: Douglas Schmidt,Michaes Stal,Hans Rohnert,Frank Buschmann
作者: [美]阿诺德·S.伯格(Arnold S.Berger) 著
作者: 邱郁惠