本书涵盖了有关MIPS处理器的发展历史、运行原理和编程等诸多内容。首先介绍了MIPS的发展历史;然后分别对MIPS处理器的体系结构、协处理器、Cache、中断、内存管理、浮点运算、MIPS指令集、汇编语言编程、C语言编程、代码的可移植性等细节进行了详细深入的分析;最后列举了一些MIPS代码的例子。本书不仅内容充实,而且语言通俗易懂,是MIPS体系结构领域中全面性和易读性结合的很好的一本书,适合学习MIPS体系结构的初学者;同时对于MIPS程序员和高级用户也极有参考价值。本书既可用作计算机类、微电子类本科生及研究生教科书和参考书,也可作为从事MIPS软件开发、计算机体系结构研究和开发人员的参考资料。本书前言这是一本关于MIPS的书。MIPS是20世纪80年代中期诞生的RISCCPU设计之一,也是销量最好的RISCCPU之一。从SONY、任天堂的游戏主机,到Cisco的路由器,再到SGI的超级计算机,到处都能看到MIPSCPU的应用。目前,RISC体系结构正面临着普及与强大的x86体系结构CPU的强烈冲击,到20世纪末,MIPS也许会是那些原始RISCCPU设计中惟一正常盈利的体系结构。RISC是一个有用的名词,而并非只是市场宣传用语,它体现了20世纪80年代中期为提高流水线效率所设计的一组计算机体系结构之间的共同特性。CISC则麻烦得多,因为它实际上泛指所有非RISC的东西。本书将采用一个狭义的CISC定义,用它来指使用微代码控制的结构,如68000、x86等。本书是为程序员编写的,这个目标决定了本书内容的取舍。如果一个程序员遇到问题或感兴趣,那么这些内容将包含在本书内。这意味着我们不必讨论那些困扰了两代硬件设计工程师的MIPS接口问题。在操作系统中可能隐藏着许多我们在这里讨论的细节。有许多优秀的程序员认为C语言已经足够地接近底层了,结构方面的调节不需要关心。但有时确实需要深入具体细节——对比特边界是如何工作的这一问题,人类是天生就满怀好奇的。根据这个原则,我们在描述一个软件人员可能不熟悉的东西时,倾向于非正式的方式——特别是关于CPU内部工作原理的内容。但讨论到程序员们以往见过的东西,如寄存器、指令以及数据如何存储在内有等问题时,我们将采用更简洁和技术化的说法。这里假设本书的读者已经熟悉并适应了C语言。在本书中,大多数的引用材料使用C语言作为简要操作的一种描述方法,特别是在指令集细节和汇编语言相关的章节。在本书中有些部分是要求读者要了解CISC(即680x0或x86)汇编语言的,因为站在CISC的角度上,MIPS体系结构的独创性与特殊性会更好地体现出来。当然如果不熟悉CISC汇编,这也并没有太大关系。通常需要对CPU的细节了解到本书所述程序的是操作系统开发人员或在嵌入式领域工作的人。嵌入式系统广义来说,是指任何把计算机操作得不像计算机的用法。这些系统的共同特征是,操作系统并未将CPU工作的细节隐藏起来,它对于程序员来说是可见的。MIPSCPU可以应用在很宽的领域内,例如从游戏程序领域到工业控制领域。但这并不是说本书只是一本参考手册,要把一个CPU体系结构留在你的大脑里,就必须真正地理解它。我希望本书能引起希望全面理解现代CPU体系结构的学生(在校或即将入校的学生)的编程兴趣。如果从头到尾地将此书读上一遍,你大概会期望从综述到细节的逐步深入过程,本书正是如此。不过同时,你还会看到一些按历史发展的内容表述,通常我们第一次介绍某个概念时,会讨论关于它的第一个版本。Hennessy和Patterson称此为“进化学习(learningthroughevolution)”,我们认为这是一种优秀的表达方法(当然,对他们来说足够优秀的方法对我也是一样的)。因此,在第1章中以一些历史和背景作为开始,把MIPS放在当时的环境中,来讨论当初MIPS的发明者们在头脑中最初形成的相关技术和观念。在第2章中,继续跟随他们的思路讨论MIPS机器语言的特点。为了简化指令,前两章省去了处理器控制方面的细节,我们把这内容留到第3章。处理器机制难看但实用,它允许MIPSCPU处理它们的高速缓存(cache)、异常和启动(exceptionsandstartup)与存储器管理(memorymanagement)。以上三个主题将分别由第4章到第6章来讨论。MIPS指令集中和浮点数处理相关的部分被刻意地分离开来。这种分离使得我们可以设计不同程序支持浮点的MIPS处理器,从完全不支持、部分支持到完全支持。所以也把浮点功能放在第7章单独介绍。到此为止,是按照一个合乎逻辑的顺序来使读者获取MIPS方面的知识。但在剩余的章节中将作一些调整,将使它们更像一本参考手册或是一本基于例子的教程。第8章将全面介绍整个MIPS指令系统。目的是详尽地介绍MIPS指令集,但是要比标准MIPS手册要简洁得多。本书只用了十来页篇幅介绍指令集,而在其他书中则需要一百多页来讲述。第9章讲述的是汇编语言编程,其组织结构更像一本编程手册。本章的风格与本书其余章节不同,它的出现是由于一直没有一份合适的MIPS汇编语言手册。任何在汇编级别的编程者,将会看到本书其余部分都有相关内容。第10章面向的读者是熟悉C编程而关心其中MIPS体系结构有影响的部分的,如包括MIPS编译器下的存储器管理和参数传递的执行。第11章是一个帮助提示的列表,来帮助读者在MIPS和其他CPU间移植软件。第12章收集了一些软件的片断,并加入了注释,这些都是根据本书的相关主题精选出来的。理解实际软件也许会很困难,但是如果读者从事MIPS软件项目开发,不管把它看作为一个风格指南,还是看作一个参考列表,此章将会非常有用。附录A(关于指令时序)、附录B(关于汇编语言语法)和附录C(关于目标代码)中包含了很高的技术含量,尽管有许多东西可能不会涉及到,但这些是不能被完全忽略的。在附录D中能看到一些关于MIPS体系结构的一些消息,能了解到MIPS16、MDMX和MIPSV扩展的指令系统。在本书的末尾还能看到相关的术语说明——可以查询专用名词、陌生名词和缩写。风格和限制(styleandlimits)因为每本书都体现了作者的劳动,所以我最好说说本书的优点。因为读者当中有一些学生,所以我想是否要把MIPS的用法和普通用法区分开。但我决定不这么做,除非这样做没有任何代价。我也尽量把书写得具体些,而不那么抽象。我并不关心像TLB之类的术语在更大的范围内有什么含义,但会解释它们在MIPS上下文中的意思。人类有很强的总结能力,我想这一点对于学习者来说不会造成太大的打击。本书至少酝酿了七年,所以并不是一朝一夕写成的。我在1986年开始从事MIPS体系结构方面的工作。在1988年之前,我给一些客户做关于MIPS体系结构方面的培训课程,其中演示的幻灯片就成了本书的一些框架。在1993年,我将它们收集在一起并给IDT公司做了一个软件手册作为MIPS文档包的一部分来出版,但它仅针对IDTR3051系列,略去了许多有趣的细节。在1995到1996年间,本书加入了64位的CPU的内容,并且覆盖了所有看上去相关的内容。MIPS的传奇还在继续,不然,本书只能写给历史学家,MorganKaufmann也将不愿意出版它了。因为撰写和审核本书的过程相当的长,所以我不得不定义了一些合理的止步点。有些宣布得太晚的MIPS技术发展,书中没有涉及,但在出版前更新了附录D来尽量多地反映当今MIPS方面的发展。感谢(acknowledgments)本书中的所有主题都是根据我所从事计算机方面的经验来写的。MikeCole使我对计算机产生了浓厚的兴趣,所以从那时起我就试着效仿他的技巧来筛选一些好的想法。许多人在Whitechapel工作站教过我一些关于计算机结构和硬件设计方面的东西——可能BobNewman和RickFilipkiewicz是让我受益最多的人。我也必须感谢Whitechapel的销售员DaveGravell让我最初接触了MIPS。我对在Algorithmics的工程师同事们(ChrisDearman,RickFilipkiewicz,GeraldOnions,NigelStephens和ChrisShaw)必须致以双倍的感谢,在同他们无数次的探讨、争论和设计中使本书能够跟上时代的竞争。在MorganKaufmann,我也不止耗尽了一个编辑的精力:BruceSpatz在最初鼓励我开始写此书,JenniferMann接管了此事,DenisePenrose帮着出版。还要感谢很多的评论家对于本书的章节花费了大量的时间:IDT(IntegratedDeviceTechnology,Inc.)公司的PhilBourekas,LSILogicCorporation的ThomasDaniel,SGI公司的MikeMurphy和CarnegieMellon大学的DavidNagle。Algorithmics的NigelStephens写了最初版本的第9章的一部分和附录B、附录C中关于汇编语言语法和目标代码部分。在这些部分如果有错误,那全都是我的失误,与他无关。作者