目录 3
第一部分 MS-DOS系统下的程序设计 3
第一章 MS-DOS操作系统概述 3
1.1 MS-DOS系统的基本组成 4
1.1.1 MS-DOS系统 5
1.1.2 PC机的物理组成成分 5
1.2 Intel 80x86系列微处理器 7
1.2.1 8086中表示数据的方法 8
1.2.2 各种形式的数 9
1.2.3 8086寄存器 12
1.2.4 8086中的内存寻址方式 15
1.2.5 8086堆栈 17
1.2.6 8086中的输入/输出 18
1.3 DOS 19
1.3.1 加电MS-DOS PC机 19
1.3.2 在DOS下执行程序 21
1.3.3 访问ROMBIOS和DOS功能 24
1.3.4 通过int指令调用DOS和BIOS功能 24
1.4 摘要 25
第二章 MASM程序设计 27
2.1 建立编写MASM程序所需要的工具 27
2.1.1 源文件、目标文件和可执行文件 27
2.1.2 准备源文件 27
2.1.3 汇编和连接 28
2.1.4 使用MASM 29
2.1.5 环境变量、批处理文件与MAKE文件 30
2.1.6 连接目标文件 33
2.2.1 .COM程序和.EXE程序 35
2.2 第一个汇编语言程序 35
2.2.2 汇编语言程序样板 36
2.3 汇编过程 40
2.3.1 MASM段 42
2.3.2 符号表、向前引用和两趟汇编 43
2.3.3 连接程序的作用 43
2.4 MASM简介 44
2.4.1 处理器指令格式 44
2.4.2 操作数指定方式 45
2.5.1 指令编码 54
2.5 8086指令集 54
2.5.2 指令类型 56
2.5.3 数据移动 57
2.5.4 算术操作、逻辑操作和移位操作 58
2.5.5 标志处理 59
2.5.6 过程、循环和跳转 59
2.5.7 处理器控制和保护方式操作 59
2.6 MASM伪指令及算符 60
2.6.1 段说明 60
2.6.2 数据定义和存储分配 62
2.6.3 宏、过程和包含文件 63
2.6.4 代码生成、错误处理和列表 65
2.6.5 MASM算符 66
2.7 示例:打印环境块内容 66
2.7.1 找出算法 66
2.7.2 程序及其输出 67
2.7.3 程序结构 71
2.8 摘要 72
3.1.1 查看文件和内存的内容 74
3.1 使用DEBUG 74
第三章 用CodeView和DEBUG进行调试 74
3.1.2 利用DEBUG测试代码 76
3.1.3 利用DEBUG进行调试 79
3.1.4 DEBUG命令摘要 80
3.2 使用CodeView 82
3.2.1 使用CodeView的基础知识 82
3.2.2 CodeView中对话窗口命令 85
3.2.3 CodeView中的菜单 86
3.2.4 在CodeView中请求帮助 90
3.2.5 在CodeView中进行调试 91
3.2.6 对话窗口命令 94
3.3 小结 94
第二部分 处理器指令 97
第四章 数据传送指令 97
4.1 向/从内存传送数据 97
4.1.1 MOV指令的不同形式 98
4.1.2 巧妙的传送 98
4.3.1 其他类型的数据传送:XCHG和XLAT 99
4.3 装入立即数进DS、SS或ES寄存器 99
4.2 将数据从一个内存位置传送至另一个内存位置 99
4.4 将地址装入寄存器LDS和LES 101
4.4.1 装入有效地址:LEA 102
4.4.2 在80386/486中传送数据 103
4.5 堆栈管理 103
4.5.1 压入和弹出:PUSH和POP 104
4.5.2 压入标志值:PUSHF和POPF 105
4.5.3 通过堆栈传递参数 105
4.6.2 拷贝块 108
4.6.1 重复前缀:REP 108
4.6 传送大块数据:MOVS、STOS和LODS 108
4.6.3 初始化一块内存区域:STOS 109
4.6.4 字符串功能 109
4.7 I/O端口数据传送:IN和OUT 110
4.8 小结 110
第五章 算术、逻辑和移位操作 138
5.1 算术运算指令 138
5.1.1 加法 139
5.1.2 减法 140
5.2 除法 141
5.1.3 乘法和除法 141
5.3 交换并相加 142
5.4 测试和比较指令 142
5.4.1 比较两个值 143
5.4.2 测试位 144
5.4.3 字符串测试和比较 144
5.4.4 80386/486中的测试和比较指令 146
5.5 逻辑指令 148
5.6 移位和循环移位 148
5.6.1 通过移位实现加倍和减半 149
5.6.2 循环移位 150
5.6.3 80386/486双精度移位和位扫描 150
5.7 带符号扩展的转换 151
5.8 针对BCD运算进行调整 152
5.8.1 BCD运算 152
5.9 在乘除法之后进行调整 153
5.10 小结 154
第六章 过程、循环和跳转 204
6.1.1 跳转 205
6.1 无条件控制转移 205
6.1.2 过程调用 206
6.1.3 从过程中返回 208
6.1.4 堆栈框架和过程 211
6.1.5 中断 211
6.2 条件控制转移 213
6.2.1 条件跳转 214
6.2.2 带符号和无符号比较 215
6.2.3 循环 216
6.4 小结 217
6.3 溢出和边界检测 217
第七章 处理器控制和保护模式操作 239
7.1 处理器控制 239
7.1.1 标志值处理 239
7.1.2 处理器同步 242
7.1.3 同协处理器协同工作 242
7.1.4 HLT和NOP指令 243
7.2 保护模式操作 243
7.2.1 保护模式下的内存 243
7.2.2 80286,80386和80486的多任务及其保护 244
7.2.3 DOS扩展程序 245
7.3 小结 246
第三部分 MASM指令及运算符 269
第八章 段说明 269
8.1 逻辑段和物理段 269
8.2 完整的段说明 271
8.2.1 SEGMENT指令 272
8.2.2 段分组 275
8.3 简化的段说明 276
8.3.1 MASM中的内存模式 277
8.3.2 另外的代码和数据段 278
8.3.3 预定义符号 279
8.3.4 段排列 280
8.4 指定程序入口点 281
8.5 小结 281
第九章 数据定义和存储分配 292
9.1 等价 292
9.2 处理文本串 294
9.1.1 缺省的基数值 294
9.3 存储分配 296
9.3.1 为变量申请字节 296
9.3.2 位置计数器和ORG指令 301
9.3.3 结构、联合和记录 303
9.3.4 使用STRUC组织用户数据 303
9.3.5 为结构分配空间 304
9.3.6 在汇编过程中初始化结构域 304
9.3.8 MASM中嵌套的结构 305
9.3.7 在汇编过程中初始化某些域 305
9.3.9 访问结构中的域 306
9.3.10 访问嵌套结构中的域 306
9.3.11 指令UNION 307
9.3.12 同时使用UNION和STRUC 307
9.3.13 使用记录组织位域 308
9.4 小结 311
第十章 模块化程序的宏、过程和工具 331
10.1 宏 332
10.1.2 为缺少的宏参数提供缺省值 334
10.1.1 必需的、缺省的及可变的参数 334
10.1.3 指定可变数目的参数 335
10.1.4 局部标号 335
10.1.5 重复指令 336
10.2 使用FOR处理:VARARG参数 338
10.2.1 其他的宏指令 339
10.2.2 宏函数 341
10.2.3 MASM提供的宏函数 342
10.3 条件汇编指令 343
10.3.2 宏.IF,.ELSEIF,.ELSE和.ENDIF 345
10.3.1 高级语言结构 345
10.3.3 宏.WHILE和.ENDW 347
10.3.4 宏.REPEAT、.UNTIL和.UNTILCXZ 348
10.3.5 宏.BREAK和.CONTINUE 350
10.3.6 由.IF、.ELSEIF、.WHILE和.UNTIL使用的表达式 351
10.3.7 高级指令中的带符号和不带符号比较 353
10.4 包含文件 354
10.5 过程 354
10.5.1 编写过程的步骤 355
10.5.2 为高级语言编写的汇编过程 357
10.5.3 在过程中定义局部变量 365
10.5.4 过程原型以及使用PROTO和INVOKE进行调用 366
10.6 标号和变量的范围 368
10.6.1 公用变量 368
10.6.2 EXTRNDEF指令 369
10.6.3 在目标文件中嵌入库名 369
10.7 小结 369
11.1 汇编特定处理器指令 394
第十一章 代码生成、条件汇编、错误处理和列表 394
11.2 判断处理器类型 395
11.3 在汇编过程中处理错误 396
11.4 列表和注释 397
11.4.1 注释 397
11.4.2 列表 398
11.5 符号表 400
11.6 列出宏扩展和条件块 401
11.6.1 交叉引用 402
11.7 MASM操作符 403
11.7.1 算术操作符 404
11.7.2 关系、逻辑和移位操作符 405
11.7.3 类型说明符 406
11.8 小结 407
第四部分 技巧 433
第十二章 为高级语言编写汇编模块 433
12.1 与Microsoft高级语言进行交互 433
12.1.1 混合语言程序设计速览 433
12.1.4 参数传递约定 436
12.1.3 NEAR或FAR调用 436
12.1.2 命名汇编语言过程 436
12.1.5 返回结果 439
12.1.6 返回前的清除工作 439
12.2 一些实用的技术 439
12.2.1 求助于编译器 439
12.2.2 MASM 5.0中的简化方法 442
12.3 一个实例 444
12.3.1 判断鼠标驱动程序的存在 444
12.3.2 鼠标接口例程 447
12.3.3 汇编语言中的面向对象程序设计 450
12.4 小结 454
第十三章 使用系统资源 455
13.1 检验系统的能力 455
13.1.1 从何处查找信息 456
13.2 8255 PPI或等价物 460
13.3 RT/CMOS RAM 461
13.4 DOS版本号 463
13.5 BIOS数据区 465
13.6.1 如何使用配置信息 466
13.6 获取BIOS配置标志 466
13.7 使用DOS服务 467
13.7.1 访问MS-DOS文件系统 467
13.7.2 文件I/O例程 467
13.7.3 检验文件I/O例程 473
13.8 使用BIOS服务 476
13.8.1 实现设备I/O 476
13.8.2 决定系统配置 477
14.1.1 通讯参数 478
第十四章 使用和控制硬件 478
1 4.1 串行口的中断驱动控制 478
14.1.2 串行口内部结构 479
14.1.3 串行适配器的中断 479
14.1.4 8259A可编程中断控制器 482
14.2 使用汇编语言对串行口编程 483
14.2.1 使用BIOS设置通讯参数 484
14.2.2 取得串行端口地址 484
14.2.3 设置中断驱动的串行I/O 485
14.2.4 处理来自串行端口的中断 486
14.2.5 关闭中断之前的清除工作 488
14.3 一个例子程序 489
14.4 小结 490
第十五章 文本和图形用户接口 498
15.1 PC的显示和适配器 498
15.1.1 IBM PC的适配器和监视器 498
15.1.2 IBM PS/2使用的显示适配器 498
15.2 对显示适配器编程 499
15.2.2 BIOS视频例程 500
15.2.1 内存映象的I/O 500
15.2.3 选择视频模式 501
15.3 文本模式窗口 505
15.3.1 文本属性 505
15.3.2 CGA和雪花现象 505
15.3.3 为文本模式编程判断视频信息 506
15.3.4 低级文本输出例程 507
15.3.5 绘制文本模式的窗口 512
15.3.6 一个例子测试程序 519
15.4 图形程序设计 521
15.4.1 图形内存组织和寻址 522
15.4.2 画点 524
15.4.3 画线 526
15.5 小结 537
第十六章 80386/486程序设计 538
16.1 80386和80486 CPU——快速浏览 538
16.2 首先判断处理器是否为80386/486 540
16.3 32位算术运算 545
16.4 移动32位数据串 548
16.5 初始化表格 549
16.6 寻址4千兆的内存 550
16.7 双字对齐 551
16.8 位扫描 551
16.9 位测试 552
16.10 索引和基寄存器的灵活性 553
16.11 80386/486的其他功能 554
16.12 小结 556
第十七章 优化要点 557
17.1 快速文件处理 559
17.2 小结 560
第五部分 附录 563
附录A ML和LINK命令行选项 563
附录B DEBUG和CodeView的命令及选项 566
附录C MS-DOS数据和控制结构 571
附录D BIOS和DOS中断及其功能 574
附录E EMS功能和错误码 633
附录F MS-DOS错误返回 641
附录G MASM版本 644
附录H 不可打印的ASCII字符定义 656