
本书是普通高等教育“十一五”国家级规划教材,是教育部-微软精品课程教学成果。本书以Intel 80x86指令系统和MASM 6.x为主体,共10章,分为基础和提高两部分。前5章作为基础部分,以当前“汇编语言程序设计”课程的教学为目标,讲解16位基本整数指令及其汇编语言程序设计的知识,包括:汇编语言程序设计基础知识,8086指令详解,MASM伪指令和操作符,程序格式,程序结构及其设计方法。后5章为提高部分,介绍汇编语言程序设计的深入内容和实际应用知识,包括:32位80x86 CPU的整数指令系统及其编程,汇编语言与C/C++混合编程,80x87 FPU浮点指令系统及其编程,多媒体扩展指令系统及其编程,64位指令简介。 本书可作为高等院校“汇编语言程序设计”课程的教材或参考书。本书内容广博、语言浅显、结构清晰、实例丰富,也适合电子信息、自动控制等专业的高校学生和成教学生、计算机应用开发人员、深入学习微机应用技术的普通读者阅读。
第4版前言 本书以Intel 80x86指令系统和MASM 6.x为主体,在个人微机的MSDOS和Windows操作系统平台上,依据循序渐进的原则,以浅显的语言、清晰的结构、丰富的实例,全面而系统地介绍整数指令、浮点指令、多媒体指令的汇编语言程序设计方法,以及汇编语言的模块化开发、32位Windows应用程序的编写、与C/C++混合编程等高级技术。全书共10章,分为前5章的基础部分和后5章的提高部分。 第1章总结性地给出进行汇编语言程序设计所需要学习的基本知识,包括微型计算机系统的软件和硬件组成、数据表示,并重点展开8086通用寄存器和寻址方式。 第2章详尽地讲述8086微处理器整数指令的功能和使用,并引导读者正确书写每条指令、理解程序段的功能,以及编写常见问题的汇编语言程序。 第3章结合汇编语言源程序格式,引出程序开发、语句格式、常用伪指令和操作符、段定义等内容。 第4章以程序设计技术为主线,结合大量的程序实例详述顺序、分支、循环、子程序结构的汇编语言程序设计方法。 第5章介绍汇编语言的高级程序设计技术,包括MASM的高级语言特性、宏结构程序、模块化程序设计和I/O程序设计。 第6章首先将16位指令及编程扩展到32位环境,其次介绍新增整数指令及其应用,最后重点展开利用汇编语言编写32位Windows控制台和窗口应用程序的开发环境和基本方法。 第7章讨论汇编语言与高级语言Turbo C和Visual C++的混合编程,并说明如何利用汇编语言优化C++代码,以及利用Visual C++集成环境开发汇编语言程序的方法。 第8章介绍Intel 80x87浮点数据格式、浮点指令及其程序设计方法。 第9章介绍MMX、SSE、SSE2和SSE3多媒体指令及其编程方法。 第10章简介Intel 64结构的64位指令。 每章最后配有相当数量的习题,既可以作为课后作业,也可以作为上机练习。 附录内容包括:详解DEBUG调试程序,可用于配合前5章,尤其是第1章和第2章寻址方式、指令功能、程序片段的学习;介绍CodeView调试程序的使用方法,用于第3章以后进行源程序级的程序调试;提供汇编程序MASM 6.11的伪指令、Intel 80x86整数指令和常见汇编错误列表;与本教材配套的输入/输出子程序库的使用说明。 本书特点 本书自2000年出版以来获得广大师生读者好评,第3版(书名为《新版汇编语言程序设计》)被评为普通高等教育“十一五”国家级规划教材。主编以此书为教材主持的“汇编语言程序设计”课程为教育部-微软精品课程和河南省精品课程(网址:http://jpkc.zzu.edu.cn/hbyycai/)。总结教学经验和改革思路,结合师生反馈,我们在前3版基础上,编写了本书,并保持了原来的诸多特点。 1. 知识全面 本书的编写参照国内高校和自学考试“汇编语言程序设计”课程的本、专科教学大纲,兼顾相关专业教学要求,既满足当前教学需求,又面向今后改革方向。 本书全面讲解80x86指令系统及编程,除完整的8086指令外,还包括32位指令、浮点指令、多媒体指令。本书不仅介绍基本的汇编语言程序设计知识,还介绍高级汇编语言程序设计技术,如开发大型程序需要的模块化方法、实际应用当中的混合编程实用技术、32位Windows应用程序编写等。 本书采用微软的MASM 6.15汇编程序,以简化段定义源程序格式为主,兼顾完整段定义源程序格式,涉及DOS和Windows操作系统平台的汇编语言程序设计。 2. 教材实用 本书示例中的指令、程序段和完整的源程序都经过验证,能够运行通过。本书经过3个版本、11年的使用时间,已经发现并纠正了绝大多数错误。 本书采用浅显、明晰、循序渐进的描述方法,具有前后对照、贯穿始终的风格,加上清晰的结构、丰富的示例,使得本书既适合课堂教学,又适合读者自学。 配合本书,作者制作有精美的多媒体电子教案(PowerPoint演示文档),为教师利用现代化教学手段提供方便。同时,作者还维护“大学微机技术系列课程教学辅助网站”(钱晓捷之微辅网http://www2.zzu.edu.cn/qwfw)。网站主要就“汇编语言程序设计”和“微机原理及接口技术”课程提供有关教学课件、教材勘误、疑难解答、补充资料等辅助资源,是本书的动态延伸。微辅网还设置有教学论坛,让学生在课外学习中获得帮助。 3. 突出实践 本书特别强调上机实践,不仅在正文中引导读者通过调试程序或者带输出结果的源程序理解指令、程序功能,各章还配有丰富的习题和上机练习题;附录介绍调试程序的使用方法、调试指令和程序的步骤。 本书的结构安排适合尽早上机实践,并将实践过程贯穿始终。第1章引出MASM开发软件包,可用于熟悉命令行MSDOS基本操作(基于Windows),第2章充分利用调试程序学习指令功能和调试程序段,第3章引出完整的源程序格式,并给出程序开发方法。后续章节通过大量程序强化编程开发,还介绍了开发Windows应用程序的MASM32环境、利用Visual C++开发调试汇编语言程序的方法。 写给教师 “汇编语言程序设计”的教学内容在高校相关学科的教学中有两种处理方式。一种作为独立的课程,这主要是用在计算机专业的本科、专科教学中;而在电子、通信、自动控制等专业则将汇编语言作为主体融入微机原理课程。本书内容自成一个相对完整的知识体系,适合作为独立课程的教材,也可以作为微机原理课程的参考书和补充教材。 传统上,“汇编语言程序设计”课程在MSDOS操作系统平台上,采用微软的MASM汇编程序,介绍16位8086微处理器指令系统的程序设计。当前,有些院校已将汇编语言的教学重点转向32位IA32微处理器指令系统,操作系统平台也过渡为Windows。同时,也出现在Linux环境下的汇编语言课程。针对不同层次、不同专业的学习,“汇编语言程序设计”课程教学进行了多方面的改革,形成了多元化的教学方案。 本书从简单的16位汇编语言入手,使其满足当前教学要求(包括与“微型机原理”或“微机接口技术”等课程的配合);在32位汇编语言展开许多深入的内容,使其面向以后的应用需求。本书在组织教学内容上,体现了许多新的理念。例如,没有从纯软件角度介绍汇编语言,教学的重点是硬指令而不是伪指令,强调程序设计不是程序格式,引出实用技术但淡化具体应用,通过程序实例和上机实践掌握程序设计方法,而不是通过大量细节的描述讲解程序设计。 汇编语言的基本语句是处理器指令。对于Intel 80x86系列微处理器,由于其属于复杂指令集计算机CISC,再加上几十年发展的历史沉淀,因此它的指令系统非常庞大和复杂。虽然作为本书的一个特色,介绍了Pentium 4及之前处理器的所有指令,但教材的重点教学内容却是常用的简单指令,全书的实例程序也主要采用各种处理器指令系统所共有的基本指令编写。作为教师,尤其应该注意这个问题,否则许多学生会面对繁杂的指令望而却步、失去进一步学习的兴趣。 各种高级语言程序设计的教学中,调试程序及程序的调试方法往往被忽略或回避,但作为低级程序语言的汇编语言不应避而不谈。在汇编语言的教学过程中,可以利用调试程序的单步执行和断点执行能力,直观地理解指令和程序的功能,进而掌握程序的动态调试和排错。对于专科层次或程度较低的学生,掌握调试程序本身就是一个似乎不可逾越的难关。一方面,教师可以通过多媒体教学手段,演示调试程序的使用;本书也配套制作了相关演示动画、记录了指令调试和程序开发过程(可以通过本书的教学网站下载);学生通过上机实践学习调试程序。另一方面,本书自编了一个显示输出和键盘输入的I/O子程序库,教师和学生可以直接使用其中的子程序来编写具有显示结果的源程序,同时还可以配合列表文件,暂时避开调试程序这个难点。这个I/O子程序库还可以作为一个教学案例,用于组织学习中有余力的学生围绕输入输出子程序库进行项目开发。 对于使用过本书前续版本的教师,新版教材在主体教学内容上保持了兼容,仍然遵循由浅入深、循序渐进的原则:先16位8086指令系统、基本汇编语言编程技术,然后介绍32位指令编程,并将汇编语言知识加深,从混合编程、浮点编程、多媒体编程各个角度展开。 主要的修编内容如下: (1) 基于教学实际,调整了部分内容的位置,并进行了修编(第1章标志的详解调整到第2章加减运算指令前,第1章MASM编程环境使用合并到第3章汇编语言程序的开发过程中,第2章输入/输出指令调整到第5章输入/输出程序设计前,第2章DOS功能调用调整到第3章汇编语言程序的开发过程后,第2章串操作类指令调整到第4章循环程序设计后)。 (2) 基于教学需要,扩充了部分内容(第3章汇编语言程序的开发过程,附录A调试程序DEBUG,附录B调试程序CodeView的调试示例,附录E常见汇编错误信息)。 (3) 基于技术发展,改写了部分内容(第1章Intel 80x86系列微处理器,第7章使用Visual C++开发汇编语言程序)。 (4) 基于内容修编,调整了部分习题。另外,还对部分知识增加图表、文字等进行更详细的讲解,改正前版中的个别错误等。 有鉴于此,教师在教学过程中,应该选择基本的、常用的指令,减少16位汇编语言部分的教学内容和教学时间。这样,就有时间展开对32位汇编语言的深入内容和实用技术的学习。 写给学生 学习汇编语言到底有什么用途?这是许多学生首先要提问的。 在计算机科学与技术的知识体系当中,“汇编语言程序设计”课程的教学内容属于计算机系统结构的一个方面。汇编语言配合“计算机组成原理”和“微机原理及接口技术”等相关课程,帮助学生从软件角度理解计算机工作原理;同时,为“操作系统”、“编译原理”等课程提供必须的基础知识,也是自动控制等与硬件相关应用领域的程序设计基础。“汇编语言程序设计”课程是继“高级语言程序设计”之后的又一门计算机语言程序设计课程,但它是一种低级语言程序设计。通过汇编语言的学习,学生能够比较全面地了解程序设计语言,利于更深入地学习和应用高级语言。 随着高级语言的发展、可视化开发工具的应用,汇编语言往往被应用程序开发人员所忽略,其应用领域也逐渐萎缩。但是,作为一个面向机器的程序设计语言,汇编语言具有直接有效控制硬件的能力,能够编写出运行速度快、代码量小的高效程序,在许多场合具有不可替代的作用,例如,操作系统的核心程序段、实时控制系统的软件、智能仪器仪表的控制程序、频繁调用的子程序或动态连接库、加密解密软件、分析和防治计算机病毒,等等。 学习什么样的汇编语言呢?这是许多学生感到困惑的。 汇编语言与处理器指令系统相关,不同的处理器指令系统具有不同的汇编语言。但是,作为一个底层开发语言,它还是有许多共性的。从指令系统的典型性、实用性、编程环境以及教学内容连续性等多方面考虑,Intel 80x86指令系统作为“汇编语言程序设计”课程的主要教学内容具有显而易见的优势,理所当然地成为计算机及相关学科的首选。 日常工作和学习中广泛使用的个人微机(PC)采用Intel 80x86或与之兼容的微处理器。个人微机过去使用DOS操作系统,现在主要使用Windows或Linux操作系统,但后者具有DOS模拟环境。由于DOS操作系统平台比较简单,对程序员限制少,是一个相对理想的教学环境,所以本书也就利用这个平台展开汇编语言,选用DOS和Windows平台下最常用的微软MASM汇编程序。 许多学生总感觉16位指令、8086微处理器、DOS操作系统都是很“古老”和“陈旧”的内容,但它们实际上却是32位指令、Pentium 4微处理器、Windows或Linux操作系统的基础,都是最基本的知识。它们已经足够复杂、完全能够满足教学要求。当然,本书在提高部分也对使用32位指令编写Windows应用程序进行了详细讲解。因为有了16位汇编语言基础,这部分提高内容也就比较容易掌握了。如果直接从32位指令和Windows平台入门,往往需要大家学习很多其他内容才能够真正进入汇编语言的教学。国内外以所谓32位保护方式展开Windows汇编语言教学的教材,实际上是利用了Windows控制台环境。而Windows控制台环境的操作和外观与DOS操作系统一样,其基本教学内容几乎相同,所不同的仅仅是调用操作系统功能的方法。介绍用汇编语言编写Windows窗口应用程序的教材,都要求读者初步掌握汇编语言程序设计,并具有调用Windows应用程序接口API的编程经验(往往需要学习Visual C++之后才能够达到这个要求)。本书从基础知识入手,囊括上述所有教学内容。相信读者阅读本书后,会对此有深刻的体会。 怎样才能学好汇编语言呢?这又是许多学生深感无助的。 其实,学习汇编语言程序设计对先修知识要求不高。学生如果具备微机软件的操作能力,尤其是DOS环境和常用命令的使用,可以更好地完成上机实践(本书补充有这方面的知识,并构造一个MASM开发环境)。学生的高级语言(如C/C++或Visual Basic)程序设计知识或经验,将有助于更好地理解程序结构和混合编程。程序设计属于软件方面的内容,但由于汇编语言与硬件相关的特点,学生在计算机或微型机原理方面的知识对于深刻体会指令功能大有益处。“汇编语言程序设计”课程的相关课程是“微机原理与接口技术”,后者是微机的硬件知识,进一步加强了汇编语言在输入/输出和中断等方面的应用。两者共同为学生建立微型计算机的完整知识体系。 循序渐进的学习是对任何课程都有效的。不以循序渐进方式进行学习,往往会浪费宝贵的时间去盲目探索,最终学习到的内容可能是相对零散的知识,不能建立完整的、系统的知识结构。所以,建议学生遵循循序渐进的方法进行学习。首先,学生应理解每条常用指令的功能,能够正确书写每条指令;其次,学生通过阅读示例程序,掌握常见功能程序段的编写;再次,学生利用伪指令将程序段扩展成完整的源程序文件;随后,学生就各种程序结构编写常见问题的程序;最后,学生才编写较大型程序和有一定难度的程序。 对程序设计类课程,没有上机编程的实践是无法真正掌握的。所以,希望学生加强实践环节。学生应完成基本的上机指导编程要求,同时争取多进行编程实践,因为只有通过实际编程才能发现程序设计中的许多问题。不要轻视调试程序的作用,它是深入理解指令功能和程序执行过程的关键。请不要直接拷贝源程序代码,在一条一条语句的录入编辑过程中,就是书写正确语句、加深语句理解的绝好机会。 本书由钱晓捷主编,昝红英、穆玲玲、邱保志参与了前两版的编写和修订,关国利、张青、张行进也给予了帮助。作者对十多年来合作的同事深表谢意,大家共同的努力成就了本书、创建了精品课程。作者还要特别感谢使用本书的教师、学生和读者,是你们宝贵的意见建议和一贯支持催生了本版教材。作者非常欢迎大家通过本书的教学辅助网站(http://www2.zzu.edu.cn/qwfw)、华信教育资源网(http://www.hxedu.com.cn)或主编的电子邮件(qianxiaojie@zzu.edu.cn)进行教学交流,共同提高“汇编语言程序设计”课程的教学质量。 作者
第1章 汇编语言基础知识(1) 1.1 计算机系统概述(1) 1.1.1 计算机的硬件(1) 1.1.2 计算机的软件(3) 1.1.3 计算机的程序设计语言(3) 1.2 数据表示(5) 1.2.1 数制(5) 1.2.2 编码(6) 1.2.3 有符号数的表示法(8) 1.2.4 二进制数运算(9) 1.3 Intel80x86系列微处理器(10) 1.3.1 16位80x86微处理器(10) 1.3.2 IA32微处理器(10) 1.3.3 Intel64处理器(12) 1.4 微型计算机(PC)系统(12) 1.5 8086微处理器(15) 1.5.1 8086的功能结构(15) 1.5.2 8086的寄存器(16) 1.5.3 8086的存储器组织(18) 1.6 8086的寻址方式(20) 1.6.1 8086的机器代码格式(21) 1.6.2 立即数寻址方式(22) 1.6.3 寄存器寻址方式(23) 1.6.4 存储器寻址方式(23) 习题1 (25) 第2章 8086的指令系统(27) 2.1 数据传送类指令(27) 2.1.1 通用数据传送指令(28) 2.1.2 堆栈操作指令(30) 2.1.3 标志传送指令(31) 2.1.4 地址传送指令(32) 2.2 算术运算类指令(32) 2.2.1 状态标志(32) 2.2.2 加法指令(34) 2.2.3 减法指令(35) 2.2.4 乘法指令(36) 2.2.5 除法指令(37) 2.2.6 符号扩展指令(38) 2.2.7 十进制调整指令(38) 2.3 位操作类指令(41) 2.3.1 逻辑运算指令(41) 2.3.2 移位指令(42) 2.3.3 循环移位指令(43) 2.4 控制转移类指令(44) 2.4.1 无条件转移指令(45) 2.4.2 条件转移指令(46) 2.4.3 循环指令(48) 2.4.4 子程序指令(49) 2.4.5 中断指令(50) 2.5 处理机控制类指令(52) 习题2 (53) 第3章 汇编语言程序格式(58) 3.1 汇编语言程序的开发(58) 3.1.1 汇编语言程序的语句格式(58) 3.1.2 汇编语言的程序格式(59) 3.1.3 汇编语言程序的开发过程(61) 3.1.4 DOS系统功能调用(67) 3.2 参数、变量和标号(69) 3.2.1 数值型参数(69) 3.2.2 变量定义伪指令(71) 3.2.3 变量和标号的属性(75) 3.3 程序段的定义和属性(77) 3.3.1 DOS的程序结构(77) 3.3.2 简化段定义的格式(78) 3.3.3 完整段定义的格式(81) 3.4 复杂数据结构(85) 3.4.1 结构(85) 3.4.2 记录(86) 习题3 (87) 第4章 基本汇编语言程序设计(90) 4.1 顺序程序设计(90) 4.2 分支程序设计(91) 4.2.1 单分支结构(91) 4.2.2 双分支结构(92) 4.2.3 多分支结构(93) 4.3 循环程序设计(95) 4.3.1 计数控制循环(96) 4.3.2 条件控制循环(97) 4.3.3 多重循环(98) 4.3.4 串操作类指令(99) 4.4 子程序设计(104) 4.4.1 过程定义伪指令(104) 4.4.2 子程序的参数传递(106) 4.4.3 子程序的嵌套、递归与重入(109) 4.4.4 子程序的应用(111) 习题4 (115) 第5章 高级汇编语言程序设计(118) 5.1 高级语言特性(118) 5.1.1 条件控制伪指令(118) 5.1.2 循环控制伪指令(120) 5.1.3 过程声明和过程调用伪指令(121) 5.2 宏结构程序设计(124) 5.2.1 宏汇编(124) 5.2.2 重复汇编(129) 5.2.3 条件汇编(130) 5.3 模块化程序设计(132) 5.3.1 源程序文件的包含(132) 5.3.2 目标代码文件的连接(137) 5.3.3 子程序库的调入(139) 5.4 输入/输出程序设计(140) 5.4.1 输入/输出指令(141) 5.4.2 程序直接控制输入/输出(142) 5.4.3 程序查询输入/输出(143) 5.4.4 中断服务程序(144) 习题5 (149) 第6章 32位指令及其编程(153) 6.1 32位指令运行环境(153) 6.1.1 寄存器(154) 6.1.2 寻址方式(156) 6.1.3 机器代码格式(157) 6.2 32位扩展指令(158) 6.2.1 数据传送类指令(158) 6.2.2 算术运算类指令(160) 6.2.3 位操作类指令(161) 6.2.4 串操作类指令(161) 6.2.5 控制转移类指令(162) 6.3 DOS下的32位程序设计(165) 6.4 32位新增指令(168) 6.4.1 80386新增指令(168) 6.4.2 80486新增指令(171) 6.4.3 Pentium新增指令(172) 6.4.4 PentiumPro新增指令(176) 6.5 用汇编语言编写32位Windows 应用程序(177) 6.5.1 32位Windows应用程序的 特点(177) 6.5.2 32位Windows控制台程序(178) 6.5.3 Windows应用程序的开发(182) 6.5.4 创建消息窗口(183) 6.5.5 创建窗口应用程序(184) 习题6 (190) 第7章 汇编语言与C/C++的混合 编程(193) 7.1 TurboC嵌入汇编方式(193) 7.1.1 嵌入汇编语句的格式(194) 7.1.2 汇编语句访问C语言的 数据(194) 7.1.3 嵌入汇编的编译过程(195) 7.2 TurboC模块连接方式(196) 7.2.1 混合编程的约定规则(197) 7.2.2 汇编模块的编译和连接(198) 7.2.3 混合编程的参数传递(199) 7.2.4 汇编语言程序对C语言程序的 调用(206) 7.3 汇编语言在VisualC++中的 应用(208) 7.3.1 嵌入汇编语言指令(209) 7.3.2 调用汇编语言过程(212) 7.3.3 使用汇编语言优化C++代码(215) 7.3.4 使用VisualC++开发汇编语言 程序(218) 习题7 (220) 第8章 80x87浮点指令及其编程(223) 8.1 浮点数据格式(223) 8.1.1 实数和浮点格式(223) 8.1.2 80x87的数据格式(225) 8.2 浮点寄存器(227) 8.3 浮点指令的程序设计(229) ·Ⅷ· 8.3.1 浮点传送类指令(230) 8.3.2 算术运算类指令(232) 8.3.3 超越函数类指令(235) 8.3.4 浮点比较类指令(236) 8.3.5 FPU控制类指令(240) 习题8 (244) 第9章 多媒体指令及其编程(246) 9.1 MMX指令系统(246) 9.1.1 MMX的数据结构(246) 9.1.2 MMX指令(248) 9.1.3 MMX指令的程序设计(255) 9.2 SSE指令系统(257) 9.2.1 SIMD浮点指令(257) 9.2.2 SIMD整数指令(266) 9.2.3 高速缓存优化处理指令(267) 9.2.4 SSE指令的程序设计(268) 9.3 SSE2指令系统(272) 9.3.1 SSE2的数据类型(272) 9.3.2 SSE2浮点指令(273) 9.3.3 SSE2扩展指令(278) 9.3.4 SSE2指令的程序设计(281) 9.4 SSE3指令系统(282) 9.4.1 SSE3指令(282) 9.4.2 SSE3指令的程序设计(284) 习题9 (285) 第10章 64位指令简介(287) 10.1 64位方式的运行环境(287) 10.2 64位方式的指令(289) 附录A 调试程序DEBUG (292) 附录B 调试程序CodeView (301) 附录C 汇编程序MASM的伪指令和 操作符(309) 附录D 80x86整数指令系统(310) 附录E 常见汇编错误信息(316) 附录F 输入/输出子程序库(319) 参考文献(321)
钱晓捷,男,副教授,1963年生,北京航空航天大学电子工程学院学士学位,郑州大学计算机软件与理论专业硕士学位,硕士生导师。中国计算机学会会员,现任河南省计算机学会教育专委副主任,主要从事计算机系统结构、嵌入式系统、计算机辅助教学等方面的研究。主持教育部-微软、河南省精品课程“汇编语言程序设计”、校级远程教育精品课程“微机原理及接口技术”建设。主持完成“网络CAI课件研究与开发”、“河南省新世纪网络课程建设工程项目”等科研项目。主编10余部高校教材,其中2部属于普通高等教育“十一五”国家级规划教材。具有丰富的教学经历和教研体会,主讲计算机硬件系列课程20余年,主要包括“微机原理及接口技术”、“汇编语言程序设计”、“计算机组织与结构”、“高级计算机系统结构”等。
http://www.hxedu.com.cn/hxedu/fg/book/bookinfo.html?code=G0170130