计算机系统概论(原书第2版)
作者 : Yale N. Patt;Sanjay J. Patel
译者 : 梁阿磊 蒋兴昌 林凌
丛书名 : 计算机科学丛书
出版日期 : 2007-07-25
ISBN : 7-111-21556-1
定价 : 49.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 406
开本 : 16开
原书名 : Introduction to Computing Systems From Bits and Gates to C and Beyond, Second Edition
原出版社: McGraw-Hill
属性分类: 教材
包含CD :
绝版 :
图书简介

本书为伊利诺伊大学(UIUC)等众多名校计算机科学的经典基础教材,作者是与Donald E. Knuth齐名的美国计算机界泰斗级作者Yale N. Patt。本书的目的是让学生在一进入大学校门的时候,就对计算机科学有一个深入理解,为以后的课程打下坚实的基础。
  本书包括两方面的内容:计算机底层结构、高级语言编程及编程方法学。书中介绍了LC-3体系结构的设计,并配套开发了LC-3模拟器供学生使用。为加深学生对编程及其方法学的理解,本书选用了C语言作为载体,并采用了“驱动式”的自底向上方法进行讲解——先给学生一个整体结构,然 后自底向上地建立起相关的知识。同样,在每个子单元中,也采用相同的驱动式教学方法。在每个学习阶段,都在之前已学的知识的基础上介绍新的概念。经验告诉我们,这种学习方法更多地强调理解而不是记忆。通过本书学习,学生的理解能力将获得很大的提高,因为他们循序渐进地了解了构建计算机的全部过程。

  本书特色:
  ● 自底向上的组织:从最底层的MOS晶体管开关器件开始,然后是逻辑门、锁存器、逻辑结构 (开关MUX、译码器、全加器、门锁存器等) ,最后使用这些单元来实现内存。之后,转至有限状态机控制、顺序电路的实现、冯·诺伊曼体系结构、一个简单的计算机 (LC-3) ,以及LC-3的机器和汇编语言、C高级程序设计语言、递归等,最后是基本数据结构。
  ● 调试技术:从写第一个程序开始,就要求学生采用LC-3的调试工具和相关的调试技术。正因为如此,他们对编程艺术的体会更加深刻。
  ● LC-3模拟器:学习本书的一个重要过程是亲自操作LC-3模拟器,这是一个专门为学生掌握主要计算机概念而设计的工具。学生可以从本书网站免费下载LC-3模拟器。
  ● 编程方法学:本书给出了很多例程,其意义在于教会学生怎样分析问题,并通过系统的问题分解转换为计算机可编程的子问题。不论是使用LC-3汇编或C高级程序设计语言,编程思路上都存在相似性。这方面的理解和方法对快速掌握其他语言都有帮助。
  
  本书网站上提供了丰富的辅助阅读材料和教学资料,请感兴趣的读者到http://www.mhhe.com/patt2下载。

图书特色

图书前言

第2版前言
  本书自第1版发行至今已有三个年头,期间我们收到了大量学生和教师的反馈信息,几乎所有的反馈信息都是“正面的”,这让我们备感欣慰!能有机会出版本书的第2版,实在是让人高兴的一件事情。之所以高兴,是因为大多数人都赞同本书的编写方法,尤其是我们收到的反馈信息都来自学习第一线的读者—它们包含了学习者(学生)的感受和授业者(教师)对本书使用效果的评价,从他们的e-mail中能看出对本书的评价都很高。
  但正如本书第1版前言中所提到的,本书仍然在追求不断地完善。另外,在接受赞誉的同时,我们也收到很多建议,这些建议指出怎样使本书写得更好,我们在此向所有关心本书的读者深表感谢。同时,由于第1版出版后我们两人都分别在课堂上讲了两遍以上,也发现了很多需要修改和改进的地方。因而我们决定在第2版中做出较大的修改,但同时也期望新版能沿续第1版编写的初衷,并期待尽快听到读者的反馈。
  修订内容
  LC-3
  本版最大改动之一就是,采用LC-3(Little Computer 3)结构替换了第1版的LC-2机器模型。实际上,新结构保持了LC-2的基本概念,即一个易于描述又有望在短期内掌握的丰富的ISA。指令仍然采用16位宽度,其中操作码为4位。正如我们的一个学生指出的,事实上,子程序返回指令(RET)就是LC-2的JMPR指令的特例,因而在LC3中,我们取消了RET指令作为单独操作码的定义。在LC-3中,我们只定义了15种操作码,预留了一个用于未来应用(或许在第3版中会定义这个操作码)。
  其次,我们收到很多反对PC-concatenate寻址模式的建议,特别是针对分支跳转指令。该寻址模式起源于20世纪60年代中期的PDP-8机器,问题表现在当前页中的一条指令访问下一页(或之前页)之时。这个问题很让人头痛,尤其是在接近页边界时出现的前向跳转指令。因而,很多人建议我们采用现代机器中常用的“PC+offset”方式。因此,我们将第1版中所有使用“PC偏移(offset)”之处,都改成了“PC+SEXT(offset)”。
另外,新版还包括以下修改:
  ·栈空间增长改为向0地址增长(符合现在的实际惯例)。
  ·LDR/STR指令中的偏移改成了有符号值(因而可以基于base地址做向前、向后偏移)。
  ·操作码1101现在未做定义。
  ·JSR/JMP的操作码做了轻微改动。
  ·最后,条件码扩展为16位处理器状态寄存器(Processor Status Register, PSR,其中包含了特权模式和优先级字段)。
  与第1版相同,在附录A中有LC-3结构的完整描述。
  扩充内容
  在第1版的基础上,新版几乎对所有章节都做了或多或少的修改,有些章节的改动大一些。其中:
  ·第1章中增加了两方面的内容(1)有关抽象方法的重要性及其本质性的描述;(2)硬件和软件之间相关性的讨论。
  ·第3章增加了一节,即有关有限状态控制及顺序开关控制的实现方法。因为这些实现方法和技巧已成为计算机科学(CS)或计算机工程(CE)专业学生必须掌握的知识,这些知识的掌握将有助于对第4章冯·诺伊曼模型的深入理解。
  ·第4章中增加了对LC-3微结构的概述,相关内容的详细描述参见附录C。
  ·第5章,有读者反映内容太扼要,在此我们增加了一些素材,希望新增的这些图和注释会使相关概念更加清晰。
  ·第8章和第10章中增加了有关中断驱动I/O的章节内容。
  ·第11~14章介绍了C语言(与第1版一样),不同之处是,这些章节更加注重帮助编程初学者掌握语言的基本内容,而将那些特性内容移至该章结尾或附录D之中,使之脱离教材的主线。所有这些章节都增加了更多的例子。
  另外,第2版改用“问题解决驱动”方式来讲述编程技术,即通过例子展示为什么新引入的C结构可以在C编程中解决当前的问题(这将有助于读者真正理解编程语言的设计精妙之处)。
  ·第14章中还将介绍新的LC-3调用规范,新的规范更接近实际系统中所采用的规范。
  ·第15章介绍了有关测试和调试的深入知识。
  ·章节顺序的调整:根据来自教学中的经验,我们决定调换“递归”和“指针与数组”两章的顺序。从而使学生在学习“递归”内容(相对较难,目前推后至第17章)之前有更多的机会熟悉和掌握C语言的编程方法。
  仿真器
  针对新的LC-3结构,Brian Hartman对原先的Windows版仿真器(Simulator)做了修正。Ashley Wise则为UNIX平台编写了LC-3仿真器。在两个版本的仿真器中,都实现了“中断驱动I/O”功能。我们相信没有任何方法比“实际动手”更有助于知识的真正掌握。具备了中断驱动I/O功能的仿真器,使得学生现在可以实验这样一个场景,即通过键盘输入中断一个正在执行的程序,并调用对应的中断服务程序。
  本书的使用方法
  本书是计算科学相关专业新生的入门教材。我们认为“自底向上”方法是帮助学生理解技术计算原理的最好方法(参考后面第1版前言中的详细论述)。事实和经验表明,学生在掌握了计算机底层工作的原理机制之后,能更加从容地解决以后可能面临的新问题,包括高级编程语言方面的问题。而且,这些学生学习编程语言的方法是“理解式”而不是“记忆式”的,因为一切动作都是明明白白的。从我们的角度来看,本书的最佳使用方法是,开设一个学期的新生主干课程,或是两个学期的课程(节奏慢些)。如果教学的重点是单学期制的高级编程语言,则串行机和中断驱动I/O的内容可以跳过;而如果教学的重点是本书的前半部分,则第15、17、18和19章的内容可以跳过。
  通常,这本书的参考使用方法包括:
  ·一年级第一学期作为新生主干课程。
  第一种方法是在一年级第一学期内分两个小学期完成,这可能是本书最好的使用方法。在第一个小学期,讲授本书的第1~10章,在第二个小学期,讲授第11~19章。这样的进度有些快,但在两个小学期(即一学期)内是可以讲解完整本书的(注:一个学期(semester)分为两个小学期(quarter))。
  ·一年级第二学期作为计算机的第二门课程。
  第二种方法还可作为计算的第二门课程在一年级第二学期完成,学生在之前的第一学期已修完了第一门高级编程语言方面的课程,之后在这门课程中,则回头学习初级的数字逻辑、基本的计算机组成和汇编语言编程等底层知识。这种方式下,这一学期的大部分时间都用于学习第1~10章,只留下最后几周学习第11~19章的一些课题,以显示学生从第一门高级程序设计语言课程中学到的机理是如何在底层实现的。其中,通常会讲到函数、活动记录、递归、指针变量和其他基本数据结构等课题。
  ·二年级计算机组成课程(Sophomore-Level)。
  本书还可用于二年级要上的深入探究计算机实现的课程。在这期间,重点学习第1~10章,有时还需彻底学习附录C(LC-3之微结构和微编程实现)。需要指出的是,本书未讲述计算机体系结构中的一些重要概念,如高速缓存、流水线、虚拟存储器等。我们认同这些概念对于有志成为计算机科学家或计算机工程师的学生至关重要,但同时又感到这些内容更适合放到计算机体系结构与设计的更高级课程中来讲。本书的目的并不在此。
  致谢
  本书需要向太多的人表示致谢,感谢他们为本书所做的重要贡献。其中,尤其要感谢Brian Hartman和Matt Starolis。
  Brian Hartman先生以他的积极热情和技术专长继续为本书新版做出重要贡献。1996年冬,他在密歇根大学作为一年级本科生选修了这门课。他随后在本科期间多次担任这门课的助教,并在硕士学习期间编写开发了Windows版LC-2仿真器(同时这也是他的硕士毕业课题)。最近,他又为LC-3开发了Windows版仿真器。现在,他已离开学校三年多了,但仍在坚持维护该系统。
  Matt Starolis在两年前作为UT(得克萨斯大学)一年级学生选修了该课程,并于去年秋季担任该课程助教,在本书第2版的编写中担任了重要角色,为本书提出了许多意见并设计了书中的多幅插图。他还修订了LC-3仿真器的使用手册,以使之与新版仿真器一致。往往在任何事情需要有人去做的时候,他总是第一个站出来。他的热情为本书注入了活力。
  目前本书有大约100多位采用者,我们定期地收到来自世界各地的教授们热情洋溢的
  e-mail。他们是Vijay Pai(Rice)、Richard Johnson(Western New Mexico)、Tore Larsen(Tromso)、Greg Byrd(NC State)、Walid Najjar(UC Riverside)、Sean Joyce(Heidelberg College)、James Boettler(South Carolina State)、Steven Zeltmann(Arkansas)、Mike McGregor(Alberta)、David Lilja(Minnesota)、Eric Thompson(Colorado Denver)、Brad Hutchings(Brigham Young)。
至于我们两人,自第1版出版以来,共使用本书教授了4届学生,并培养了一大批热情、积极的助教和学生。其中,助教包括Kathy Buckheit、Mustafa Erwa、Joseph Grzywacz、Chandresh Jain、Kevin Major、Onur Mutlu、Moinuddin Qureshi、Kapil Sachdeva、Russell Schreiber、Paroma Sen、Santhosh Srinath、Kameswar Subramaniam、David Thompson、Francis Tseng、Brian Ward、Kevin Woley,而Linda Bigelow、Matt Starolis、Lester Guillory等人一开始都是新生,两年后已成为最积极的助教。
  Ashley Wise开发了Linux版本的LC-3仿真器,Ajay移植了LCC编译器来产生LC-3代码。Gregory Muthler和Francesco Spadini对本书后半部分的原稿提出了积极的反馈意见。Brian Fahs为习题提供了解答。
  Kathy Buckheit编写了LC-2仿真器的入门材料(因为她觉得这很有必要)。
得克萨斯大学(University of Texas)许多同仁都采用了本书,并与我们分享他们的见解,如ECE专业的Tony Ambler、Craig Chase、Mario Gonzalez、Earl Swartzlander和CS专业的Doug Burger、Chris Edmundson、Steve Keckler。在此表示感谢。
  我们还要继续感谢认真负责的编辑们,他们是Betsy Jones和Michelle Flomenhoft。
  自第1版以来,我们的书还受益于很多大学教师的审核,感谢他们:Robert Crisp(Arkansas)、Allen Tannenbaum(Georgia Tech)、Nickolas Jovanovic(Arkansas-Little Rock)、Dean Brock(North Carolina-Asheville)、Amar Raheja(Cal state-Pomona)、Dayton Clark(Brooklyn College)、William Yurcik(Illinois State)、Jose Delgado-Frias(Washington State)、Peter Drexel(Plymouth State)、Mahmoud Manzoul(Jackson State)、Dan Connors(Colorado)、Massoud Ghyam(Southern Cal)、John Gray(Umass-Dartmouth)、John Hamilton(Auburn)、Alan Rosenthal(Toronto)、Ron Taylor(Wright State)。
  最后,还要感谢那些以独特方式做出贡献的人们(在此不再赘述他们的具体贡献,只是列出他们的名字):Amanda、Bryan、Carissa Hwu、Mateo Valero、Rich Belgard、Janak Patel、Matthew Frank、Milena Milenkovic、Lila Rhoades、Bruce Shriver、Steve Lumetta、Brian Evans。另外,Sanjay(作者之一)还要感谢Ann Yeung的爱和支持。
  结束语
  再次重复第1版前言中的话:本书仍然在追求不断地完善,期待你们提出宝贵意见。我们的联系方式是:patt@ece.utexas.edu和sjp@crhc.uiuc.edu。

  Yale N. Patt
  Sanjay J. Patel
  2003年3月


  第1版前言
  本书内容取自密歇根大学开设的EECS100课程—这是计算机科学(CS)、计算机工程(CE)和电子工程(EE)三个专业的第一门计算机类主修课程。该课程由Kevin Compton教授和本书第一作者于1995年秋季开设。
  之所以开设EECS100,是因为多年来计算机科学与工程系的教师认为,他们的本科生对计算机基本概念缺乏深入的理解。例如,学生们无法清楚地解释指针变量,而递归概念对他们来说就像是在“变魔术”,难以理解。
  所以,我们在1993年提出对传统教学思路的改革。传统的教学思路是从高级计算机语言开始入手,但是在这种教学方式下,学生仅仅是“记住”了其中的技术细节,并不能真正“理解”其原理、机制。本书的教学思路是“自底向上”(bottom-up):从MOS晶体管开始,依次介绍逻辑门、锁存器、各种逻辑结构(如MUX、解码器、加法器、门控锁存器),然后通过存储器(或内存)的实现案例,将以上概念有机结合。随后,介绍冯·诺伊曼模型,并以简单的LC-2计算机为背景,介绍LC-2机器语言编程和汇编语言编程;再之后,我们继续上升到高级语言(如C语言),以及递归、指针、数组等概念;最后,引入一些基本的数据结构。
  有一种“信息隐藏”(Information Hiding)学习方法,但我们不太赞同这种方法。事实上,“信息隐藏”确实是个很有效的学习方法。但我们认为,只有在你真正搞明白它在做什么之后,信息隐藏方法才具有意义。换句话说,我们计划将每个概念的底层动作都暴露、表现出来,消除在上层感受到的神秘感。
  需要指出的是,虽然本书采用的是“自底向上”方法,但并不意味着我们反对“自顶向下”(top-down)方法。相反,我们认为“自顶向下”在设计方面是非常正确的方法。在设计中采用的方法,与在学习中采用什么样的方法,是两件不同的事情。就是说,对前者我们主张采用“自顶向下”方法(前提是设计者已深入理解底层构造),而对后者(即学习和理解过程)我们则主张“自底向上”方法。
  内容概要
  本书内容包括两个部分:一是计算机底层结构(LC-2计算机),二是高级语言编程(C语言)。
  LC-2
  本书的前半部分偏重计算机底层机制。从底层基础知识开始,逐步上升到操作系统和高级语言程序的接口层,以便能够理解真实计算机的工作原理。
  ·第2章:介绍基于位(bit)的算术和逻辑运算操作,以及相关的结构设计(即LC-2计算机的组成)。
  ·第3章:存储器设计。从MOS晶体管开始,逐步介绍存储器的实现过程。该存储器很简单,每字宽度为3-bit,共4个字大小(而不是64MB)。其中,每个部件的设计图都不超过一页大小(以方便阅读)。至此,构建存储器所要求的知识就全部介绍完了。
  ·第4章和第5章:介绍冯·诺伊曼模型及LC-2计算机的组成结构。LC-2是一个16-bit结构的计算机,也是冯·诺伊曼模型的一个具体实现。它具备以下功能和特性:
  ■ 键盘和显示器等物理I/O设备。
  ■ 调用操作系统服务的TRAP机制。
  ■ 基于N、Z、P等条件码的条件跳转。
  ■ 子程序调用和返回机制。
  ■ 基本的操作指令集合(ADD、AND和NOT)。
  ■ 各种加载(load)和存储(store)寻址模式,如直接、间接、基址+偏移和立即数等有效地址计算方式。
  ·第6章:介绍编程方法学和调试方面的知识。
  ·第7章:介绍汇编语言编程,以及我们开发的LC-2仿真器和汇编器。事实上,我们开发了两个版本的仿真器,一个是在Windows平台上运行,另一个是在UNIX平台上运行。Windows版本的仿真器程序可以从网上下载或从本书光盘获取;偏好UNIX的同学,可从网上免费下载UNIX版仿真器,然后安装。
  学生使用仿真器的目的是测试和调试用LC-2机器语言和LC-2汇编语言编写的程序。它支持在线调试(即内存检查、单步、断点设置等操作)。该仿真器仅适合于调试简单的LC-2机器语言或汇编语言程序,其主要目的是帮助学生理解和掌握第1~10章中的基本概念。
  有关汇编语言,我们仅限于介绍,而不是熟练编程。汇编的编程技术是更高级课程(而不是一年级课程)的任务。之所以在第7章介绍汇编语言知识,是因为它在“自底向上”层次中独占一层。通过它,学生可以观察到从汇编语言到0/1序列的转换过程。并且,通过手工汇编(即手工转换),虽然花费了大量时间,但必将为学生打下坚实的概念基础,令他们受益终生。
  所谓汇编语言,可以将它看做是机器指令的一种“友好”表示方式,它的好处在本书后半部分将体现出来。因为从第11章开始,我们将借用汇编语言或机器语言来解释C语言语句的底层含义。当然,汇编语句“ADD R1,R2,R3”显然比机器代码“0001001010000011”具有更好的可读性。
  ·第8章:讨论物理设备的输入(键盘)和输出(显示器)。
  ·第9章:讨论操作系统的陷入机制(TRAP),以及子程序调用和返回机制。学生将学习用LC-2代码编写的操作系统服务程序,以便生成由TRAP指令调用的物理I/O。
  ·第10章:是本书上半部分的总结。通过“计算器程序”例子,讲述栈和数据转换的原理和机制。该程序由1个主程序和11个子程序组成。
  C语言
  本书下半部分内容是C语言编程,但不是对于C语言的一般性介绍,而是对其内部机制的深入洞察(学生之前已对C语言底层有所了解)。
  作为一种高级语言,C语言最适合于我们的“自底向上”方法,因为C语言是各种高级语言中“最低级的”。通过它,能够清晰地表现软件和硬件的接口关系。本书的C语言学习内容,着重于控制结构语句、函数、数组等基本概念;在基本掌握编程概念之后,高级概念(如对象、抽象等)的学习就是轻而易举的事情了。
  在学习过程中,每介绍一个C语言结构,我们都将给出其对应的LC-2汇编代码(即编译器对高级语言的处理结果)。在此,各种C结构内容包括:基本结构(变量、运算符、控制语句和函数)、指针、递归、数组、结构、I/O操作、复杂数据结构和动态分配等。
  ·第11章:高级编程语言概述。本章将通过一个简单的C程序,作为学习C语言的“敲门砖”。学生之前学习的汇编技术,将有助于对高级语言要素背后动机的理解。
  ·第12、13章:这两章是对C语言的系统介绍。其中,第12章涉及数值、变量、常数、运算符等概念。第13章引入C语言的控制结构。在此,我们给出了很多例子,以讲解这些概念的灵活用法。同时,还将辅以LC-2代码,讲解C语言概念与底层机器之间的关联。
  ·第14章:介绍高级语言源代码的调试技术。
  ·第15章:介绍C语言的“函数”概念。但本书中的重点不仅是语法层面的介绍,更重要的是其运行时原理的描述。如栈空间运行时的变化过程。
  ·第16章:讲述“递归”技术。它涉及之前学过的函数、活动记录、运行时栈空间等概念。
  ·第17章:指针和数组。理解这两个概念之间微妙区别的要点在于对内存结构的深入理解。
  ·第18章:介绍C语言I/O函数的技术细节,包括:流、可变长参数,以及C语言通过各种“格式”(format specification)控制I/O的效果(参考第8章)。
  ·第19章:C语言的总结。并引出结构、动态内存分配和链表等概念。
  本书不仅介绍各种概念和定义,同时也注重培养良好的编程风格和方法学,这一点体现在本书的各个例子代码中。通过这些例子,可以加深初级程序员对基本概念的深入理解。
  我们在教学过程中发现,学生对“指针变量”的理解毫不费力,这让我们非常意外。这或许就是本书教学方法的效果,因为之前他们已了解内存的概念及其逻辑设计和实现机制,所以能迅速理解地址和数据之间的差异。
  “递归”是个难以掌握的概念。但在学习“递归”概念时,理解“递归”所需的基础知识都已具备,如:子程序调用/返回时的栈变化(第10章)、被调用者(called或callee)和调用者(caller)之间的链接方法等,然后引入运行时活动记录、参数传递、动态声明等概念就比较容易了。换句话说,如果你能够理解一个函数是怎样调用另一个函数的,那么一个函数调用它自己的过程(即递归)也就不言而喻了。
  本书的教学方法
  在过去的两年里,我们研究了多种基于本书的教学方法。下面推荐六种教学方式。
  (1)密歇根大学模式:在该校,它是本科入学的第一门课程。在不需要任何预备知识的情况下,集中讲解全书内容。我们发现这种模式特别适合那些有天分的、爱动脑筋的同学。
  (2)一般模式:第一门课程,不需要预备知识。仍然是集中讲解,但略过个别章节,如10.3节、10.4节以及第16章(递归)、第18章(C语言的I/O细节)和第19章(数据结构)。
  (3)第二门课模式:很多学校认为这种模式效果较好,即在第一门课中先学习“面向对象编程语言”,然后在第二门课中学习本书。在这种模式中,学期的前2/3时间是本书的前10章内容,后1/3时间是本书的第二部分内容。由于学生在之前已对编程有所了解,所以后半部分内容的学习将结合编程大作业(project)来完成。这种模式的特点是,先学“面向对象语言”,然后反过来学习C语言,以便为后面的高级软件课程(如操作系统)学习做好准备。
  (4)两个小学期模式:这是一种非常好的模式。无需预备知识,在两个小学期内完成全书。第一个小学期内完成第1~10章,第二个小学期内完成第11~19章。
  (5)两个大学期模式:这可能是最优模式了。即花费一个学年的两个学期,无需预备知识。第一学期完成前10章和附录C(LC-2的微结构);第二学期完成第11~19章。课程中配合大量与编程相关的课程设计,促进学生巩固课堂知识。
  (6)二年级硬件课程:个别大学采用这种模式,其目的在于让二年级学生加深对硬件知识理解。他们计划在一个学期内,让学生掌握“数”(number)的系统定义、数字逻辑、计算机组织、机器语言和汇编,最后以栈、活动记录、递归和链表等概念结束。其思路是,将本课程的前半部分内容与一年级所学的编程课程有机结合,以回顾编程课程中遗留下的概念问题。虽然,我们的建议是将本书的授课时间安排在“面向对象语言”课程之前,但这种方法收到的效果也很好。因为学生在之前的一年级编程学习中曾遇到并遗留下的很多概念上的问题在本课程中都将找到答案,从而起到“豁然开朗”的效果。
  经验与体会
  理解而不是记忆
  由于本课程的学习方法是“自底向上”,所以不存在编程课程所面临的“规则”记忆。这是因为按照本书的知识结构,在接触新概念之前,与之相关的底层实现机制必然都已学过。另外,这种“自底向上”的方法对以后设计类课程的学习也非常有益。因为如何在多种设计方案中做出正确的权衡和决策,完全取决于你对问题的理解和洞察深度。
  自己动手
  我们经常听到工业界抱怨:“计算机专业毕业的学生不懂得编程”。然而,造成这种现象的部分原因,竟然是“热心”的助教。因为,他们将“实验”准备得太充分了,以至于学生不费力气就能完成题目,从而失去了对编程过程和艺术的“体会”。我们所要求的是:学生必须在没有助教帮助的情况下,尽可能独立地完成编程任务。当然,我们之所以敢这么要求,原因在于:(1)本书所采用的“自底向上”方法给予学生的是“理解”而不是“记忆”;(2)本书配套的仿真器工具,学生从第一天学习开始,就要使用它,并用它来调试程序。这种学习顺序的安排,以及基于仿真器的编程调试经验,培养了学生通过分析和实验方法来解决问题的能力(而不是一味地求助于助教,即由助教完成程序的编写工作)。
  为未来做准备:深入底层
  计算机专业人士都有这样的体会,即系统运行的性能不仅仅取决于他们编写程序的水平。缺乏对系统底层知识的了解,使得他们面对一些性能问题时一筹莫展。这种情况很多,其中不乏资深程序员和工程师。
  作为高级程序员,要编写高效率代码,仅仅掌握高级语言本身是不够的。除此之外,他们还需要了解与设备相关的知识(甚至是引脚定义等)。例如,在一些应用系统中,计算机的作用是从某种测量设备(如天气测量仪或反馈控制系统等)中采样数据,那么工程师要掌握的知识就不仅限于FORTRAN语言了。对于电子工程师来说是如此,在机械、化工、航空等领域亦如此。而在高级语言编程课程中,编译器这个“保护层”也将计算机底层的“丑陋细节都隐藏了。换句话说,如果计算机课程的内容仅限于编程语言,那么培养出来的学生是无法胜任未来工作的。
  涟漪效应
  本书内容对后续课程将产生涟漪效应(rippling effect)。例如,假设学生对C语言语法和底层结构之间的互动机制已有所了解,那么在以后的语言编程课程中就可以将重点放在问题求解算法及更复杂的数据结构方面。再如,在硬件方面也存在类似的情况:在以后的数字逻辑设计和计算机组织课程中,他们很容易联想到硬件和上层语言之间的交互场景,从而理解底层设计的重点和动机。在计算机组织课程中,刚接触术语“程序计数器”(Program Counter)时,学生通常会问,“为什么要有程序计数器,有什么用?”密歇根大学的教学反馈表明,在EECS 100课程开设前后,学生在后续课程中对该类问题的理解有明显差异。
  致谢
  本书要感谢太多人的贡献。因而我们一直害怕遗漏了其中的某个人。在此,谨向大家表示致谢。
  第一个要感谢的是Kevin Compton教授。早在1993年,在他主持的密歇根大学教学讨论会上,我一提出该教学理念,就获得他的强烈支持。随后,他和本书作者共同创建了一门新课—EECS 100。之后,我们两人还一起执教了三个学期(1995年秋、1996年冬、1996年秋)。Kevin对编程方法学(而不是特定语言)的深入洞察,为新生建立了良好的素质基础。总之,如果不是Kevin,EECS 100这门课绝不会在密歇根大学获得如此之高的声誉。
  EECS 100课程创建之初,得到密歇根大学众多同学和教员的无私帮助。在此,特别感谢以下各位教授:David Kieras、Brian Hartman、David Armstrong、Matt Postiff、Dan Friendly、Rob Chappell、David Cybulski、Sangwook Kim、Don Winsor、Ann Ford。
  还有就是我们的助教们,他们非常会动脑筋。比如怎样解释才能使学生更容易理解这些概念?这里要特别感谢:Fadi Aloul、David Armstrong、David Baker、Rob Chappell、David Cybulski、Amolika Gurujee、Brian Hartman、Sangwook Kim、Steve Maciejewski、Paul Racunas、David Telehowski、Francis Tseng、Aaron Wagner、Paul Watkins。
  我们还要感谢很多出版界对我们手稿的关注。但最终我们还是选择了McGraw-Hill出版社,这主要归因于编辑Betsy Jones女士。在初步交流之后,她就对正在写作中的书稿表示了强烈的信心,她的鉴赏水平和评价能力让人钦佩!同时,我们也很感谢Michelle Flomenhoft女士与本项目的合作,与她一起工作非常愉快。
  各大学的教员们赐予本书的评述意见也让我们受益匪浅,感谢:Carl D. Crane III(Florida)、Nat Davis(Virginia Tech)、Renee Elio(University of Alberta)、Kelly Flangan(BYU)、George Friedman(UIUC)、Franco Fummi(Universita di Verona)、Dale Grit(Colorado State)、Thor Guisrud(Stavanger College)、Brad Hutchings(BYU)、Dave Kaeli(Northeastern)、Rasool Kenarangui(UT at Arlington)、Joel Kraft(Case Western Reserve)、Wei-Ming Lin(UT at San Antonio)、Roderick Loss(Montgomery College)、Ron Meleshko(Grant MacEwan Community College)、Andreas Moshovos(Northwestern)、Tom Murphy(The Citadel)、Murali Narayanan(Kansas State)、Carla Purdy(Cincinnati)、T.N.Rajashekhara(Camden County College)、Nello Scarabottolo(Universita degli Studi di Milano)、Robert Schaefer(Daniel Webster College)、Tage Stabell-Kuloe(University of Tromsoe)、Jean-Pierre Steger(Burgdorf School of Engineering)、Bill Sverdlik(Eastern Michigan)、John Trono(St. Michael誷 College)、Murali Varansi(University of South Florida)、Montanez Wade(Tennessee State)、Carl Wick(US Naval Academy)。
  此外,还有很多人通过其他方式给予了帮助。由于篇幅限制,在此仅列出他们的名字并表示感谢:Susan Kornfield、Ed DeFranco、Evan Gsell、Rich Belgard、Tom Conte、Dave Nagle、Bruce Shriver、Bill Sayle、Steve Lumetta、Dharma Agarwal、David Lilja、Michelle Chapman。
最后,恕我们自信直言:这本书的目标是培养坚实的计算机基础。我们相信,一旦学完本书,学生将不再为概念和细节所困,从而可以集中全力发挥其才智和潜能。感谢我的老师William K. Linvill,是他向我传授了这种理念。35年前,我坐在他的课堂上,他的言传身教都在告诉我,怎样做一个好教授,他是我终生的榜样。
  结束语
  我们希望你能喜欢本书的写作方法。本书仍然在追求不断地完善,期待你们提出宝贵意见。我们的联系方式是:patt@ece.utexas.edu和sjp@crhc.uiuc.edu。

  Yale N. Patt
  Sanjay J. Patel
  2000年3月

封底文字

本书为伊利诺伊大学(UIUC)等众多名校计算机科学的经典基础教材,作者是与Donald E. Knuth齐名的美国计算机界泰斗级作者Yale N. Patt。本书的目的是让学生在一进入大学校门的时候,就对计算机科学有一个深入理解,为以后的课程打下坚实的基础。
  本书包括两方面的内容:计算机底层结构、高级语言编程及编程方法学。书中介绍了LC-3体系结构的设计,并配套开发了LC-3模拟器供学生使用。为加深学生对编程及其方法学的理解,本书选用了C语言作为载体,并采用了“驱动式”的自底向上方法进行讲解——先给学生一个整体结构,然 后自底向上地建立起相关的知识。同样,在每个子单元中,也采用相同的驱动式教学方法。在每个学习阶段,都在之前已学的知识的基础上介绍新的概念。经验告诉我们,这种学习方法更多地强调理解而不是记忆。通过本书学习,学生的理解能力将获得很大的提高,因为他们循序渐进地了解了构建计算机的全部过程。

  本书特色:
  ● 自底向上的组织:从最底层的MOS晶体管开关器件开始,然后是逻辑门、锁存器、逻辑结构 (开关MUX、译码器、全加器、门锁存器等) ,最后使用这些单元来实现内存。之后,转至有限状态机控制、顺序电路的实现、冯·诺伊曼体系结构、一个简单的计算机 (LC-3) ,以及LC-3的机器和汇编语言、C高级程序设计语言、递归等,最后是基本数据结构。
  ● 调试技术:从写第一个程序开始,就要求学生采用LC-3的调试工具和相关的调试技术。正因为如此,他们对编程艺术的体会更加深刻。
  ● LC-3模拟器:学习本书的一个重要过程是亲自操作LC-3模拟器,这是一个专门为学生掌握主要计算机概念而设计的工具。学生可以从本书网站免费下载LC-3模拟器。
  ● 编程方法学:本书给出了很多例程,其意义在于教会学生怎样分析问题,并通过系统的问题分解转换为计算机可编程的子问题。不论是使用LC-3汇编或C高级程序设计语言,编程思路上都存在相似性。这方面的理解和方法对快速掌握其他语言都有帮助。
  ● 本书网站上提供了丰富的辅助阅读材料和教学资料,请感兴趣的读者到http://www.mhhe.com/patt2下载。

图书序言

梁老师请我为本书写序之初我有些犹豫,原因有二:一是我没有给书写序的经验,二是恐怕自己水平有限,写的序不能充分表述或突出这样一本优秀教材的独特之处而影响该书的推广。不过,在经过慎重考虑后,我还是接受了这个挑战。凡事总有头一回吧,没有经验不是推脱的理由,而且本人在密歇根大学攻读博士学位的三年间耳闻目睹了该书第一作者Yale Patt的过人学识与非凡个性,随后在上海交通大学任教的三年里又与本书的第一译者梁阿磊博士成为好友至交,写起序来总会比不 认识作者和译者的人有些优势。至于水平有限,只能请读者包涵了。
  Yale Patt曾任美国密歇根大学计算机体系结构实验室主任多年,被IEEE Spectrum称为美国计算机界的卓越泰斗(luminary),在美国乃至世界计算机体系结构领域有着广泛的影响力。这本《计算系统概论》不光是密歇根大学计算机专业的经典基础教材,也是美国多所知名大学,如得克萨斯大学、莱斯大学、明尼苏达大学、乔治亚理工学院、伊利诺伊大学和西北大学等校的计算机专业基础教材。
本书第一译者梁阿磊博士是上海交通大学教师,他多年在计算机教学上花费的心血博得了学生的广泛认同,并成为上海交通大学计算机系和软件学院最受学生欢迎的教师之一。梁博士在翻译本书过程中精益求精,既保持了原著的精彩阐述和独特风格,又注入了中文语言所特有的内涵,使译著精辟且顺畅,并成为上海交通大学计算机及相关专业学生的指定教材。
  也许你听过这个有启示的故事:在20世纪五六十年代时,美国GE公司的一个大型发电机出了问题。所有的操作人员及工程技术人员面对一大堆的仪表和旋钮一筹莫展。于是他们请来了一位这方面的专家,这位专家看了一下,便拿出一把螺丝刀,将一个旋钮反时针转动了35度,发电机就正常运转了。后来,专家开出的账单为1000美元,GE觉得花两分钟钮动一个旋钮就收取1000美元太多,便要求专家出具一份更详细的说明。两天后,专家寄来了新的账单:
  将旋钮反时针方向转动35度:      0.75美元
  知道应转动哪个旋钮及转动幅度:999.25美元
  一本好的教科书不应只教导学生转动A旋钮35度,而是应教会学生为什么要转动A旋钮及为什么只能转动不多不少的35度。这个例子恰恰能印证本书的优点所在。
  与多数人的感觉不同,本书不仅简单地讨论计算机组成原理或程序设计语言,而是站在计算机整体系统的高度将软硬件连贯起来进行阐述。本书强调的是理解,而不是死记硬背;强调的是软件与硬件结合,而不是软硬件的分别教授与学习。本书本着将软件硬件教学齐头并进的思路,从硬件的基本构件一直讲到软件的高级程序设计与构造,使学生在学习过程中能够将软硬件融会贯通、相互印证,从而提高学习的广度、深度和效果,并为后续的计算机专业课如操作系统、计算机系统设计与结构、算法设计与分析、高可靠软件工程理论等打下基础。
  本书最大的特点是其提倡的层次转换概念,即从问题开始到计算机运算出结果可以分为七个层次。通过七个层次的转换,即可完成从问题到结果的转变。这七个层次及其转换是:问题到算法的转换、算法到程序设计语言的转换、程序到指令集结构(ISA)的转换、指令集结构到微观结构的转换、微观结构到电路的转换和电路到电路组件的转换。该书对每个层次转换进行了深入的阐述,讲解了为什么需要这些转换以及没有这些转换所带来的困难。美国多个大学的教学实践表明,这种层次转换的概念极大地提高了学生对计算机软硬件的理解。
  本书在结构上采取的策略是自底向上。在对计算机的哲学原理进行了简要综述后,从晶体管开始,对逻辑门、触发器、逻辑结构和内存实现分别进行了详细的讨论。在此基础上,再对冯·诺伊曼执行模式进行剖析、讲解如何构建一个简单的LC计算机。然后上升到软件层,对计算机汇编语言和高级程序设计语言C进行讲解,重点将程序语言的各种数据类型和构造与底层的硬件构造联系起来,从而使学生在深层次上理解程序语言里各种构造的来龙去脉,及计算机软硬件之间的有机的、千丝万缕的联系。
  本书的使用方式有多种,其中适合中国国情的方式有以下四种:
  1. 密歇根模式:作为计算机软硬件原理的入门教材,无需先修课程。该模式要求一个学期内覆盖本书全部内容,时间安排为本科第一学年的第一学期。该模式工作量大,挑战性高,非常适用于肯钻研、进取心强的学生。
  2. 正常模式:作为软硬件专业入门教材,无需先修课程。该模式要求在一个学期覆盖大部分内容,但可以跳过10.3、10.4节、第16章、第18章和第19章。时间安排为本科第一年的第二学期。该模式较密歇根模式来说负担稍轻,但仍具有相当的挑战性。
  3. 第二模式:在学生已经进行了专业入门教育如程序设计、数据结构和数字电路等课程的学习后使用本书作为第二课程的教材。这种模式在一个学期覆盖本书全部内容,而讲课时间则安排在本科二年级上学期。该模式适合于计算机专业的大多数学生。
  4. 分治模式:将这本书的内容分为两个学期讲授。第一学期讲授第1~10章,第二学期讲授第11~19章。时间安排为本科一年级下学期和二年级上学期,这是使用本书的最优方式。
  本书结构紧凑、风格鲜明、内容精辟、条理清晰、文笔流畅、语言优美,读起来引人入胜,爱不释手。本书还引入了大量的典故和比喻(当然,有些典故和比喻需要西方及美国文化背景才能更好地领悟),让人感觉到不是在读一本计算机教科书,而是在读一本幽默有趣的长篇小说,或者借用Donald Knuth的话,它是“一部蓝色的诗歌”。
  本人强烈推荐本书给高校计算机专业的师生和所有对计算机软硬件有着浓厚兴趣的人士。读完本书后,你对计算机系统的理解将会达到一个崭新的境界。相信我,你不会失望的。

  邹恒明
  2007年3月2日于莘庄

作者简介

Yale N. Patt;Sanjay J. Patel:Yale N. Patt: 拥有斯坦福大学电子工程博士学位,是得克萨斯大学奥斯汀分校电子与计算机工程系教授。他是IEEE和ACM会士,因其在高性能微处理器方面的成就而获得IEEE Emannuel R. Piore奖、IEEE/ACM Eckert-Mauchly奖和IEEE Wallace W. McDowell奖,因其在教学方面的贡献而获得ACM Karl V. Karlstrom杰出教育家奖、得克萨斯优秀教学奖等。
Sanjay J. Patel: 拥有密歇根大学计算机科学与工程博士学位,是伊利诺伊大学厄巴纳-尚佩恩分校电子与计算机工程系助理教授。他的研究领域包括处理器微体系结构、计算机体系结构、高性能和可靠计算机系统等。

译者简介

梁阿磊 蒋兴昌 林凌:暂无简介

图书目录

出版者的话
专家指导委员会
译者序
代序
第2版前言
第1版前言
第1章 欢迎阅读本书 1
1.1 我们的目标 1
1.2 怎么才能做到 1
1.3 两个反复出现的理念 2
1.3.1 抽象之理念 2
1.3.2 硬件与软件 3
1.4 计算机系统简述 4
1.5 两个非常重要的思想 6
1.6 计算机:通用计算设备 6
1.7 从问题描述到电子运转 8
1.7.1 问题的提出 8
1.7.2 算法 8
1.7.3 程序 9
1.7.4 指令集结构 9
1.7.5 微结构 10
1.7.6 逻辑电路 10
1.7.7 器件 10
1.7.8 小结 10
1.8 习题 11
第2章 bit、数据类型及其运算 14
2.1 bit和数据类型 14
2.1.1 bit—信息的基本单位 14
2.1.2 数据类型 14
2.2 整数数据类型 15
2.2.1 无符号整数 15
2.2.2 有符号整数 15
2.3 补码 16
2.4 二进制数与十进制数之间的转换 18
2.4.1 二进制数转换为十进制数 18
2.4.2 十进制数转换为二进制数 19
2.5 bit运算之一:算术运算 20
2.5.1 加法和减法 20
2.5.2 符号扩展 20
2.5.3 溢出 21
2.6 bit运算之二:逻辑运算 22
2.6.1 “与”运算 22
2.6.2 “或”运算 23
2.6.3 “非”运算 24
2.6.4 “异或”运算 24
2.7 其他类型 24
2.7.1 位矢量 25
2.7.2 浮点数 25
2.7.3 ASCII码 27
2.7.4 十六进制计数法 28
2.8 习题 29
第3章 数字逻辑 34
3.1 MOS晶体管 34
3.2 逻辑门 35
3.2.1 非门 35
3.2.2 或门、或非门 36
3.2.3 与门、与非门 37
3.2.4 摩根定律 38
3.2.5 多输入门 39
3.3 组合逻辑 39
3.3.1 译码器 40
3.3.2 多路复用器 40
3.3.3 全加器 41
3.3.4 可编程逻辑阵列 43
3.3.5 逻辑完备性 43
3.4 存储单元 44
3.4.1 R-S锁存器 44
3.4.2 门控D锁存器 45
3.4.3 寄存器 45
3.5 内存的概念 46
3.5.1 寻址空间 46
3.5.2 寻址能力 46
3.5.3 例子:22×3内存 47
3.6 时序电路 48
3.6.1 组合密码锁 49
3.6.2 状态的概念 50
3.6.3 有限状态机 51
3.6.4 有限状态机的实现 53
3.7 LC-3计算机的数据通路 55
3.8 习题 56
第4章 冯·诺伊曼模型 65
4.1 基本部件 65
4.1.1 内存 66
4.1.2 处理单元 66
4.1.3 输入和输出单元 67
4.1.4 控制单元 67
4.2 LC-3:一台冯·诺伊曼机器 67
4.3 指令处理 69
4.3.1 指令 69
4.3.2 指令周期 70
4.4 改变执行顺序 72
4.5 停机操作 74
4.6 习题 75
第5章 LC-3结构 77
5.1 ISA概述 77
5.1.1 内存组织 77
5.1.2 寄存器 77
5.1.3 指令集 78
5.1.4 操作码 78
5.1.5 数据类型 80
5.1.6 寻址模式 80
5.1.7 条件码 80
5.2 操作指令 80
5.3 数据搬移指令 83
5.3.1 PC相对寻址 83
5.3.2 间接寻址 84
5.3.3 基址偏移寻址 85
5.3.4 立即数寻址 86
5.3.5 一个例子 87
5.4 控制指令 88
5.4.1 条件跳转指令 88
5.4.2 一个例子 90
5.4.3 循环控制的两种方法 91
5.4.4 例子:哨兵法数组求和 92
5.4.5 JMP指令 92
5.4.6 TRAP指令 93
5.5 例子:字符数统计 93
5.6 总结:数据通路(LC-3) 96
5.6.1 数据通路的基本部件 97
5.6.2 指令周期 98
5.7 习题 98
第6章 编程 104
6.1 问题求解 104
6.1.1 系统分解 104
6.1.2 三种结构:顺序、条件、循环 104
6.1.3 实现三种结构的LC-3指令 105
6.1.4 回顾字符数统计例子 106
6.2 调试 109
6.2.1 调试的基本操作 110
6.2.2 交互式调试器的使用 111
6.3 习题 116
第7章 汇编语言 120
7.1 汇编语言编程—更上一层 120
7.2 一个汇编程序 120
7.2.1 指令 121
7.2.2 伪操作 123
7.2.3 例子:字符数统计程序 124
7.3 汇编过程 125
7.3.1 概述 125
7.3.2 两遍扫描 125
7.3.3 第1遍:创建符号表 126
7.3.4 第2遍:生成机器语言程序 126
7.4 相关知识 127
7.4.1 可执行映像 128
7.4.2 多目标文件 128
7.5 习题 129
第8章 输入/输出 134
8.1 输入/输出的基本概念 134
8.1.1 设备寄存器 134
8.1.2 内存映射I/O与专用I/O指令 134
8.1.3 异步I/O与同步I/O 135
8.1.4 中断驱动与轮询 135
8.2 键盘输入 136
8.2.1 基本输入寄存器 136
8.2.2 基本输入服务程序 136
8.2.3 内存映射输入的实现 136
8.3 显示器输出 137
8.3.1 基本输出寄存器(DDR和DSR) 137
8.3.2 基本输出服务程序 137
8.3.3 内存映射输出的实现 138
8.3.4 例子:键盘回显 139
8.4 一个更复杂的输入程序 139
8.5 中断驱动I/O 140
8.5.1 什么是中断驱动I/O 140
8.5.2 为什么要引入中断驱动I/O 141
8.5.3 中断信号的产生 142
8.6 内存映射I/O的回顾 144
8.7 习题 144
第9章 TRAP程序和子程序 146
9.1 LC-3 TRAP程序 146
9.1.1 概述 146
9.1.2 TRAP机制 146
9.1.3 TRAP指令 147
9.1.4 完整机制 147
9.1.5 I/O中断处理程序 149
9.1.6 HALT中断程序 150
9.1.7 寄存器内容的保存和恢复 151
9.2 子程序 152
9.2.1 调用/返回机制 153
9.2.2 JSR(R)指令 154
9.2.3 字符输入的TRAP程序 154
9.2.4 PUTS:写字符串 156
9.2.5 库程序 157
9.3 习题 160
第10章 栈 166
10.1 栈的基本结构 166
10.1.1 抽象数据类型:栈 166
10.1.2 两个实现例子 166
10.1.3 内存中的实现 167
10.1.4 小结 170
10.2 中断驱动I/O(第二部分) 171
10.2.1 启动和执行 171
10.2.2 中断返回 173
10.2.3 例子:嵌套中断 173
10.3 基于栈的算术运算 175
10.3.1 栈的临时存储作用 175
10.3.2 例子:算术表达式 175
10.3.3 加、乘和取反 176
10.4 数据类型转换 180
10.4.1 一个错误结果的例子:2 + 3 = e 181
10.4.2 ASCII/二进制转换 181
10.4.3 二进制/ASCII转换 183
10.5 模拟计算器 184
10.6 习题 188
第11章 C语言编程概述 192
11.1 我们的目标 192
11.2 软硬件结合 192
11.3 高级语言翻译 194
11.3.1 解释执行 194
11.3.2 编译执行 194
11.3.3 两种方法的优缺点 194
11.4 C编程语言 195
11.5 一个简单的C程序 197
11.5.1 main函数 198
11.5.2 编程风格 198
11.5.3 C预处理器 199
11.5.4 输入和输出 200
11.6 小结 202
11.7 习题 202
第12章 变量和运算符 204
12.1 概述 204
12.2 变量 204
12.2.1 三种基本数据类型:int、
char、double 204
12.2.2 标识符的选择 206
12.2.3 局部变量和全局变量 206
12.2.4 更多的例子 208
12.3 运算符 208
12.3.1 表达式和语句 209
12.3.2 赋值运算符 209
12.3.3 算术运算符 210
12.3.4 算术优先级 210
12.3.5 位运算符 211
12.3.6 关系运算符 212
12.3.7 逻辑运算符 213
12.3.8 递增/递减运算符 214
12.3.9 运算符混合表达式 215
12.4 基于运算符的问题求解 215
12.5 编译器处理 217
12.5.1 符号表 217
12.5.2 变量的空间分配 218
12.5.3 完整的例子 219
12.6 补充话题 221
12.6.1 三种基本类型的变种 221
12.6.2 文字常量、常量和符号值 222
12.6.3 存储类型 223
12.6.4 更多的C运算符 223
12.7 小结 224
12.8 习题 224
第13章 控制结构 227
13.1 概述 227
13.2 条件结构 227
13.2.1 if语句 227
13.2.2 if-else语句 229
13.3 循环结构 231
13.3.1 while语句 231
13.3.2 for语句 233
13.3.3 do-while循环 236
13.4 基于控制结构的问题求解 236
13.4.1 问题1:p的近似值求解 236
13.4.2 问题2:找出100以内的质数 239
13.4.3 问题3:分析一个E-mail地址 241
13.5 其他C语言控制结构 243
13.5.1 switch语句 243
13.5.2 break和continue语句 244
13.5.3 简单计算器的例子 244
13.6 小结 245
13.7 习题 246
第14章 函数 250
14.1 概述 250
14.2 C语言中的函数 250
14.2.1 带参数的函数 251
14.2.2 求解圆面积 253
14.3 C语言中函数的实现 254
14.3.1 运行时栈 254
14.3.2 实现机制 254
14.3.3 汇总 259
14.4 问题求解 260
14.4.1 例1:大小写转换 260
14.4.2 例2:毕达哥拉斯三角形 262
14.5 小结 263
14.6 习题 263
第15章 测试与调试技术 268
15.1 概述 268
15.2 错误类型 269
15.2.1 语法错误 269
15.2.2 语义错误 269
15.2.3 算法错误 270
15.3 测试 271
15.3.1 黑盒测试 271
15.3.2 白盒测试 272
15.4 调试 272
15.4.1 特定方法 273
15.4.2 源码级调试工具 273
15.4.3 断点 273
15.5 正确的编程方法 274
15.5.1 明确规格说明 274
15.5.2 模块化设计 275
15.5.3 预防错误式编程 275
15.6 小结 276
15.7 习题 276
第16章 指针和数组 280
16.1 概述 280
16.2 指针 280
16.2.1 声明指针变量 281
16.2.2 指针运算符 282
16.2.3 指针传递一个引用 283
16.2.4 空指针 284
16.2.5 语法 284
16.2.6 指针例程 285
16.3 数组 286
16.3.1 数组声明 286
16.3.2 数组应用 287
16.3.3 数组参数 289
16.3.4 C语言的字符串 290
16.3.5 数组与指针的关系 293
16.3.6 实例:插入排序 293
16.3.7 C语言数组的不足 295
16.4 小结 296
16.5 习题 296
第17章 递归 299
17.1 概述 299
17.2 什么是递归 299
17.3 递归与循环 300
17.4 汉诺塔 301
17.5 斐波纳契数列 304
17.6 二分查找 307
17.7 整数转换为ASCII字符串 309
17.8 小结 310
17.9 习题 310
第18章 C语言中的I/O 315
18.1 概述 315
18.2 C标准库函数 315
18.3 字符I/O操作 315
18.3.1 I/O流 316
18.3.2 putchar函数 316
18.3.3 getchar函数 316
18.3.4 缓冲I/O 316
18.4 格式化I/O 317
18.4.1 printf 317
18.4.2 scanf 318
18.4.3 可变长参数 320
18.5 文件I/O 321
18.6 小结 322
18.7 习题 323
第19章 数据结构 324
19.1 概述 324
19.2 结构体 324
19.2.1 typedef 326
19.2.2 结构体在C中的实现 326
19.3 结构体数组 327
19.4 动态内存分配 328
19.5 链表 330
19.6 小结 336
19.7 习题 336
附录A LC-3指令集结构 339
附录B 从LC-3到x86 353
附录C LC-3的微结构 367
附录D C编程语言 383
附录E 常用表 403
附录F 部分习题答案

教学资源推荐
作者: [美]玛里琳·沃尔夫(Marilyn Wolf)著
作者: [澳]拉库马·布亚(Rajkumar Buyya)[澳]克里斯坦·维奇拉(Christian Vecchiola)[印]S. 泰马莱·赛尔维(S. Thamarai Selvi) 著
参考读物推荐
作者: [丹麦]克劳斯·埃尔克(Klaus Elk) 著
作者: [美]阿诺德·S.伯格(Arnold S.Berger) 著
作者: [英]姚文祥(Joseph Yiu) 著