译 者 序
汇编语言是计算机科学技术专业的专业基础课程,同时也是电子、通信及自动控制等相关专业的计算机技术课程的内容。汇编语言是很多相关课程(如数据结构、操作系统、微机原理等)的重要基础。汇编语言是面向机器的程序设计语言,它是机器语言便于记忆和理解的符号形式(又称为助记符)。它是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言是一种与硬件紧密相关的程序设计低级语言,在不同的设备中,汇编语言对应着不同的机器语言指令集。一种汇编语言专用于某种计算机系统结构,而不像许多高级语言,可以在不同系统平台之间移植。本书选择了广泛应用的Intel架构,希望读者花最少的时间学会使用Intel汇编语言来编写程序。通过编写程序让读者了解和掌握更多的基于Intel 32位处理器的计算机体系结构方面的知识,更好地理解高级程序设计语言与低级程序设计语言之间的关系。
本书涵盖了汇编语言的基础知识,它既可以作为汇编语言单学期课程的独立教材来使用,也可以作为计算机组成原理或计算机体系结构课程的辅助教材。本书作者的基本想法是,希望读者能够更加快速地学会如何使用汇编语言进行程序编写,希望读者在最短的时间内,学会如何编写出逻辑上正确的程序来。因此,本书在第1章概要介绍了汇编语言及寄存器方面的内容,后续章节主要介绍如何使用汇编语言进行输入输出操作、如何进行算术运算、如何实现选择结构、迭代结构、逻辑运算、移位运算、堆栈、过程、宏、数组和字符串处理,章节中贯穿了大量示例,帮助读者理解学习相关概念及用法;同时,在大多数汇编语言代码段的前面,会先给出相应的C语言代码,这样可以帮助读者更好地理解高级语言与低级语言之间的相互关系。同时,本书对寄存器的用法进行了精简,使用了类C的语句简化输入/输出操作,同时使用高级控制语句。这些特色能够帮助读者快速地开始程序编写。本书中很多控制语句没有使用高级结构,这有助于读者更好地理解这些控制语句是如何被实现的。另外,每章结尾包含了一个或多个完整的程序示例来说明和应用该章节所介绍的相关知识和概念。每章小结作为各章内容的复习素材,帮助读者梳理总结相关知识点。全书共有10章和5个附录,非常全面地介绍了汇编语言程序设计基础内容,认真阅读本书,你一定会收获颇丰。
本书主要由远红亮翻译,张艳艳、康文萍、李建伟、林杰、蔡玲玲、刘燕、王亚红、王翔、李克新、王岚、邓勇、朱园园、张鹏、林青和王立等也参与了部分章节内容的翻译,在此对大家表示衷心感谢。
由于译者知识有限,书中的翻译错误和不妥之处在所难免,读者若发现翻译处理不当之处,欢迎批评指正。
前 言
目标
本书希望达到的目标是让读者花最少的时间学会使用Intel汇编语言来编写程序。除此之外,希望读者能够通过编写程序来了解和掌握更多的基于Intel 32位处理器的计算机体系结构方面的知识,以及高级程序设计语言与低级程序设计语言之间的关系。
需求
在过去,许多系会开设两门独立的课程:一门是汇编语言程序设计(有时称为计算机系统原理),另一门是计算机组成原理与体系结构。在今天繁重的课程体系之下,有时在计算机科学课程体系中只有一门关于计算机组成原理与体系结构的课程,因此过去两门课程的内容会包含在今天一门课程中来介绍。这样导致的不幸结果是,不能充分学习关于汇编语言程序设计方面的知识。
汇编语言的重要性
虽然社会对于汇编语言程序员的需求在不断减少,但是对于程序员来说,理解汇编语言的需求却从来没有削减过,之所以需要学习使用汇编语言编写程序,原因如下:
* 有时候单纯阅读汇编语言本身是不够的,最好动手使用汇编语言编写一段程序才能更好地理解相关内容(编写的代码不需要非常复杂或者难度系数特别高,简单的程序就可以达到帮助学习相关知识的目的)。
* 虽然某些高级程序设计语言包含有低级语言的特性,但是有时候使用汇编语言编写的程序才能在运行时间和内存占用上实现更高的效率。
* 使用汇编语言编写的程序同机器语言程序优点相同,而且汇编语言程序更容易编写。另外,程序员能够通过编写汇编语言程序更加直接地学习到关于计算机系统、组成原理和体系结构方面的相关知识。
* 低级语言程序设计的相关知识能够帮助程序员更好地理解高级程序设计语言是如何被设计实现的以及各种相关编译器的构造概念。
与其他计算机组成原理和汇编语言教程的对比
大多数计算机组成原理方面的教程只有很少的章节介绍汇编语言,这种情况会导致这些教程难以充分地覆盖汇编语言的多方面内容。有时候这些教程还会使用非真实的汇编语言进行概念的讲解,也就是说,它们使用虚构的汇编机器语言进行相关概念的介绍,虽然这种做法在理解一些基本概念的时候还是可以的,但是对于学生来说,很难从中学习并领会到真实汇编语言的重要概念。
另外,还有一部分汇编语言教程着重介绍语言细节方面的内容,这些内容很容易填满整个学期的课程,而且几乎都可以连续安排两个学期来学习了。基于同样的原因,不幸的是,其中一些容易理解的汇编语言教程可能也不是学习汇编语言编写程序的最佳选择,因此,这些种类的教程都不是最佳的学习教程。
本书不打算去满足上述两类教程中任何一类的需求,因为这样会使得本书与它们归于同一类别。本书着重于介绍汇编语言编程的基础内容,这使得本书既可以作为独立的教程供学生学习,也可以作为热门的计算机组成原理课程的辅助教程供学生参考。
本书的特色
本书的主要目的是让学生能够更加快速地学会如何使用汇编语言进行程序编写。为实现这个目的,本书的特色之一是简化寄存器的用法,使用类C的语句简化输入输出的用法以及使用高级控制语句。这些特色能够帮助读者快速地开始程序编写工作,且能够将读者先前从其他计算机科学课程中学过的相关概念用于其中。另外,很多控制语句没有使用高级结构,这会让读者更好地理解这些控制语句是如何实现的。再者,在大多数汇编语言代码前面先给出相应的C语言代码,这样可以帮助读者更好地理解高级语言与低级语言之间的相互关系。每章结尾的特色内容如下:
* 使用一个或多个完整的程序示例来说明和应用该章节所介绍的相关知识和概念。
* 每章小结虽然不能作为读者阅读各个章节内容的替代读物,但是它们可以用作为每章内容的复习素材,帮助读者筹备相关的小测验或考试。
* 复习题包含有各种类型的练习题,从简答题到程序设计题都有。标记有*号的练习题,它们的答案可以在附录E中找到。
各章与附录内容简介
如果把本书作为计算机组成原理课程的辅助教材,其内容可能会与计算机组成原理教程的内容有一些重复的部分。例如,大多数汇编语言教程都会先开始介绍二进制运算,该内容在低级语言课程中是相当重要的部分。但是,假如本书与计算机组成原理教程一起使用的话,可以肯定的是很多相关概念在计算机组成原理教程中都已经介绍过了。因此,本书直接从教授学生如何编程开始,二进制的相关内容作为必要的基础知识进行介绍与回顾。但是,如果把本书作为单独的教程进行学习的时候,附录B中介绍的二进制、十六进制、进制之间的转换、逻辑运算与算数运算的详细内容可能就需要首先学习一下了。如下是各章与附录内容的概要:
第1章概要介绍汇编语言以及通用寄存器方面的内容。
第2章特别使用C语言中的scanf和printf指令来介绍汇编语言中的输入与输出操作。
第3章介绍汇编语言中的算数运算,包括加法、减法、乘法、除法以及运算优先级。
第4章介绍在汇编语言中的如何实现选择结构,比如if-then结构、if-then-else结构、嵌套if结构以及case(switch)结构。
第5章介绍迭代结构,包括pre-test结构、post-test结构,以及迭代loop结构与嵌套loop结构。
第6章介绍逻辑、移位、算数移位、循环移位以及堆栈指令。
第7章将讨论过程,并介绍宏,以及条件汇编。
第8章介绍数组、顺序检索和选择排序。
第9章介绍字符串、字符串指令、字符串数组以及字符串比较。
第10章以探索的视角来观察学习机器语言,也可以将这部分内容作为计算机组成原理某些知识的入门学习或者作为计算机组成原理教程的补充材料进行学习。
附录A介绍如何安装Visual C++和MASM并使用它们汇编程序。
附录B介绍二进制与十六进制之间的相互转换,以及逻辑运算和算术运算。本书的前三章用到了一些二进制和十六进制的知识,因此可以等后续课程中用到相关内容的时候再来阅读本附录即可。不过,第6章需要用到二进制数值和逻辑运算方面的知识。如果读者之前没有学习过这方面的知识,本附录的内容应该在学习第6章之前先读一读,本附录的内容是一个很好的入门材料;如果读者之前已经学习过数值系统的内容,那么可以把这里的内容作为复习材料来参考。另外,如果读者在其他先修课程、同期课程或本课程的其他参考文献中接触过这方面的知识,那么本附录的内容可以跳过不读。
附录C是术语表。术语表中关于术语的描述不能替代本书中关于术语的完整全面描 述,术语表的内容主要是为了方便快速查阅相关术语以及提醒该术语的基本意义。如果需要了解该术语的完整描述,索引部分标注了该术语在本书中的具体页码,读者可以到书中查阅该术语的详细解释。
附录D总结了本书中介绍过的汇编语言指令。
附录E给出了每章末尾以及附录B末尾练习题中带有*号练习题的参考答案。
内容范围
本书涵盖了汇编语言的基础知识,它既可以作为汇编语言单学期课程的独立教材来使用,也可以作为计算机组成原理或计算机体系结构课程的辅助教材。在编写任何一本教材的时候,都会遇到这样的问题,必须要决定这本教材需要包含哪些内容、不需要包含哪些内容、需要强调哪部分内容以及需要弱化哪部分内容。本书也不例外,本书并不会包含汇编语言内容的方方面面,也不会把所有指令的每一个子主题都介绍一遍。比如,16位运算、浮点数运算、Windows编程等等,这一类内容可由教师自行掌握是否需要补充讲授。不过,对读者来说,最需要的是能够在最短的时间内,学会如何编写出逻辑上正确的程序来,这也是本书的基本想法。
之所以选择Intel架构是基于它被广泛应用的特点,而选择MASM(Microsoft Assembler,微软汇编程序)是因为在该汇编程序中可以使用大量的高级控制结构。注意Java是Oracle公司的注册商标或旗下产品,Intel 386与奔腾是Intel公司的注册商标,而Visual Studio、Visual C++与MASM是微软公司的注册商标。
读者
希望本书的读者已经学完了两个学期的高级程序设计语言的入门课程,比如C、C++或Java。尽管有些读者可能在一个学期之后就会用到本书,但是多一个学期高级程序设计课程的学习会很好地帮助理解本书的内容,因为这里的内容涉及到高级程序设计技能。
致谢
本书作者非常感谢本书的编辑Wayne Wheeler的帮助;感谢本书的评审,Albion大学的Mark E. Bollman,Iowa大学的James W. Chaffee,Loras大学的Brenda Tuomi Litka,Illinoins大学的Takako Soma,DePaul大学的Curt M. White,感谢他们提出的宝贵意见;感谢Illinions大学计算机科学与技术专业的学生,感谢他们在课堂学习中对本书所有内容的细致检查;特别感谢我的妻子Kimberly A. Streib及其儿子Daniel M. Streib,感谢他们的耐心;最后谨以此书献给我的母亲Doris G. Streib以及我的姐姐Lynn A. Streib。
反馈
由于时间有限,错误之处在所难免。欢迎任何形式的评论、指正和建议,可以联系下面的邮箱进行反馈。另外,每章末尾程序的完整复制以及所有重要的修正内容都可以到如下的网站上查找。
Illinois大学 James T. Streib
Jacksonville, Illinois E-mail: jtstreib@ic.edu
October 2010 Web网站: http://www2/jtstreib/guide