第1章 基本概念 1
1.1 欢迎来到汇编语言的世界 1
1.1.1 一些精彩的提问 2
1.1.2 汇编语言应用程序 4
1.1.3 本节习题 5
1.2 虚拟机的概念 5
1.2.1 PC汇编编译器的历史 7
1.2.2 本节习题 7
1.3 数据的表示方法 8
1.3.1 二进制数 8
1.3.2 二进制加法 10
1.3.3 整数存储的尺寸 10
1.3.4 十六进制整数 11
1.3.5 有符号整数 12
1.3.6 字符的存储 14
1.3.7 本节习题 16
1.4 布尔运算 17
1.4.1 布尔函数的真值表 19
1.4.2 本节习题 20
1.5 本章小结 20
第2章 IA-32处理器体系结构 22
2.1 基本概念 22
2.1.1 微机的基本结构 22
2.1.2 指令执行周期 23
2.1.3 内存的读取 26
2.1.4 程序是如何运行的 27
2.1.5 本节习题 29
2.2 IA-32处理器体系结构 29
2.2.1 操作模式 29
2.2.2 基本执行环境 30
2.2.3 浮点单元 32
2.2.4 Intel微处理器的历史 33
2.2.5 本节习题 34
2.3 IA-32的内存管理 35
2.3.1 实地址模式 35
2.3.2 保护模式 37
2.3.3 本节习题 39
2.4 IA-32微机的构成 39
2.4.1 主板 39
2.4.2 视频输出 40
2.4.3 存储器 41
2.4.4 输入输出接口 41
2.4.5 本节习题 42
2.5 输入输出系统 42
2.5.1 所有这一切是如何工作的 42
2.5.2 本节习题 44
2.6 本章小结 45
第3章 汇编语言基础 47
3.1 汇编语言的基本元素 47
3.1.1 整数常量 47
3.1.2 整数表达式 48
3.1.3 实数常量 48
3.1.4 字符常量 49
3.1.5 字符串常量 49
3.1.6 保留字 49
3.1.7 标识符 49
3.1.8 伪指令 50
3.1.9 指令 50
3.1.10 NOP(空操作)指令 52
3.1.11 本节习题 53
3.2 例子:整数相加减 53
3.2.1 AddSub的另一个版本 55
3.2.2 程序模板 56
3.2.3 本节习题 56
3.3 汇编、链接和运行程序 57
3.3.1 汇编-链接-执行 57
3.3.2 本节习题 59
3.4 定义数据 59
3.4.1 内部数据类型 59
3.4.2 数据定义语句 59
3.4.3 定义BYTE和SBYTE数据 60
3.4.4 定义WORD和SWORD数据 62
3.4.5 定义DWORD和SDWORD数据 62
3.4.6 定义QWORD数据 63
3.4.7 定义TBYTE数据 63
3.4.8 定义实数 63
3.4.9 小尾顺序 64
3.4.10 为AddSub程序添加变量 64
3.4.11 未初始化数据的声明 65
3.4.12 本节习题 65
3.5 符号常量 66
3.5.1 等号伪指令 66
3.5.2 计算数组和字符串的大小 67
3.5.3 EQU伪指令 68
3.5.4 TEXTEQU伪指令 68
3.5.5 本节习题 69
3.6 实地址模式程序设计(可选) 69
3.6.1 基本的修改 69
3.7 本章小结 70
3.8 编程练习 71
第4章 数据传送、寻址和算术运算 72
4.1 数据传送指令 72
4.1.1 简介 72
4.1.2 操作数类型 72
4.1.3 直接内存操作数 73
4.1.4 MOV指令 73
4.1.5 整数的零/符号扩展 74
4.1.6 LAHF和SAHF指令 76
4.1.7 XCHG指令 76
4.1.8 直接偏移操作数 77
4.1.9 例子程序(数据传送) 78
4.1.10 本节习题 78
4.2 加法和减法 79
4.2.1 INC和DEC指令 79
4.2.2 ADD指令 80
4.2.3 SUB指令 80
4.2.4 NEG指令 81
4.2.5 实现算术表达式 81
4.2.6 加法和减法影响的标志 81
4.2.7 例子程序(AddSub3) 85
4.2.8 本节习题 86
4.3 和数据相关的操作符和伪指令 86
4.3.1 OFFSET操作符 87
4.3.2 ALIGN伪指令 87
4.3.3 PTR操作符 88
4.3.4 TYPE操作符 89
4.3.5 LENGTHOF操作符 89
4.3.6 SIZEOF操作符 89
4.3.7 LABEL伪指令 90
4.3.8 本节习题 90
4.4 间接寻址 91
4.4.1 间接操作数 91
4.4.2 数组 92
4.4.3 变址操作数 93
4.4.4 指针 94
4.4.5 本节习题 95
4.5 JMP和LOOP指令 96
4.5.1 JMP指令 96
4.5.2 LOOP指令 97
4.5.3 整数数组求和 98
4.5.4 复制字符串 99
4.5.5 本节习题 99
4.6 本章小结 100
4.7 编程练习 101
第5章 过程 103
5.1 简介 103
5.2 与外部库链接 103
5.2.1 背景知识 103
5.2.2 本节习题 104
5.3 本书附带的链接库 104
5.3.1 概述 104
5.3.2 过程的描述 106
5.3.3 库测试程序 116
5.3.4 本节习题 119
5.4 堆栈操作 119
5.4.1 运行时栈 120
5.4.2 PUSH和POP指令 122
5.4.3 本节习题 124
5.5 过程的定义和使用 124
5.5.1 PROC伪指令 125
5.5.2 CALL和RET指令 126
5.5.3 例子:对整数数组求和 129
5.5.4 流程图 129
5.5.5 保存和恢复寄存器 130
5.5.6 本节习题 132
5.6 使用过程进行程序设计 132
5.6.1 整数求和程序(设计) 132
5.6.2 整数求和程序的实现 134
5.6.3 本节习题 136
5.7 本章小结 136
5.8 编程练习 137
第6章 条件处理 139
6.1 简介 139
6.2 布尔和比较指令 139
6.2.1 CPU的状态标志 140
6.2.2 AND指令 140
6.2.3 OR指令 141
6.2.4 XOR指令 142
6.2.5 NOT指令 143
6.2.6 TEST指令 143
6.2.7 CMP指令 144
6.2.8 设置和清除单个CPU状态标志 145
6.2.9 本节习题 145
6.3 条件跳转 146
6.3.1 条件结构 146
6.3.2 条件跳转(Jcond)指令 146
6.3.3 条件跳转指令的类型 147
6.3.4 条件跳转的应用 151
6.3.5 位测试指令(可选) 154
6.3.6 本节习题 156
6.4 条件循环指令 156
6.4.1 LOOPZ和LOOPE指令 156
6.4.2 LOOPNZ和LOOPNE指令 157
6.4.3 本节习题 157
6.5 条件结构 158
6.5.1 IF块结构语句 158
6.5.2 复合表达式 160
6.5.3 WHILE循环 161
6.5.4 以表格驱动的分支选择 163
6.5.5 本节习题 165
6.6 应用:有限状态机 166
6.6.1 输入字符串的验证 166
6.6.2 有符号整数的验证 167
6.6.3 本节习题 170
6.7 决策伪指令 170
6.7.1 有符号比较和无符号比较 171
6.7.2 复合表达式 172
6.7.3 .REPEAT和.WHILE伪指令 174
6.8 本章小结 175
6.9 编程练习 176
第7章 整数算术指令 179
7.1 简介 179
7.2 移位和循环移位指令 179
7.2.1 逻辑移位和算术移位 180
7.2.2 SHL指令 180
7.2.3 SHR指令 181
7.2.4 SAL和SAR指令 182
7.2.5 ROL指令 182
7.2.6 ROR指令 183
7.2.7 RCL和RCR指令 183
7.2.8 符号溢出 184
7.2.9 SHLD/SHRD指令 184
7.2.10 本节习题 185
7.3 移位和循环移位的应用 186
7.3.1 多双字移位 186
7.3.2 二进制乘法 187
7.3.3 显示二进制数的数据位 187
7.3.4 分离MS-DOS文件的各个日期域 188
7.3.5 本节习题 188
7.4 乘法和除法指令 189
7.4.1 MUL指令 189
7.4.2 IMUL指令 190
7.4.3 乘法操作的基准(性能)测试 192
7.4.4 DIV指令 192
7.4.5 有符号整数除法 193
7.4.6 算术表达式的实现 195
7.4.7 本节习题 196
7.5 扩展加法和减法 197
7.5.1 ADC指令 197
7.5.2 扩展加法的例子 198
7.5.3 SBB指令 199
7.5.4 本节习题 199
7.6 ASCII和未压缩十进制算术指令 200
7.6.1 AAA指令 201
7.6.2 AAS指令 202
7.6.3 AAM指令 202
7.6.4 AAD指令 203
7.6.5 本节习题 203
7.7 压缩十进制算术指令 203
7.7.1 DAA指令 204
7.7.2 DAS指令 205
7.7.3 本节习题 205
7.8 本章小结 205
7.9 编程练习 206
第8章 高级过程 208
8.1 简介 208
8.2 堆栈框架 208
8.2.1 堆栈参数 209
8.2.2 局部变量 216
8.2.3 ENTER和LEAVE指令 219
8.2.4 LOCAL伪指令 220
8.2.5 过程WriteStackFrame 223
8.2.6 本节习题 224
8.3 递归 225
8.3.1 递归求和 225
8.3.2 计算阶乘 226
8.3.3 本节习题 228
8.4 .MODEL伪指令 229
8.4.1 语言选项关键字 229
8.4.2 本节习题 231
8.5 INVOKE,ADDR,PROC和PROTO(可选) 231
8.5.1 INVOKE伪指令 231
8.5.2 ADDR操作符 232
8.5.3 PROC伪指令 232
8.5.4 PROTO伪指令 235
8.5.5 参数分类 237
8.5.6 例子:交换两个整数 238
8.5.7 调试疑难提示 239
8.5.8 本节习题 239
8.6 创建多模块程序 240
8.6.1 过程名的隐藏和导出 240
8.6.2 调用外部过程 241
8.6.3 跨越模块的边界使用变量和符号 241
8.6.4 例子:ArraySum程序 242
8.6.5 使用ENTERN创建模块 243
8.6.6 使用INVOKE和PROTO创建模块 246
8.6.7 本节习题 248
8.7 本章小结 248
8.8 编程练习 249
第9章 字符串和数组 251
9.1 简介 251
9.2 基本字符串操作指令 251
9.2.1 MOVSB,MOVSW和MOVSD指令 252
9.2.2 CMPSB,CMPSW和CMPSD指令 253
9.2.3 SCASB,SCASW和SCASD指令 255
9.2.4 STOSB,STOSW和STOSD指令 255
9.2.5 LODSB,LODSW和LODSD指令 256
9.2.6 本节习题 256
9.3 精选的字符串过程 257
9.3.1 Str_compare过程 257
9.3.2 Str_length过程 258
9.3.3 Str_copy过程 258
9.3.4 Str_trim过程 259
9.3.5 Str_ucase过程 260
9.3.6 字符串库演示程序 261
9.3.7 本节习题 263
9.4 二维数组 263
9.4.1 行和列的顺序 263
9.4.2 基址变址操作数 263
9.4.3 相对基址变址操作数 265
9.4.4 本节习题 266
9.5 整数数组的查找和排序 266
9.5.1 冒泡排序法 266
9.5.2 二分查找 268
9.5.3 本节习题 274
9.6 本章小结 274
9.7 编程练习 275
第10章 结构和宏 279
10.1 结构 279
10.1.1 定义结构 279
10.1.2 声明结构变量 281
10.1.3 引用结构变量 282
10.1.4 例子:显示系统时间 284
10.1.5 结构的嵌套 286
10.1.6 例子:醉汉走路 286
10.1.7 联合的声明和使用 289
10.1.8 本节习题 291
10.2 宏 292
10.2.1 概述 292
10.2.2 宏的定义 292
10.2.3 宏的调用 293
10.2.4 宏的其他特性 294
10.2.5 使用本书附带的宏库 297
10.2.6 例子程序:封装 302
10.2.7 本节习题 303
10.3 条件汇编伪指令 304
10.3.1 检查缺少的参数 305
10.3.2 默认的参数初始化值 306
10.3.3 布尔表达式 306
10.3.4 IF,ELSE和ENDIF伪指令 306
10.3.5 IFIDN和IFIDNI伪指令 307
10.3.6 例子:对矩阵行求和 308
10.3.7 特殊操作符 310
10.3.8 宏函数 313
10.3.9 本节习题 314
10.4 定义重复块 315
10.4.1 WHILE伪指令 315
10.4.2 REPEAT伪指令 316
10.4.3 FOR伪指令 316
10.4.4 FORC伪指令 317
10.4.5 例子:链表 318
10.4.6 本节习题 319
10.5 本章小结 320
10.6 编程练习 320
第11章 MS-Windows程序设计 323
11.1 Win32控制台编程 323
11.1.1 背景知识 324
11.1.2 Win32控制台函数 327
11.1.3 显示消息框 328
11.1.4 控制台输入 330
11.1.5 控制台输出 335
11.1.6 文件的读写 337
11.1.7 Irvine32库的文件I/O过程 341
11.1.8 测试文件I/O过程 342
11.1.9 控制台窗口的操作 345
11.1.10 光标的控制 348
11.1.11 文本颜色的控制 348
11.1.12 时间和日期函数 350
11.1.13 本节习题 353
11.2 编写Windows图形界面应用程序 354
11.2.1 必须了解的数据结构 354
11.2.2 MessageBox函数 356
11.2.3 WinMain过程 356
11.2.4 WinProc过程 356
11.2.5 ErrorHandler过程 357
11.2.6 程序清单 357
11.2.7 本节习题 361
11.3 动态内存分配 362
11.3.1 堆测试程序 364
11.3.2 本节习题 367
11.4 IA-32内存管理 367
11.4.1 线性地址 368
11.4.2 页面地址转换 371
11.4.3 本节习题 372
11.5 本章小结 373
11.6 编程练习 374
第12章 高级语言接口 376
12.1 简介 376
12.1.1 约定 376
12.1.2 本节习题 377
12.2 内联汇编代码 377
12.2.1 Microsoft Visual C++中的__asm伪指令 377
12.2.2 文件加密的例子 380
12.2.3 本节习题 382
12.3 在保护模式下与C++程序链接 383
12.3.1 使用汇编语言优化C++代码 383
12.3.2 调用C和C++函数 388
12.3.3 乘法表的例子 390
12.3.4 调用C库函数 393
12.3.5 目录列表程序 395
12.3.6 本节习题 396
12.4 在实地址模式下与C/C++程序链接 396
12.4.1 与Borland C++程序链接 397
12.4.2 例子:ReadSector 397
12.4.3 例子:大随机整数 401
12.4.4 本节习题 402
12.5 本章小结 402
12.6 编程练习 403
第13章 16位MS-DOS程序设计 405
13.1 MS-DOS和IBM-PC 405
13.1.1 内存组织 405
13.1.2 重定向输入输出 407
13.1.3 软件中断 407
13.1.4 INT指令 408
13.1.5 16位程序的编写 409
13.1.6 本节习题 409
13.2 MS-DOS功能调用(INT 21h) 410
13.2.1 精选的输出功能调用 411
13.2.2 例子程序:Hello World 413
13.2.3 精选的输入功能调用 414
13.2.4 日期/时间功能调用 417
13.2.5 本节习题 420
13.3 标准MS-DOS文件I/O服务 420
13.3.1 创建或打开文件(716Ch) 421
13.3.2 关闭文件句柄(3Eh) 423
13.3.3 移动文件指针(42h) 423
13.3.4 获取文件创建的日期和时间 423
13.3.5 精选的库例程 424
13.3.6 例子:读取并复制文本文件 425
13.3.7 读取MS-DOS命令行 427
13.3.8 例子:创建二进制文件 429
13.3.9 本节习题 432
13.4 本章小结 432
13.5 练习题 433
第14章 磁盘基础知识 435
14.1 磁盘存储系统 435
14.1.1 磁道、柱面和扇区 436
14.1.2 磁盘分区(卷) 437
14.1.3 本节习题 438
14.2 文件系统 438
14.2.1 FAT12 439
14.2.2 FAT16 440
14.2.3 FAT32 440
14.2.4 NTFS 440
14.2.5 磁盘的基本区域 441
14.2.6 本节习题 442
14.3 磁盘目录 442
14.3.1 MS-DOS目录结构 443
14.3.2 MS-Windows中的长文件名 445
14.3.3 文件分配表(FAT) 446
14.3.4 本节习题 447
14.4 读写磁盘扇区(7305h) 447
14.4.1 扇区显示程序 448
14.4.2 本节习题 452
14.5 系统级文件功能调用 452
14.5.1 获取磁盘剩余空间(7303h) 453
14.5.2 创建子目录(39h) 455
14.5.3 删除子目录(3Ah) 455
14.5.4 设置当前目录(3Bh) 456
14.5.5 获取当前目录(47h) 456
14.5.6 获取/设置文件属性(7143h) 456
14.5.7 本节习题 457
14.6 本章小结 457
14.7 编程练习 458
第15章 BIOS程序设计 460
15.1 简介 460
15.1.1 BIOS数据区 460
15.2 INT 16h键盘中断 461
15.2.1 键盘是如何工作的 462
15.2.2 INT 16h功能调用 462
15.2.3 本节习题 467
15.3 INT 10h视频程序设计 467
15.3.1 背景知识 467
15.3.2 色彩的控制 469
15.3.3 INT 10h视频功能调用 470
15.3.4 库过程中的例子 479
15.3.5 本节习题 480
15.4 使用INT 10h绘图 481
15.4.1 和像素相关的INT 10h功能调用 481
15.4.2 画线程序 482
15.4.3 笛卡儿坐标程序 483
15.4.4 把笛卡儿坐标转换为屏幕坐标 486
15.4.5 本节习题 486
15.5 内存映射图形 487
15.5.1 模式13h:320×200,256色 487
15.5.2 内存映射图形程序 488
15.5.3 本节习题 491
15.6 鼠标程序设计 491
15.6.1 鼠标INT 33h功能调用 491
15.6.2 鼠标跟踪程序 495
15.6.3 本节习题 499
15.7 本章小结 500
15.8 练习题 501
第16章 高级MS-DOS程序设计 503
16.1 简介 503
16.2 定义段 503
16.2.1 简化段定义伪指令 504
16.2.2 显式段定义 505
16.2.3 段超越前缀 508
16.2.4 段的组合 508
16.2.5 本节习题 510
16.3 程序的运行时结构 510
16.3.1 程序段前缀 511
16.3.2 COM程序 511
16.3.3 EXE程序 513
16.3.4 本节习题 514
16.4 中断处理 514
16.4.1 硬件中断 515
16.4.2 中断控制指令 517
16.4.3 编写中断处理例程 517
16.4.4 内存驻留程序 519
16.4.5 应用:程序No_Reset 520
16.4.6 本节习题 523
16.5 使用I/O端口控制硬件 523
16.5.1 输入输出端口 524
16.5.2 PC声音程序 524
16.6 本章小结 525
第17章 浮点处理和指令编码 527
17.1 浮点二进制表示 527
17.1.1 IEEE二进制浮点数的表示 527
17.1.2 指数 529
17.1.3 二进制浮点数的正规化 529
17.1.4 IEEE表示法 529
17.1.5 把十进制分数转换为二进制实数 531
17.1.6 本节习题 532
17.2 浮点单元 533
17.2.1 浮点寄存器栈 533
17.2.2 近似 535
17.2.3 浮点异常 536
17.2.4 浮点指令集 537
17.2.5 算术运算指令 539
17.2.6 浮点值的比较 542
17.2.7 读写浮点值 545
17.2.8 异常的同步 546
17.2.9 代码示例 547
17.2.10 混合模式算术运算 548
17.2.11 屏蔽和未屏蔽的异常 549
17.2.12 本节习题 550
17.3 Intel指令编码 551
17.3.1 IA-32指令的格式 551
17.3.2 单字节指令 552
17.3.3 立即操作数送寄存器 552
17.3.4 寄存器模式指令 553
17.3.5 IA-32的操作数尺寸前缀 554
17.3.6 内存模式指令 555
17.3.7 本节习题 557
17.4 本章小结 558
17.5 编程练习 559
附录A MASM参考手册 562
附录B IA-32指令集 582
附录C BIOS和MS-DOS中断 611
附录D 习题答案 619