前 言A
本书介绍x86和Intel64处理器的汇编语言编程与架构,适合作为下述几类大学课程的教材:
汇编语言编程计算机系统基础计算机体系结构基础学生使用Intel或AMD处理器,用Microsoft宏汇编器(Microsoft Macro Assembler,MASM)编程,MASM运行在Microsoft Windows最新的版本上。尽管本书的初衷是作为大学生的编程教材,但它也是计算机体系结构课程的有效补充。本书广受欢迎,前几个版本已被翻译为多种语言。
重点主题 本版所含主题可以自然过渡到讲述计算机体系结构、操作系统和编写编译器的后续课程:
虚拟机概念指令集架构基本布尔运算指令执行周期内存访问和握手中断和轮询基于硬件的I/O浮点数二进制表示其他主题则专门针对x86和Intel64架构:
受保护的内存和分页实地址模式的内存分段16位中断处理MS-DOS和BIOS系统调用(中断)浮点单元架构和编程指令编码本书中的某些例子还可以用于计算机科学课程体系中的后续课程:
搜索与排序算法高级语言结构有限状态机代码优化示例第7版的新内容这一版增加了对程序示例的讨论,添加了更多的复习题和关键术语,介绍了64位编程,降低了对子程序库的依赖性。具体内容如下:
本版前面的几章现在包含了以64位CPU架构和编程为主的小节,并且还创建了子程序库的64位版本Irvine64。
修改、替换了很多复习题和练习,部分题目从章节内移动到该章末尾,且习题分为两部分:简答题和算法基础练习。后者要求学生编写一小段代码实现一个目标。
每章有一节为关键术语,列出了新的术语和概念,以及新的MASM伪指令和Intel指令。
添加了新的编程练习,删除了一些旧习题,并对一些现有的练习进行了修改。
本书对作者子程序库的依赖性大大减低。鼓励学生自己调用系统函数,并使用Visual Studio调试器单步执行程序。Irvine32和Irvine64链接库可以帮助学生处理输入/输出,但是不强制要求使用它们。
作者录制的新视频教程涵盖了本书的基本内容,并已添加到Pearson网站。
本书仍然关注其首要目标,即教授学生编写并调试机器级程序。它不能代替计算机体系结构的完整教材,但它确实在告诉学生计算机工作原理的基础上,给出了编写软件的第一手经验。我们认为,理论联系实际能让学生更好地掌握知识。在工程课程中,学生构建原型;在计算机体系结构课程中,学生应编写机器级程序。在这些课程里,学生都能获得难忘的经验,从而有信心在任何OS/面向机器的环境中工作。
保护模式编程是纸版章节(第1章~第13章)的重中之重。因此,学生需要在最新版本的Microsoft Windows环境下创建并运行32位和64位程序。其他4章是电子版,讲述16位编程。这些章包含了BIOS编程、MS-DOS服务、键盘和鼠标输入、视频编程和图形图像内容。其中一章为磁盘存储基础,还有一章为高级DOS编程技术。
子程序库 本书为学生提供了三个版本的子程序库,用于基本输入/输出、模拟、计时和其他有用的任务。Irvine32和Irvine64链接库运行于保护模式。16位版本的链接库(Irvine16.lib)运行于实地址模式,且只用于第14章~第17章。这些库的完整源代码见于配套的网站。链接库是为了使用方便,而不是为了阻止学生学习如何自行对输入–输出编程。鼓励学生创建自己的链接库。
所含软件与示例 所有示例程序均在Microsoft Visual Studio 2012下,用Microsoft Macro Assembler Version 11.0进行了验证。此外,还提供了批处理文件允许学生用Windows命令行汇编和运行应用程序。第14章中的32位C++应用程序已用Microsoft Visual C++ .NET测试。本书的内容更新与勘误参见配套的网站,其中包括了一些额外的编程项目,老师可以在章节结束的时候布置给学生。
总体目标本书的以下目标旨在提高学生对汇编语言相关知识的兴趣并拓展知识面:
Intel和AMD处理器架构与编程;实地址模式和保护模式编程;汇编语言伪指令、宏、运算符与程序结构;编程方法,展示了如何用汇编语言创建系统级软件工具和应用程序;计算机硬件操作;汇编语言程序、操作系统和其他应用程序之间的交互作用。
本书的目标之一是帮助学生以机器级的思维方式来处理编程问题。将CPU视为交互工具,学习尽可能直接地监控其操作是很重要的。调试器是程序员最好的朋友,不仅可以捕捉错误,还可以用作学习CPU和操作系统的教学工具。我们鼓励学生探查高级语言的内部机制,并能意识到大多数编程语言都被设计为可移植的,因此,也独立于其运行的主机。除了短小的示例外,本书还有几百个可运行的程序来演示书中讲述的指令和思想。本书结尾有参考资料,包括MS-DOS中断和指令助记符指南。
背景知识 读者应至少能熟练使用一种高级语言进行编程,比如Python、Java、C或C++。本书有一章涉及C++接口,因此,如果手边有编译器将会非常有帮助。本书不仅已经用于计算机科学和管理信息系统专业课堂,而且还用于其他工程课程。
特点完整的程序清单 配套的网站包含了补充资料、学习指南,以及本书全部示例的源代码。本书还提供了丰富的链接库,其中包括30多个过程,可以简化用户输入–输出、数字处理、磁盘和文件处理,以及字符串处理。课程初期,学生可以用这个链接库来改进自己编写的程序。之后,学生可以自行编写过程并将它们添加到链接库中。
编程逻辑 本书用两章的篇幅重点介绍了布尔逻辑和位操作,并且有意识地尝试将高级编程逻辑与底层机器细节对应起来。这有助于学生创建更有效的实现,且有助于他们更好地理解编译器是如何生成目标代码的。
硬件和操作系统概念 本书前两章介绍基础硬件和数据表示概念,包括二进制数、CPU架构、状态标志和内存映射。概述硬件和以历史的角度审视Intel处理器系列可以帮助学生更好地理解其目标计算机系统。
结构化程序设计方法 从第5章开始,关注重点为过程和功能分解。同时,提供了更复杂的编程练习,要求学生在编码之前把设计作为重点。
Java字节码和Java虚拟机 第8章和第9章解释了Java字节码的基本操作,并给出了简短的演示例子。很多短示例不仅给出了反汇编字节码形式,还给出了详细的步骤解释。
磁盘存储概念 学生从硬件和软件的角度学习基于MS-Windows的磁盘存储系统的基本原理。
创建链接库 学生不仅可以自由地把自己编写的过程添加到本书链接库,还可以创建新的链接库。他们要学习用工具箱方法进行编程,并编写多个程序可以共用的代码。
宏和结构 本书用一章专门描述创建结构、联合以及宏,这些对汇编语言编程和系统编程是非常重要的。条件宏和高级运算符使得宏更加专业。
高级语言接口 本书用一章专门描述汇编语言与C和C++的接口。对于想要从事高级语言编程工作的学生而言,这是一项重要的工作技能。他们可以学习代码优化,还可以通过例子了解C++编译器是如何优化代码的。
教学辅助 所有的程序清单都在网上。同时向教师提供了测试库、复习题答案、编程练习的解决方案,以及每章的PPT。
章节说明第1章~第9章为汇编语言核心概念,需要按顺序学习。后面的章节则可以自由选择。下面的章节示意图展示了后续章节与其他章节知识之间的依赖关系。
第1章 基本概念:汇编语言的应用、基础概念、机器语言和数据表示。
第2章 x86处理器架构:基本微计算机设计、指令执行周期、x86处理器架构、Intel64架构、x86内存管理、微计算机组件、输入–输出系统。
第3章 汇编语言基础:介绍汇编语言、链接和调试、常量和变量定义。
第4章 数据传送、寻址和算术运算:简单的数据传送和算术运算指令、汇编–链接–执行周期、运算符、伪指令、表达式、JMP和LOOP指令、间接寻址。
第5章 过程:与外部链接库的链接、描述本书链接库、堆栈操作、过程的定义和使用、流程图、自顶向下的结构设计。
第6章 条件处理:布尔和比较指令、条件跳转和循环、高级逻辑结构、有限状态机。
第7章 整数运算:移位和循环移位指令及其应用、乘法和除法、扩展加法和减法、ASCII和压缩十进制运算。
第8章 高级过程:堆栈参数、局部变量、高级PROC和INVOKE伪指令、递归。
第9章 字符串和数组:字符串原语、操作字符和整数数组、二维数组、排序和检索。
第10章 结构和宏:结构、宏、条件汇编伪指令、定义重复块。
第11章 MS-Windows编程:保护模式内存管理概念、用Microsoft-Windows API显示文本和颜色,动态内存分配。
第12章 浮点数处理与指令编码:浮点数二进制表示和浮点运算。学习IA-32浮点单元编程。理解IA-32机器指令编码。
第13章 高级语言接口:参数传递规范、内嵌汇编代码、将汇编语言模块链接到C和C++程序。
附录A MASM参考知识附录B x86指令集附录C “本节回顾”问题答案下面的章节和附录由配套网站提供:
第14章 16位MS-DOS编程:内存组织、中断、函数调用、标准MS-DOS文件I/O服务。
第15章 磁盘基础知识:磁盘存储系统、扇区、簇、目录、文件分配表、处理MS-DOS错误码、驱动器和目录操作。
第16章 BIOS编程:键盘输入、视频文本、图形、鼠标编程。
第17章 高级MS-DOS编程:自定义设计段、运行时程序结构、中断处理、用I/O端口的硬件控制。
附录D BIOS和MS-DOS中断附录E “本节回顾”问题答案(第14章~第17章)教师和学生资源教师资源下面受保护的教师资源见配套网站www.pearsonhighered.com/irvine:
PPT讲义教师解题手册学生资源学生通过位于www.pearsonhighered.com/irvine的出版社网站可以找到本书作者的网站链接。下述资源位于www.asmirvine.com,且不需要用访问卡:
Getting Started(入门),循序渐进的完整教程,帮助学生设置Visual Studio进行汇编语言编程。
与汇编语言编程主题相关的补充读物。
本书全部示例程序的完整代码,以及作者补充链接库的源代码。
Assembly Language Workbook(汇编语言工作手册),一个交互式的工作手册,其中包括数值转换、寻址模式、寄存器使用、调试编程和浮点二进制数。内容页面是可以自定义的HTML文档,帮助文件为Windows帮助格式。
调试工具:Microsoft Visual Studio调试器用法教程。
致谢非常感谢培生教育(Pearson Education)计算机科学的执行主编Tracy Johnson,过去几年提供了友好且有益的指导。感谢Jouve公司的Pavithra Jayapaul以及培生出版社的产品编辑Greg Dulles为本书出版所做的出色工作。
早期版本特别感谢以下诸位,他们在本书早期版本中提供了极大的帮助:
William Barrett,圣何塞州立大学Scott BlackledgeJames Brink,太平洋路德大学Gerald Cahill,羚羊谷学院