汇编语言:基于x86处理器(原书第8版)
作者 : [美]基普·R. 欧文(Kip R. Irvine) 著
译者 : 吴为民 译
丛书名 : 计算机科学丛书
出版日期 : 2022-05-19
ISBN : 978-7-111-69043-6
适用人群 : 读者对象:1. 高校电子和计算机工程专业的教师和学生。
2. 嵌入式、物联网等领域的研发人员。
3. 工业实时控制领域的工程师。
定价 : 149.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 589
开本 : 16
原书名 : Assembly Language for x86 Processors, Eighth Edition
原出版社: Pearson Education Asia
属性分类: 教材
包含CD : 无CD
绝版 :
图书简介

本书专门为Intel/Windows/DOS平台编写,对汇编语言进行了完整且详细的研究和讲解,教授读者在机器级编写和调试程序。第1~9章包含汇编语言的基本概念、x86处理器架构、汇编语言基础、过程等核心概念,后续章节讲解了结构和宏、MS-Windows编程、浮点数处理和指令编码等内容。本书不仅可作为汇编语言课程的教材,还可以作为计算机系统基础和体系结构基础方面的教材,符合国内所提倡的系统观教学理念。书中不仅讲授具体问题的解决方案,而且注重帮助学生举一反三,综合应用,学到的编程理念能顺利应用于其他编程的课程中。

图书特色

揭示处理器系统内部的奥秘,学会以机器级思维方式处理编程问题

图书前言

本书介绍x86和Intel64处理器的汇编语言编程与架构,适合作为下述几类大学课程的教材:
汇编语言编程
计算机系统基础
计算机体系结构基础
学生使用Intel或AMD处理器,用Microsoft宏汇编器(Microsoft Macro Assembler,MASM)编程,并运行在Microsoft Windows的最新版本上。尽管本书的初衷是作为大学生的编程教材,但它也是计算机体系结构课程的有效补充。本书广受欢迎,前几个版本已被翻译成多种语言。
重点主题。本书所包含的下列主题可以自然过渡到计算机体系结构、操作系统及编写编译器的后续课程:
虚拟机概念
指令集架构
基本布尔运算
指令执行周期
内存访问和握手
中断和轮询
基于硬件的I/O
浮点数二进制表示
下列主题则专门针对x86和Intel64架构:
受保护的内存和分页
实地址模式下的内存分段
16位中断处理
MS-DOS和BIOS系统调用(中断)
浮点单元架构和编程
指令编码
本书中的某些例子还适合用于计算机科学课程体系中的后续课程:
查找与排序算法
高级语言结构
有限状态机
代码优化示例
第8版的新内容
这个版本代表了本书向交互式电子教科书的过渡。我们对此非常兴奋,因为读者第一次能够针对复习题、代码动画、教程视频以及多输入习题进行实验和互动。
各章中的“本节回顾”都已改写成交互式问题,可对读者的答案给出即时反馈。同时,新增和删除了一些问题,并修改了很多问题。
代码动画使得读者能单步执行程序代码,并查看变量值和代码注释。读者再也不必在程序代码与下一页的文本解释之间来回翻看。
插入了适时的教程视频的链接,这样读者就能得到关于教材中相关主题的辅导。以前,对于这些呈现为清单的整套视频,读者需要单独购买订阅权才能访问。在这一版中,视频是免费的。
多输入习题允许用户浏览程序清单,并在代码旁边的方框内插入变量值。读者可接收到即时、彩色的反馈,并有机会进行尝试,直至所有输入值都正确。
关键术语的超文本定义贯穿全书,这些定义汇总于一个在线的词汇表。
简而言之,我们提取了本书的精华内容(经过很多版的精雕细琢),并将其置入交互式电子教科书中。
本书关注的首要目标仍然是教授学生编写并调试机器级程序。它不能代替计算机体系结构的完整教材,但它确实能在一个讲授计算机如何工作的环境中给予学生编写软件的第一手经验。我们认为,理论联系实际能让学生更好地掌握知识。在工程课程中,学生构建原型;而在计算机体系结构课程中,学生应编写机器级程序。在这两种情况下,学生都能获得难忘的经验,从而有信心在任何OS/面向机器的环境中工作。
保护模式编程是从第1章到第13章的重中之重。由此,学生就能创建32位和64位程序,并运行于最新版本的Microsoft Windows下。其余三章是传统的章节,讨论16位编程,包含BIOS编程、MS-DOS服务、键盘和鼠标输入、磁盘存储基础、视频编程以及图形处理。
子例程库。本书为学生提供了三个版本的子例程库,用于基本输入/输出、模拟、定时以及其他有用的任务。Irvine32和Irvine64库运行于保护模式。16位版本的库(Irvine16.lib)运行于实地址模式,且只用于第14~16章。这些库的完整源代码见配套网站。链接库是为了使用方便,而不是阻止学生自行对输入/输出编程。我们鼓励学生创建自己的库。
所含软件和示例。所有示例程序均采用运行于写作本书时最新的Microsoft Visual Studio中的Microsoft Macro Assembler进行了测试。此外,我们还提供了批处理文件,使得学生可在Windows命令提示符下汇编和运行应用程序。本书的信息更新与勘误可参见配套网站,其中包括一些额外的编程项目,教师可以在各章结束时布置给学生。
总体目标
本书的以下内容旨在拓展学生对汇编语言相关主题的兴趣和知识:
Intel和AMD处理器的架构和编程。
实地址模式和保护模式编程。
汇编语言伪指令、宏、操作符以及程序结构。
编程方法,展示如何使用汇编语言来创建系统级软件工具和应用程序。
计算机硬件操作。
汇编语言程序、操作系统以及其他应用程序之间的交互作用。
我们的目标之一是帮助学生以机器级的思维方式来处理编程问题。将CPU视为交互工具,学习尽可能直接地监控其操作是重要的。调试器是程序员最好的朋友,它不仅可以捕捉错误,还可以用作讲授CPU和操作系统的教学工具。我们鼓励学生探究高级语言表面之下的内部机制,帮助他们意识到大多数编程语言都被设计为可移植的,因而也独立于其宿主机。除了简短的示例外,本书还包含几百个可运行的程序,用来演示书中讲述的指令和思想。本书末尾有一些参考资料,比如MS-DOS中断和指令助记符指南。
背景知识要求。读者应能自如地使用至少一种高级语言进行编程,比如Python、Java、C或C++。本书有一章涉及C++接口,因此,如果手边有编译器就会非常有帮助。本书不仅已经用于计算机科学和管理信息系统专业的课程,而且还已用于其他工程课程。
特色
完整的程序清单。作者的网站包含补充的学习资料、学习指南以及本书示例的全部源代码。随本书还提供两个链接库(32位和64位),其中包含40多个过程,用以简化用户输
入/输出、数值处理、磁盘和文件处理以及字符串处理。在课程开始阶段,学生可以使用这个库来改进自己编写的程序。之后,学生就可以创建自己的过程并将它们添加到库中。
编程逻辑。本书用两章重点介绍了布尔逻辑和位级运算,并有意识地尝试将高级编程逻辑与低层机器细节相关联。这种方式有助于学生创建更有效的编程实现,并且更好地理解编译器是如何生成目标代码的。
硬件和操作系统概念。本书前两章介绍了基础硬件和数据表示概念,包括二进制数、CPU架构、状态标志以及内存映射。通过对计算机硬件的综述和对Intel处理器系列的历史回顾,帮助学生更好地理解其目标计算机系统。
结构化编程方法。从第5章开始,重点关注对过程和功能的分解。为学生提供更复杂的编程练习,要求学生在编写代码之前关注设计。
Java字节码和Java虚拟机。第8章和第9章用一个简短的演示示例解释了Java字节码的基本操作。还以反汇编字节码格式展示了很多简短示例,后跟详细的逐步解释。
创建链接库。学生可以自由地将自己编写的过程添加到本书链接库,还可以创建新的库。要学会使用工具箱方法进行编程,并编写多个程序都可以使用的代码。
宏和结构。用一章专门讲述结构、联合以及宏的创建,这些知识对于汇编语言和系统编程极为重要。带有高级操作符的条件宏使得宏更为专业。
高级语言接口。用一章专门讲述汇编语言到C和C++的接口。对于可能要从事高级语言编程工作的学生而言,这是一项重要的工作技能。他们可以学习代码优化,并通过示例了解C++编译器是如何优化代码的。
教学辅助。所有的程序清单都可在网上得到。同时,我们还向教师提供测试库、复习题答案、编程练习的解答以及每章的PPT。
VideoNotes。VideoNotes是Pearson的可视化工具,用来向学生教授关键的编程概念和技术。这些简短的、循序渐进的视频演示了汇编语言的基本概念。VideoNotes可用于自定进度的学习,其易于导航,每个视频练习都具有选择、播放、倒回、快进及停止功能。
各章内容简介
第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章 浮点数处理和指令编码:浮点数的二进制表示和浮点算术运算、32位浮点单元编程,以及32位机器指令编码。
第13章 高级语言接口:参数传递规约、内联汇编代码,以及将汇编语言模块链接到C和C++程序。
第14章 16位MS-DOS编程:内存组织、中断、功能调用,以及标准的MS-DOS文件I/O服务。
第15章 磁盘基础知识:磁盘存储系统、扇区、簇、目录、文件分配表、MS-DOS错误码的处理,以及驱动器和目录操作。
第16章 BIOS级编程:键盘输入、视频文本、图形以及鼠标编程。
附录A:MASM参考知识。
附录B:x86指令集。
附录C:BIOS和MS-DOS中断。
附录D:“本节回顾”的问题答案(第14~16章)。
教师和学生资源
教师资源
下面受保护的教师资料可在pearson.com上得到。要想获得用户名和密码信息,请联系Pearson的代表。
PPT讲义。
教师解题手册。
学生资源
下述有用的资料位于www.asmirvine.com:
Getting Started(入门)是帮助学生设置Visual Studio以进行汇编语言编程的循序渐进的完整教程。
勘误。
与汇编语言编程主题相关的补充读物。
汇编和链接程序所需要的支持文件、本书全部示例程序的完整源代码,以及作者的补充链接库的完整源代码。
Assembly Language Workbook(汇编语言工作手册)是一个交互式的工作手册,其中涵盖数值转换、寻址模式、寄存器使用、调试编程,以及浮点二进制数。
调试工具:Microsoft Visual Studio调试器用法教程。
致谢
非常感谢培生教育(Pearson Education)的计算机科学投资组合经理Tracy Johnson多年来提供的友好且有益的指导。感谢施博(SPi Global)公司的Vanitha Puela与培生的内容编辑Amanda Brands一起为本书的制作和出版所做的出色工作。
以前版本
特别感谢以下诸位,他们在本书早期版本的制作中提供了极大的帮助:
William Barrett,圣何塞州立大学
Scott Blackledge
James Brink,太平洋路德大学
Gerald Cahill,羚羊谷学院
John Taylor

封底文字

本书全面细致地讲解汇编语言程序设计的各个方面,不仅是汇编语言本科课程的经典教材,还可作为计算机系统和体系结构的入门教材。本书专门为32位和64位Intel/Windows平台编写,用通俗易懂的语言描述学生需要掌握的核心概念,首要目标是教授学生编写并调试机器级程序,并帮助他们自然过渡到后续关于计算机体系结构和操作系统的高级课程。
本书特色
教授有效的设计技巧:自上而下的程序设计演示和讲解,帮助学生将技术应用于多门编程课程。
理论联系实践:教授学生编写并调试机器级程序,为以后在任何操作系统及面向机器的环境中工作做好准备。
灵活的课程安排:教师可结合具体情况以不同的顺序和深度讲授可选章节。

作者简介
基普·R. 欧文(Kip R. Irvine) 拥有迈阿密大学计算机科学硕士、音乐艺术博士学位,现为佛罗里达国际大学高级讲师,教授计算机相关的课程。他著有多本编程教材,这些书被翻译成多国语言,涵盖的主题包括汇编语言、C++、Visual Basic和COBOL。

译者简介
吴为民 北京交通大学计算机学院副研究员,曾承担国家自然科学基金和国家863等项目,主要从事集成电路设计自动化中的物理设计和形式化验证等方面的研究工作,并讲授“汇编与接口技术”和“计算机体系结构”等相关课程。

作者简介

[美]基普·R. 欧文(Kip R. Irvine) 著:基普·R. 欧文(Kip R. Irvine)拥有迈阿密大学计算机科学硕士、音乐艺术博士学位,现为佛罗里达国际大学高级讲师,教授计算机相关的课程。他著有多本编程教材,这些书被翻译成多国语言,涵盖的主题包括汇编语言、C++、Visual Basic和COBOL。

译者序

本书是迄今少见的对汇编语言及其相关知识描述得极为详尽的书籍。它的内容远不止x86汇编语言本身,还包括很多与之相关的基础知识、背景知识以及高级知识。因此,读者几乎不需要先修任何课程就能阅读和理解本书的绝大部分内容。不仅如此,本书对涉及的一些会在其他书籍或课程中出现的较高层次的概念,如虚拟机、有限状态机、Java字节码、动态内存分配以及存储管理等,都给予了适时的解释。总之,本书的内容更像是以x86汇编语言为中心的各种相关知识的大融合。
对于系统软件(如编译系统和操作系统)的开发者来说,理解计算机硬件的工作原理是最根本的要求。即便是高级语言的编程者,如果对计算机体系结构的知识了解较少,也难以有意识地编写出性能高、功耗少的程序。而在当前,单纯依赖操作系统和编译器是不能彻底解决这些问题的,汇编语言正是探究处理器系统内部奥秘的一把钥匙。为了便于读者学习,本书不仅内附丰富的示例,而且在配套的网站上提供了16位、32位及64位的链接库,供读者学习、使用、修改,甚至自创。此外,每章后还配备形式和难度不同的习题,使读者能即时巩固所学知识。
本书译自原书第8版。与第7版相比,前13章有局部的修改,而第14、15和16章是新加进来的。在翻译过程中,译者力图在尊重原意的基础上,以更便于读者理解为首要目标。由于本书篇幅较大,加之译者能力和精力所限,难免出现各种错误,欢迎广大读者批评指正。
感谢机械工业出版社的何方编辑向我推荐本书,并在我由于工作繁忙而拖延进度时给予充分的理解。感谢本书第7版的译者,使我在翻译本版时有很好的参照。真诚希望本书能为你的学习带来便利。

吴为民  
2021年1月于寓所

图书目录

译者序
前言
关于作者
相关码表
第1章 基本概念 1
1.1 欢迎来到汇编语言的世界 1
1.1.1 读者可能会问的问题 2
1.1.2 汇编语言的应用 4
1.1.3 本节回顾 5
1.2 虚拟机概念 5
1.2.1 本节回顾 6
1.3 数据表示 7
1.3.1 二进制整数 7
1.3.2 二进制加法 9
1.3.3 整数存储大小 9
1.3.4 十六进制整数 10
1.3.5 十六进制加法 11
1.3.6 有符号二进制整数 12
1.3.7 二进制减法 14
1.3.8 字符存储 14
1.3.9 二进制编码的十进制数 16
1.3.10 本节回顾 16
1.4 布尔表达式 17
1.4.1 布尔函数的真值表 18
1.4.2 本节回顾 19
1.5 本章小结 20
1.6 关键术语 20
1.7 复习题和练习 21
1.7.1 简答题 21
1.7.2 算法题 22
第2章 x86处理器架构 23
2.1 一般概念 23
2.1.1 基本微机设计 23
2.1.2 指令执行周期 24
2.1.3 读取内存 25
2.1.4 加载并执行程序 26
2.1.5 本节回顾 27
2.2 32位x86处理器 27
2.2.1 操作模式 27
2.2.2 基本执行环境 28
2.2.3 x86内存管理 30
2.2.4 本节回顾 31
2.3 64位x86-64处理器 31
2.3.1 64位操作模式 32
2.3.2 基本的64位执行环境 32
2.3.3 本节回顾 33
2.4 典型x86计算机的组件 33
2.4.1 母板 33
2.4.2 内存 35
2.4.3 本节回顾 35
2.5 输入/输出系统 36
2.5.1 I/O访问层次 36
2.5.2 本节回顾 38
2.6 本章小结 38
2.7 关键术语 39
2.8 复习题 40
第3章 汇编语言基础 41
3.1 基本语言元素 41
3.1.1 第一个汇编语言程序 41
3.1.2 整数字面量 42
3.1.3 常整数表达式 43
3.1.4 实数字面量 43
3.1.5 字符字面量 44
3.1.6 字符串字面量 44
3.1.7 保留字 44
3.1.8 标识符 45
3.1.9 伪指令 45
3.1.10 指令 46
3.1.11 本节回顾 48
3.2 示例:整数加减法 48
3.2.1 AddTwo程序 48
3.2.2 运行和调试AddTwo程序 50
3.2.3 程序模板 54
3.2.4 本节回顾 54
3.3 汇编、链接和运行程序 55
3.3.1 汇编–链接–执行周期 55
3.3.2 列表文件 55
3.3.3 本节回顾 57
3.4 定义数据 57
3.4.1 内部数据类型 57
3.4.2 数据定义语句 58
3.4.3 向AddTwo程序添加一个变量 58
3.4.4 定义BYTE和SBYTE数据 59
3.4.5 定义WORD和SWORD数据 61
3.4.6 定义DWORD和SDWORD数据 61
3.4.7 定义QWORD数据 62
3.4.8 定义压缩的BCD(TBYTE)数据 62
3.4.9 定义浮点类型 62
3.4.10 变量相加程序 63
3.4.11 小端序 64
3.4.12 声明未初始化数据 64
3.4.13 本节回顾 65
3.5 符号常量 65
3.5.1 等号伪指令 66
3.5.2 计算数组和字符串的大小 67
3.5.3 EQU伪指令 68
3.5.4 TEXTEQU伪指令 68
3.5.5 本节回顾 69
3.6 64位编程介绍 70
3.7 本章小结 71
3.8 关键术语 72
3.8.1 术语 72
3.8.2 指令、操作符及伪指令 72
3.9 复习题和练习 73
3.9.1 简答题 73
3.9.2 算法题 73
3.10 编程练习 74
第4章 数据传送、寻址及算术运算 75
4.1 数据传送指令 75
4.1.1 引言 75
4.1.2 操作数类型 75
4.1.3 直接内存操作数 76
4.1.4 MOV指令 77
4.1.5 整数的零/符号扩展 78
4.1.6 LAHF和SAHF指令 79
4.1.7 XCHG指令 80
4.1.8 直接–偏移量操作数 80
4.1.9 传送数据的示例 81
4.1.10 本节回顾 83
4.2 加法和减法 84
4.2.1 INC和DEC指令 84
4.2.2 ADD指令 84
4.2.3 SUB指令 85
4.2.4 NEG指令 85
4.2.5 实现算术表达式 85
4.2.6 加减法影响的标志 86
4.2.7 示例程序(AddSubTest) 88
4.2.8 本节回顾 89
4.3 与数据相关的操作符和伪指令 90
4.3.1 OFFSET操作符 90
4.3.2 ALIGN伪指令 91
4.3.3 PTR操作符 92
4.3.4 TYPE操作符 92
4.3.5 LENGTHOF操作符 93
4.3.6 SIZEOF操作符 93
4.3.7 LABEL伪指令 94
4.3.8 本节回顾 94
4.4 间接寻址 94
4.4.1 间接操作数 94
4.4.2 数组 95
4.4.3 变址操作数 96
4.4.4 指针 97
4.4.5 本节回顾 99
4.5 JMP和LOOP指令 100
4.5.1 JMP指令 100
4.5.2 LOOP指令 101
4.5.3 在Visual Studio调试器中显示数组 102
4.5.4 整数数组求和 103
4.5.5 复制字符串 103
4.5.6 本节回顾 104
4.6 64位编程 105
4.6.1 MOV指令 105
4.6.2 64位版本的SumArray程序 105
4.6.3 加法和减法 106
4.6.4 本节回顾 107
4.7 本章小结 107
4.8 关键术语 109
4.8.1 术语 109
4.8.2 指令、操作符及伪指令 109
4.9 复习题和练习 109
4.9.1 简答题 109
4.9.2 算法题 111
4.10 编程练习 112
第5章 过程 113
5.1 堆栈操作 113
5.1.1 运行时堆栈(32位模式) 113
5.1.2 PUSH和POP指令 115
5.1.3 本节回顾 118
5.2 定义和使用过程 118
5.2.1 PROC伪指令 118
5.2.2 CALL和RET指令 120
5.2.3 嵌套过程调用 120
5.2.4 向过程传递寄存器参数 121
5.2.5 示例:整数数组求和 122
5.2.6 保存和恢复寄存器 123
5.2.7 本节回顾 124
5.3 链接到外部库 124
5.3.1 背景信息 125
5.3.2 本节回顾 125
5.4 Irvine32库 126
5.4.1 创建库的动机 126
5.4.2 Win32控制台窗口 127
5.4.3 各个过程的描述 128
5.4.4 库测试程序 138
5.4.5 本节回顾 144
5.5 64位汇编编程 145
5.5.1 Irvine64库 145
5.5.2 调用64位子例程 145
5.5.3 x64调用规约 146
5.5.4 调用过程的示例程序 146
5.5.5 本节回顾 147
5.6 本章小结 148
5.7 关键术语 149
5.7.1 术语 149
5.7.2 指令、操作符及伪指令 149
5.8 复习题和练习 149
5.8.1 简答题 149
5.8.2 算法题 151
5.9 编程练习 152
第6章 条件处理 154
6.1 布尔和比较指令 154
6.1.1 CPU状态标志 154
6.1.2 AND指令 155
6.1.3 OR指令 156
6.1.4 位映射集 157
6.1.5 XOR指令 158
6.1.6 NOT指令 159
6.1.7 TEST指令 159
6.1.8 CMP指令 160
6.1.9 置位和清零各个CPU标志 161
6.1.10 64位模式下的布尔指令 161
6.1.11 本节回顾 161
6.2 条件跳转 162
6.2.1 条件结构 162
6.2.2 Jcond指令 162
6.2.3 条件跳转指令的类型 163
6.2.4 条件跳转应用 166
6.2.5 本节回顾 169
6.3 条件循环指令 170
6.3.1 LOOPZ和LOOPE指令 170
6.3.2 LOOPNZ和LOOPNE指令 170
6.3.3 本节回顾 171
6.4 条件结构 171
6.4.1 块结构的IF语句 171
6.4.2 复合表达式 175
6.4.3 WHILE循环 176
6.4.4 表驱动的选择 178
6.4.5 本节回顾 180
6.5 应用:有限状态机 181
6.5.1 验证输入字符串 181
6.5.2 验证有符号整数 182
6.5.3 本节回顾 185
6.6 条件控制流伪指令(可选主题) 186
6.6.1 创建IF语句 186
6.6.2 有符号数和无符号数的比较 188
6.6.3 复合表达式 189
6.6.4 用.REPEAT和.WHILE创建循环 191
6.7 本章小结 192
6.8 关键术语 193
6.8.1 术语 193
6.8.2 指令、操作符及伪指令 193
6.9 复习题和练习 194
6.9.1 简答题 194
6.9.2 算法题 195
6.10 编程练习 196
6.10.1 对代码测试的建议 196
6.10.2 习题描述 197
第7章 整数算术运算 200
7.1 移位和循环移位指令 200
7.1.1 逻辑移位和算术移位 200
7.1.2 SHL指令 201
7.1.3 SHR指令 202
7.1.4 SAL和SAR指令 202
7.1.5 ROL指令 203
7.1.6 ROR指令 204
7.1.7 RCL和RCR指令 204
7.1.8 有符号数溢出 205
7.1.9 SHLD/SHRD指令 205
7.1.10 本节回顾 207
7.2 移位和循环移位的应用 207
7.2.1 多个双字的移位 208
7.2.2 通过移位做乘法 208
7.2.3 显示二进制位 209
7.2.4 提取文件日期字段 210
7.2.5 本节回顾 210
7.3 乘法和除法指令 212
7.3.1 无符号整数乘法(MUL) 212
7.3.2 有符号整数乘法(IMUL) 213
7.3.3 测量程序执行时间 216
7.3.4 无符号整数除法(DIV) 217
7.3.5 有符号整数除法(IDIV) 219
7.3.6 实现算术表达式 222
7.3.7 本节回顾 224
7.4 扩展的加减法 225
7.4.1 ADC指令 225
7.4.2 扩展加法的示例 225
7.4.3 SBB指令 227
7.4.4 本节回顾 228
7.5 ASCII和非压缩十进制算术运算 228
7.5.1 AAA指令 229
7.5.2 AAS指令 230
7.5.3 AAM指令 231
7.5.4 AAD指令 231
7.5.5 本节回顾 231
7.6 压缩十进制的算术运算 232
7.6.1 DAA指令 232
7.6.2 DAS指令 233
7.6.3 本节回顾 233
7.7 本章小结 234
7.8 关键术语 235
7.8.1 术语 235
7.8.2 指令、操作符及伪指令 235
7.9 复习题和练习 235
7.9.1 简答题 235
7.9.2 算法题 237
7.10 编程练习 237
第8章 高级过程 240
8.1 引言 240
8.2 堆栈帧 240
8.2.1 堆栈参数 240
8.2.2 寄存器参数的缺点 241
8.2.3 访问堆栈参数 243
8.2.4 32位调用规约 245
8.2.5 局部变量 246
8.2.6 引用参数 247
8.2.7 LEA指令 248
8.2.8 ENTER和LEAVE指令 249
8.2.9 LOCAL伪指令 250
8.2.10 Microsoft x64调用规约 251
8.2.11 本节回顾 252
8.3 递归 252
8.3.1 递归求和 253
8.3.2 计算阶乘 254
8.3.3 本节回顾 258
8.4 INVOKE、ADDR、PROC及PROTO 259
8.4.1 INVOKE伪指令 259
8.4.2 ADDR操作符 260
8.4.3 PROC伪指令 260
8.4.4 PROTO伪指令 263
8.4.5 参数分类 266
8.4.6 示例:交换两个整数 266
8.4.7 调试提示 267
8.4.8 WriteStackFrame过程 267
8.4.9 本节回顾 268
8.5 创建多模块程序 269
8.5.1 隐藏和导出过程名 269
8.5.2 调用外部过程 269
8.5.3 跨模块使用变量和符号 270
8.5.4 示例:ArraySum程序 271
8.5.5 用Extern创建模块 271
8.5.6 用INVOKE和PROTO创建模块 274
8.5.7 本节回顾 277
8.6 参数的高级用法(可选主题) 277
8.6.1 受USES操作符影响的堆栈 277
8.6.2 向堆栈传递8位和16位参数 278
8.6.3 传递64位参数 279
8.6.4 非双字局部变量 280
8.7 Java字节码(可选主题) 281
8.7.1 Java虚拟机 281
8.7.2 指令集 282
8.7.3 Java反汇编示例 283
8.7.4 示例:条件分支 285
8.8 本章小结 287
8.9 关键术语 288
8.9.1 术语 288
8.9.2 指令、操作符及伪指令 288
8.10 复习题和练习 288
8.10.1 简答题 288
8.10.2 算法题 289
8.11 编程练习 289
第9章 字符串和数组 291
9.1 引言 291
9.2 字符串原语指令 291
9.2.1 MOVSB、MOVSW及MOVSD 292
9.2.2 CMPSB、CMPSW及CMPSD 293
9.2.3 SCASB、SCASW及SCASD 293
9.2.4 STOSB、STOSW及STOSD 294
9.2.5 LODSB、LODSW及LODSD 294
9.2.6 本节回顾 294
9.3 若干字符串过程 295
9.3.1 Str_compare过程 295
9.3.2 Str_length过程 296
9.3.3 Str_copy过程 297
9.3.4 Str_trim过程 297
9.3.5 Str_ucase过程 299
9.3.6 字符串库演示程序 300
9.3.7 Irvine64库中的字符串过程 301
9.3.8 本节回顾 304
9.4 二维数组 304
9.4.1 行列顺序 304
9.4.2 基址–变址操作数 305
9.4.3 基址–变址–位移操作数 306
9.4.4 64位模式下的基址–变址操作数 307
9.4.5 本节回顾 308
9.5 整数数组的查找和排序 308
9.5.1 冒泡排序 309
9.5.2 对半查找 310
9.5.3 本节回顾 315
9.6 Java字节码:字符串处理(可选主题) 315
9.7 本章小结 316
9.8 关键术语和指令 317
9.9 复习题和练习 317
9.9.1 简答题 317
9.9.2 算法题 318
9.10 编程练习 318
第10章 结构和宏 322
10.1 结构 322
10.1.1 定义结构 322
10.1.2 声明结构对象 323
10.1.3 引用结构对象 324
10.1.4 示例:显示系统时间 327
10.1.5 结构包含结构 329
10.1.6 示例:醉汉行走 329
10.1.7 声明和使用联合 332
10.1.8 本节回顾 334
10.2 宏 334
10.2.1 概述 334
10.2.2 定义宏 335
10.2.3 调用宏 336
10.2.4 其他宏特性 337
10.2.5 使用本书的宏库(仅32位模式) 340
10.2.6 示例程序:封装器 345
10.2.7 本节回顾 346
10.3 条件汇编伪指令 347
10.3.1 检查缺失的参数 347
10.3.2 默认参数初始化值 348
10.3.3 布尔表达式 348
10.3.4 IF、ELSE及ENDIF伪指令 349
10.3.5 IFIDN和IFIDNI伪指令 349
10.3.6 示例:矩阵行求和 350
10.3.7 特殊操作符 353
10.3.8 宏函数 356
10.3.9 本节回顾 357
10.4 定义重复语句块 357
10.4.1 WHILE伪指令 358
10.4.2 REPEAT伪指令 358
10.4.3 FOR伪指令 358
10.4.4 FORC伪指令 359
10.4.5 示例:链表 360
10.4.6 本节回顾 361
10.5 本章小结 362
10.6 关键术语 363
10.6.1 术语 363
10.6.2 操作符及伪指令 363
10.7 复习题和练习 364
10.7.1 简答题 364
10.7.2 算法题 364
10.8 编程练习 366
第11章 MS-Windows编程 368
11.1 Win32控制台编程 368
11.1.1 背景信息 368
11.1.2 Win32控制台函数 371
11.1.3 显示消息框 373
11.1.4 控制台输入 375
11.1.5 控制台输出 380
11.1.6 读写文件 382
11.1.7 Irvine32库中的文件I/O 385
11.1.8 测试文件I/O过程 386
11.1.9 控制台窗口操作 389
11.1.10 控制光标 392
11.1.11 控制文本颜色 392
11.1.12 时间和日期函数 394
11.1.13 使用64位Windows API 397
11.1.14 本节回顾 398
11.2 编写图形化的Windows应用程序 398
11.2.1 必要的结构 399
11.2.2 MessageBox函数 400
11.2.3 WinMain过程 400
11.2.4 WinProc过程 401
11.2.5 ErrorHandler过程 401
11.2.6 程序清单 402
11.2.7 本节回顾 405
11.3 动态内存分配 405
11.3.1 HeapTest程序 408
11.3.2 本节回顾 411
11.4 32位x86存储管理 411
11.4.1 线性地址 412
11.4.2 页转换 414
11.4.3 本节回顾 416
11.5 本章小结 416
11.6 关键术语 417
11.7 复习题和练习 417
11.7.1 简答题 417
11.7.2 算法题 418
11.8 编程练习 418
第12章 浮点数处理和指令编码 420
12.1 浮点数的二进制表示 420
12.1.1 IEEE二进制浮点数表示 420
12.1.2 阶数 421
12.1.3 规格化二进制浮点数 422
12.1.4 创建IEEE表示 422
12.1.5 将十进制分数转换为二进制实数 424
12.1.6 本节回顾 425
12.2 浮点单元 425
12.2.1 FPU寄存器栈 426
12.2.2 舍入 428
12.2.3 浮点异常 429
12.2.4 浮点指令集 429
12.2.5 算术运算指令 432
12.2.6 比较浮点数值 435
12.2.7 读写浮点数值 437
12.2.8 异常同步 438
12.2.9 代码示例 439
12.2.10 混合模式算术运算 440
12.2.11 屏蔽和非屏蔽异常 441
12.2.12 本节回顾 442
12.3 x86指令编码 443
12.3.1 指令格式 443
12.3.2 单字节指令 444
12.3.3 将立即数送入寄存器 444
12.3.4 寄存器模式指令 445
12.3.5 处理器操作数大小前缀 446
12.3.6 内存模式指令 446
12.3.7 本节回顾 448
12.4 本章小结 449
12.5 关键术语 450
12.6 复习题和练习 450
12.6.1 简答题 450
12.6.2 算法题 451
12.7 编程练习 452
第13章 高级语言接口 454
13.1 引言 454
13.1.1 通用规约 454
13.1.2 .MODEL伪指令 455
13.1.3 检查编译器生成的代码 457
13.1.4 本节回顾 460
13.2 内联汇编代码 461
13.2.1 Visual C++中的_?_asm伪指令 461
13.2.2 文件加密示例 463
13.2.3 本节回顾 465
13.3 将32位汇编语言代码链接到C/C++ 466
13.3.1 IndexOf示例 466
13.3.2 调用C和C++函数 469
13.3.3 乘法表的示例 471
13.3.4 本节回顾 474
13.4 本章小结 474
13.5 关键术语 474
13.6 复习题 474
13.7 编程练习 475
第14章 16位MS-DOS编程 476
14.1 MS-DOS和IBM-PC 476
14.1.1 内存组织 476
14.1.2 重定向输入/输出 478
14.1.3 软件中断 478
14.1.4 INT指令 478
14.1.5 16位程序的代码编写 479
14.1.6 本节回顾 481
14.2 MS-DOS功能调用(INT 21h) 481
14.2.1 若干输出功能 482
14.2.2 Hello World程序示例 483
14.2.3 若干输入功能 484
14.2.4 日期/时间功能 487
14.2.5 本节回顾 490
14.3 标准的MS-DOS文件I/O服务 490
14.3.1 创建或打开文件(716Ch) 491
14.3.2 关闭文件句柄(3Eh) 492
14.3.3 移动文件指针(42h) 493
14.3.4 获取文件创建日期和时间 493
14.3.5 若干库过程 494
14.3.6 示例:读取和复制一个文本文件 495
14.3.7 读取MS-DOS命令的尾部 496
14.3.8 示例:创建二进制文件 498
14.3.9 本节回顾 501
14.4 本章小结 501
14.5 关键术语 503
14.6 编程练习 503
第15章 磁盘基础知识 505
15.1 磁盘存储系统 505
15.1.1 磁道、柱面及扇区 505
15.1.2 磁盘分区(卷) 506
15.1.3 本节回顾 507
15.2 文件系统 508
15.2.1 FAT12 508
15.2.2 FAT16 509
15.2.3 FAT32 509
15.2.4 NTFS 509
15.2.5 主磁盘区 510
15.2.6 本节回顾 510
15.3 磁盘目录 511
15.3.1 MS-DOS目录结构 512
15.3.2 MS-Windows中的长文件名 513
15.3.3 文件分配表 515
15.3.4 本节回顾 515
15.4 读写磁盘扇区 515
15.4.1 扇区显示程序 517
15.4.2 本节回顾 520
15.5 系统级文件功能 520
15.5.1 获取磁盘空闲空间(7303h) 520
15.5.2 创建子目录(39h) 523
15.5.3 删除子目录(3Ah) 523
15.5.4 设置当前目录(3Bh) 523
15.5.5 获取当前目录(47h) 524
15.5.6 获取和设置文件属性(7143h) 524
15.5.7 本节回顾 525
15.6 本章小结 525
15.7 关键术语 526
15.8 编程练习 526
第16章 BIOS级编程 528
16.1 引言 528
16.1.1 BIOS数据区 528
16.2 使用INT 16h进行键盘输入 529
16.2.1 键盘如何工作 530
16.2.2 INT 16h功能 530
16.2.3 本节回顾 534
16.3 使用INT 10h进行视频编程 534
16.3.1 基本背景 534
16.3.2 控制颜色 536
16.3.3 INT 10h视频功能 537
16.3.4 库过程示例 546
16.3.5 本节回顾 547
16.4 使用INT 10h绘制图形 547
16.4.1 INT 10h与像素有关的功能 548
16.4.2 程序DrawLine 548
16.4.3 笛卡尔坐标程序 550
16.4.4 将笛卡尔坐标转换为屏幕坐标 552
16.4.5 本节回顾 552
16.5 内存映射的图形 553
16.5.1 模式13h:320×200,256色 553
16.5.2 内存映射图形程序 554
16.5.3 本节回顾 556
16.6 鼠标编程 557
16.6.1 鼠标INT 33h功能 557
16.6.2 鼠标跟踪程序 561
16.6.3 本节回顾 565
16.7 本章小结 565
16.8 编程练习 566
网络资源
附录A MASM参考知识
附录B x86指令集
附录C BIOS和MS-DOS中断
附录D “本节回顾”的问题答案(第14~16章)
词汇表

教学资源推荐
作者: 哈罗德·阿贝尔森(Harold Abelson)[美] 杰拉尔德•杰伊·萨斯曼(Gerald Jay Sussman) 著朱莉·萨斯曼(Julie Sussman)
作者: (美)Barry Wilkinson, Michael Allen
作者: [美]保罗·戴特尔 (Paul Deitel) 哈维·戴特尔(Harvey Deitel) 著
参考读物推荐
作者: (美)Jeremy Alessi 著
作者: 陈浩 等编著
作者: Steven Holzner
作者: (美)大卫?索耶?麦克法兰德(David Sawyer McFarland) 著