本书共分三部分,第一部分是基础部分,以8086/8088为背景,以DOS和PC兼容杨为软硬件平台,介绍汇编语言的有关概念。第二部分是提高部分,以80386为背景,介绍保护方式下的有关概念。第三部分是上机实验指导。
汇编语言面向机器,只有它能够为程序员提供最直接操纵机器硬件系统的途径,利用它可以编写出在“时间”和“空间”两个方面最具效率的程序。
“汇编语言程序设计”是计算机各专业的一门重要基础课程,是必修的核心课程之一,是“操作系统”和“微机原理与接口技术”等其他核心课程必要的先修课。该课程对于训练学生掌握程序设计技术,熟悉上机操作和程序调试技术都有重要作用。此外,“汇编语言程序设计”也是其他相关专业的必修或选修课。
目前,国内最广泛使用的PC系列机(包括兼容机),都以Intel的80x86系列微处理器或者兼容的微处理器为CPU。在Intel的80x86家族中,16位的8086/8088是基础,实现了以分段方式管理存储器;32位的80386是高档微处理器的里程碑,实现了支持多任务的保护工作方式;基于MMX技术的Pentium是新一代的微处理器,实现了对多媒体处理的支持。本书以8086/8088为基础,以80386为重点,面向Pentium等新一代微处理器,讲解汇编语言程序设计的一般概念、基本技术和常用技巧,介绍宏和模块化程序设计的技术方法,讲解保护方式编程的相关概念、编程技术及实现细节。
本书分三个部分,共12章。第一部分是基础部分。第1章介绍汇编语言的特点和其他基本概念。第2、第3章以8086/8088为背景,简要介绍8086/8088寻址方式、指令系统和汇编语言的常用伪指令语句后,讲解如何利用汇编语言实现程序的基本结构。第4章详细讲解了子程序的设计和如何调用DOS提供的子程序。第5章以PC及其兼容机为硬件平台,介绍输入/输出和中断等概念,讲解如何利用汇编语言编写BIOS程序和调用BIOS程序。第6章以DOS为软件平台,讲解如何利用汇编语言编写小型应用程序。第7章以MASM和TASM为汇编器,介绍宏和条件汇编等汇编语言的高级技术。第8章介绍模块化程序设计技术以及与高级语言的混合编程。第二部分是提高部分。第9章介绍实方式下的80386及其编程。第10章讲解保护方式下的80386及其编程,该章内容十分丰富。第11章介绍80486和Pentium程序设计基础。第三部分是上机实验指导,安排为第12章,应在上机实验前先阅读了解该章内容。
本书的第一部分适合初学者,可作为学习汇编语言程序设计的教材。本书的第二部分适合已基本掌握8086/8088汇编语言的程序员,可作为学习保护方式编程技术的教材或参考书,也可作为其他人员了解高档微处理器和保护方式编程技术细节的参考书,还可作为程序员透彻地了解Windows程序设计技术的参考书。
杨季文编写第1章、第3章、第4章至第7章、第9章至第11章,朱巧明编写第2章,吕强编写第8章,曹培培编写第12章。由杨季文最后统一定稿。
本书从初稿到定稿的全过程都始终得到了指导老师钱培德教授的热情关心和大力支持,承蒙他审阅了全书,特在此表示衷心感谢。本书在编著过程中得到了同事鲁征山、陈时飚、李培峰和李廷彦等同志的帮助,还得到了赵雷和朱楠灏等同志的帮助,在此表示感谢。刘文杰和许晨等同志在讲课时使用过本书的初稿,并提出了宝贵意见,在此表示感谢。
书中不妥和谬误之处难免,恳请读者批评指正。
1章绪论1
1.1汇编语言概述1
1.1.1汇编语言1
1.1.2汇编语言的特点2
1.1.3恰当地使用汇编语言3
1.2数据的表示和类型4
1.2.1数值数据的表示4
1.2.2非数值数据的表示6
1.2.3基本数据类型7
1.3Intel系列CPU简介8
1.3.18位微处理器8
1.3.216位微处理器9
1.3.332位微处理器11
13
1.4习题14
第2章8086/8088寻址方式和指令系统15
2.18086/8088寄存器组15
2.1.18086/8088 CPU寄存器组15
2.1.2标志寄存器17
2.2存储器分段和地址的形成19
2.2.1存储单元的地址和内容19
2.2.2存储器的分段20
2.2.3物理地址的形成20
2.2.4段寄存器的引用21
2.38086/8088的寻址方式22
2.3.1立即寻址方式23
2.3.2寄存器寻址方式23
2.3.3直接寻址方式23
2.3.4寄存器间接寻址方式24
2.3.5寄存器相对寻址方式25
2.3.6基址加变址寻址方式26
2.3.7相对基址加变址寻址方式27
2.48086/8088指令系统28
2.4.1指令集说明28
2.4.2数据传送指令29
2.4.3堆栈操作指令32
2.4.4标志操作指令34
2.4.5加减运算指令36
2.4.6乘除运算指令41
2.4.7逻辑运算和移位指令44
2.4.8转移指令51
2.5习题58
第3章汇编语言及其程序设计初步63
3.1汇编语言的语句63
3.1.1语句的种类和格式63
3.1.2数值表达式64
3.1.3地址表达式67
3.2变量和标号67
3.2.1数据定义语句67
3.2.2变量和标号70
3.3常用伪指令语句和源程序组织73
3.3.1符号定义语句74
3.3.2段定义语句75
3.3.3汇编语言源程序的组织79
3.4 顺序程序设计81
3.4.1顺序程序举例81
3.4.2简单查表法代码转换83
3.4.3查表法求函数值85
3.5分支程序设计86
3.5.1分支程序举例86
3.5.2利用地址表实现多向分支91
3.6循环程序设计94
3.6.1循环程序举例94
3.6.2多重循环程序举例103
3.7习题106
第4章子程序设计和DOS功能调用110
4.1子程序设计110
4.1.1过程调用和返回指令110
4.1.2过程定义语句115
4.1.3子程序举例116
4.1.4子程序说明信息118
4.1.5寄存器的保护与恢复119
4.2主程序与子程序间的参数传递121
4.2.1利用寄存器传递参数121
4.2.2利用约定存储单元传递参数123
4.2.3利用堆栈传递参数125
4.2.4利用CALL后续区传递参数127
4.3DOS功能调用及应用129
4.3.1DOS功能调用概述129
4.3.2基本I/O功能调用130
4.3.3应用举例132
4.4磁盘文件管理及应用141
4.4.1DOS磁盘文件管理功能调用141
4.4.2应用举例143
4.5子程序的递归和重入150
4.5.1递归子程序150
4.5.2可重入子程序151
4.6习题152
第5章输入输出与中断155
5.1输入和输出的基本概念155
5.1.1I/O端口地址和I/O指令155
5.1.2数据传送方式156
5.1.3存取RT/CMOS RAM157
5.2查询方式传送数据160
5.2.1查询传送方式160
5.2.2读实时钟161
5.2.3查询方式打印输出162
5.3中断164
5.3.1中断和中断传送方式164
5.3.2中断向量表165
5.3.3中断响应过程168
5.3.4外部中断168
5.3.5内部中断170
5.3.6中断优先级和中断嵌套172
5.3.7中断处理程序的设计173
5.4基本输入输出系统BIOS174
5.4.1基本输入输出系统BIOS概述174
5.4.2键盘输入175
5.4.3显示输出178
5.4.4打印输出188
5.5 软中断处理程序举例191
5.5.1打印I/O程序191
5.5.2时钟显示程序194
5.6习题197
第6章简单应用程序的设计200
6.1字符串处理200
6.1.1字符串操作指令200
6.1.2重复前缀205
6.1.3字符串操作举例208
6.2十进制数算术运算调整指令及应用215
6.2.1组合BCD码的算术运算调整指令215
6.2.2未组合BCD码的算术运算调整指令216
6.2.3应用举例218
6.3DOS程序段前缀和特殊情况处理程序224
6.3.1DOS程序段前缀PSP224
6.3.2对Ctrl+C键和Ctrl+Break键的处理228
6.4TSR程序设计举例234
6.4.1驻留的时钟显示程序234
6.4.2热键激活的TSR程序236
6.5习题238
第7章高级汇编语言技术241
7.1结构和记录241
7.1.1结构241
7.1.2记录246
7.2宏249
7.2.1宏指令的定义和使用250
7.2.2宏指令的用途251
7.2.3宏指令中参数的使用253
7.2.4特殊的宏运算符254
7.2.5宏与子程序的区别256
7.2.6与宏有关的伪指令256
7.2.7宏定义的嵌套258
7.3重复汇编260
7.3.1伪指令REPT260
7.3.2伪指令IRP261
7.3.3伪指令IRPC262
7.4条件汇编262
7.4.1条件汇编伪指令263
7.4.2条件汇编与宏结合265
7.5源程序的结合268
7.5.1源程序的结合268
7.5.2宏库的使用271
7.6习题273
第8章模块化程序设计技术275
8.1段的完整定义275
8.1.1完整的段定义275
8.1.2关于堆栈段的说明280
8.1.3段组的说明和使用281
8.2段的简化定义285
8.2.1存储模型说明伪指令285
8.2.2简化的段定义伪指令285
8.2.3存储模型说明伪指令的隐含动作288
8.3模块间的通信289
8.3.1伪指令PUBLIC和伪指令EXTRN289
8.3.2模块间的转移291
8.3.3模块间的信息传递293
8.4子程序库298
8.4.1子程序库298
8.4.2建立子程序库298
8.4.3使用举例301
8.5编写供Turbo C调用的函数303
8.5.1汇编格式的编译结果303
8.5.2汇编模块应该遵守的约定306
8.5.3参数传递和寄存器保护307
8.5.4举例309
8.6习题313
第二部分提 高 部 分
第9章80386程序设计基础314
9.180386寄存器314
9.1.1通用寄存器315
9.1.2段寄存器315
9.1.3指令指针和标志寄存器316
9.280386存储器寻址316
9.2.1存储器寻址基本概念317
9.2.2灵活的存储器寻址方式318
9.2.3支持各种数据结构320
9.380386指令集320
9.3.1数据传送指令321
9.3.2算术运算指令326
9.3.3逻辑运算和移位指令327
9.3.4控制转移指令330
9.3.5串操作指令334
9.3.6高级语言支持指令337
9.3.7条件字节设置指令340
9.3.8位操作指令342
9.3.9处理器控制指令345
9.4实方式下的程序设计346
9.4.1说明346
9.4.2实例348
9.5习题358
第10章保护方式下的80386及其编程361
10.1保护方式简述361
10.1.1存储管理机制361
10.1.2保护机制363
10.2分段管理机制364
10.2.1段定义和虚拟地址到线性地址转换364
10.2.2存储段描述符366
10.2.3全局和局部描述符表369
10.2.4段选择子370
10.2.5段描述符高速缓冲寄存器371
10.380386控制寄存器和系统地址寄存器372
10.3.1控制寄存器372
10.3.2系统地址寄存器374
10.4实方式与保护方式切换实例375
10.4.1演示实方式和保护方式切换的实例(实例一)376
10.4.2演示32位代码段和16位代码段切换的实例(实例二)382
10.5任务状态段和控制门389
10.5.1系统段描述符389
10.5.2门描述符390
10.5.3任务状态段392
10.6控制转移395
10.6.1任务内无特权级变换的转移395
10.6.2演示任务内无特权级变换转移的实例(实例三)397
10.6.3任务内不同特权级的变换408
10.6.4演示任务内特权级变换的实例(实例四)410
10.6.5任务切换420
10.6.6演示任务切换的实例(实例五)422
10.780386的中断和异常431
10.7.180386的中断和异常431
10.7.2异常类型433
10.7.3中断和异常的转移方法437
10.7.4演示中断处理的实例(实例六)442
10.7.5演示异常处理的实例(实例七)450
10.7.6各种转移途径小结465
10.8操作系统类指令466
10.8.1实方式和任何特权级下可执行的指令467
10.8.2实方式及特权级0下可执行的指令468
10.8.3只能在保护方式下执行的指令470
10.8.4显示关键寄存器内容的实例(实例八)473
10.8.5特权指令477
10.9输入/输出保护477
10.9.1输入/输出保护477
10.9.2重要标志保护481
10.9.3演示输入/输出保护的实例(实例九)481
10.10分页管理机制492
10.10.1存储器分页管理机制492
10.10.2线性地址到物理地址的转换493
10.10.3页级保护和虚拟存储器支持496
10.10.4页异常498
10.10.5演示分页机制的实例(实例十)499
10.11虚拟8086方式506
10.11.1V86方式506
10.11.2进入和离开V86方式506
10.11.3演示进入和离开V86方式的实例(实例十一)510
10.11.4V86方式下的敏感指令522
10.12习题523
第11章80486及Pentium程序设计基础525
11.180486程序设计基础525
11.1.1寄存器525
11.1.2指令系统527
11.1.3片上超高速缓存530
11.280486对调试的支持535
11.2.1调试寄存器535
11.2.2演示调试故障/陷阱的实例538
11.3Pentium程序设计基础543
11.3.1寄存器543
11.3.2指令系统545
11.3.3处理器的识别548
11.3.4片上超高速缓存553
11.4基于Pentium的程序优化技术557
11.4.1流水线优化技术557
11.4.2分支优化技术564
11.4.3超高速缓存优化技术567
11.5习题569
第三部分上机实验指导
第12章实验指导572
12.1实验的一般步骤572
12.2汇编器和连接器的使用574
12.2.1MASM的使用574
12.2.2LINK的使用575
12.2.3TASM的使用577
12.2.4TLINK的使用578
12.3调试器DEBUG的使用578
12.3.1启动和退出DEBUG579
12.3.2命令一览580
12.3.3利用DEBUG调试程序582
12.4Turbo Debugger的使用587
12.4.1启动和退出TD587
12.4.2利用TD调试汇编程序588
参考文献592
附录Pentium指令与标志参考表593