1.1 怎样使用本手册 1
第一章 概述 1
1.1.1 第一部分——应用和数值程序设计 2
1.1.2 第二部分——系统程序设计 2
1.1.3 第三部分——兼容性 3
1.1.4 第四部分——优化 4
1.1.5 第五部分——指令集 4
1.1.6 附录 4
1.2 有关参考文献 4
1.3 标记法的约定 5
1.3.1 位和字节的次序 5
1.3.2 未定义伍和软件兼容性 6
1.3.3 指令操作数 6
1.3.6 异常 7
1.3.4 十六进制数 7
1.3.5 分段编址 7
第二章 Intel Pentium?处理器系列的简介 9
第一部分 应用和数值程序设计 11
第三章 基本的程序设计模型 11
3.1 存贮器的组织 11
3.1.1 不分段或“平坦”模型 12
3.1.2 分段模型 13
3.2 数据类型 14
3.2 寄存器 17
3.3.1 通用寄存器 17
3.3.2 段寄存器 18
3.3.3 堆栈的实现 20
3.3.4 标志寄存器 22
3.3.5 指令指针 23
3.4 指令格式 23
3.5 操作数的选择 25
3.5.1 立即操作数 25
3.5.2 寄存器操作数 27
3.5.3 存贮器操作数 27
3.6 中断和异常 30
第四章 应用程序设计 32
4.1 数据传送指令 32
4.1.1 通用数据传送指令 32
4.1.2 栈操作指令 33
4.1.3 类型转换指令 35
4.2 二进制算术指令 36
4.2.1 加法指令和减法指令 37
4.2.2 比较指令和改变符号指令 38
4.2.3 乘法指令 38
4.2.4 除法指令 39
4.3 十进制算术指令 40
4.3.1 紧缩BCD调整指令 40
4.3.2 非紧缩BCD调整指令 40
4.4 逻辑指令 41
4.4.1 布尔运算指令 41
4.4.2 位测试和修改指令 41
4.4.3 位扫描指令 42
4.4.4 移位和环移指令 42
4.4.5 按条件字节设置指令 50
4.5.1 无条件转移指令 51
4.4.6 测试指令 51
4.5 控制转移指令 51
4.5.2 条件转移指令 52
4.5.3 软件中断 54
4.6 串操作 55
4.6.1 重复前缀 56
4.6.2 变址和方向标志控制 56
4.6.3 串操作指令 57
4.7 块结构语言用的指令 57
4.8 标志控制指令 61
4.8.1 进位和方向标志控制指令 62
4.8.2 标志传送指令 63
4.10 段寄存器指令 65
4.9 数值指令 65
4.10.1 段寄存器传送指令 66
4.10.2 远控制转移指令 66
4.10.3 数据指针指令 66
4.11 杂项指令 67
4.11.1 地址计算指令 67
4.11.2 空操作指令 68
4.11.3 转换指令 68
4.11.4 字节交换指令 68
4.11.5 交换并相加指令 70
4.11.6 比较并交换指令 70
4.11.7 CPUID指令 70
5.3 CPU标识和FPU检测代码实例 72
5.2 FPU检测 72
5.1 CPU标识 72
第五章 特征确定 72
第六章 数值应用 84
6.1 数值应用概述 84
6.1.1 历史 84
6.1.2 性能 85
6.1.3 使用方便 85
6.1.4 应用 86
6.1.5 程序设计接口 88
6.2 浮点部件的体系结构 89
6.2.1 数值寄存器 89
6.2.2 计算基础知识 98
6.3.1 源操作数和目标操作数 104
6.3 浮点指令集 104
6.3.2 数值传送指令 105
6.3.3 非超越函数指令 105
6.3.4 比较指令 107
6.3.5 超越函数 108
6.3.6 常数指令 109
6.3.7 控制指令 110
6.4 数值应用 111
6.4.1 高级语言 111
第七章 专用计算环境 124
7.1 专用数值 125
7.1.1 非规格化实数 129
7.1.2 零 131
7.1.3 无穷数 134
7.1.4 NaN(非数) 136
7.1.6 数据类型的编码 138
7.1.5 不定数 138
7.1.7 数值异常 139
7.1.8 处理数值异常 139
7.1.9 无效操作 141
7.1.13 不精确(精度) 141
7.1.10 除零 142
7.1.11 非规格化操作数 143
7.1.12 数值上溢及下溢 144
7.1.14 异常处理优先级 147
7.1.15 标准下溢/上溢异常处理程序 147
第八章 数值应用程序设计举例 148
8.1 条件转移举例 148
8.2 异常处理举例 151
8.3 浮点数到ASCII的转换举例 154
8.3.1 功能划分 165
8.3.2 异常情况 166
8.3.3 特殊指令 166
8.3.4 操作说明 166
8.3.5 换算数值 167
8.3.6 输出格式 168
第二部分 系统程序设计 178
第九章 实地址方式系统体系结构 178
9.1 地址变换 178
9.2 寄存器和指令 179
9.3 中断和异常处理 179
9.4 实地址方式的异常 180
10.1 系统寄存器 182
第十章 保护方式系统体系结构概述 182
10.1.2 系统标志 183
10.1.2 存贮器管理寄存器 184
10.1.3 控制寄存器 185
10.1.4 调试寄存器 189
10.2 系统指令 189
第十一章 保护方式的存贮器管理 192
11.1 选择分段模型 193
11.1.1 平面模型 193
11.1.2 带保护的平面模型 194
11.1.3 多段模型 195
11.2 段转换 196
11.2.1 段寄存器 198
11.2.2 段选择符 199
11.1.3 段描述符 200
11.2.4 段描述符表 204
11.2.5 描述符表基地址寄存器 204
11.3 页转换 205
11.3.1 分页选择项 206
11.3.2 线性地址 206
11.3.3 页表 207
11.3.4 页表项 207
11.3.5 翻译后援缓冲器 209
11.4 段和页转换的组合 210
11.4.1 平面模型 210
11.4.2 跨越若干页的段 210
11.4.3 跨越若干段的页 211
11.4.4 不对齐的页和段的边界 211
11.4.6 每一段的页表 212
11.4.5 对齐的段和页的边界 212
第十二章 保护 213
12.1 段级保护 213
12.2 段描述符和保护 214
12.1.1 类型检查 215
12.2.2 段限检查 216
12.2.3 特权级 217
12.3 访问数据的限制 218
12.3.1 访问代码段中的数据 219
12.4 控制转移的限制 220
12.5 门描述符 221
12.5.1 堆栈切换 224
12.5.2 从过程返回 226
12.6.1 特权指令 227
12.6 为操作系统保留的指令 227
12.6.2 敏感指令 228
12.7 指针有效性指令 228
12.7.1 描述特有效性 229
12.7.2 指针完整性和RPL 230
12.8 页级保护 230
12.8.1 保存保护参数的页表项 231
12.8.2 两级页表的组合保护 232
12.8.3 对页保护的超越 232
12.9 页和段保护的组合 233
第十三章 保护方式的多任务处理 234
13.1 任务状态段 234
13.2 TSS描述符 235
13.3 任务寄存器 237
13.4 任务门描述符 238
13.5 任务切换 239
13.6 任务链 242
13.6.1 忙位防止发生循环 243
13.6.2 修改任务的链接 244
13.7 任务地址空间 244
13.7.1 任务的线性空间到物理空间的的映像 244
13.7.2 任务的逻辑地址空间 245
第十四章 保护方式的异常和中断 247
14.1 异常和中断向量 247
14.2 指令重启动 248
14.3 使能和禁止中断 249
14.3.1 NMI屏蔽后继的NMI 249
14.3.2 IF屏蔽INTR 249
14.3.3 RF屏蔽调试故障 250
14.3.4 对SS寄存器的MOV或POP操作屏蔽某些异常和中断 251
14.4 同时发生多个异常和中断时的优先权 251
14.5 中断描述符表 252
14.6 IDT描述符 253
14.7 中断任务和中断过程 253
14.7.1 中断过程 253
14.7.2 中断任务 257
14.8 出错代码 258
14.9 异常条件 258
14.9.1 中断0——除法错误 259
14.9.2 中断1——调试异常 259
14.9.3 中断3——断点 259
14.9.6 中断6——无效操作码 260
14.9.7 中断7——设备不可用 260
14.9.5 中断5——界限检查 260
14.9.8 中断8——双重故障 261
14.9.9 中断9——(Intel保留,不要用) 262
14.9.10 中断10——无效TSS 262
14.9.11 中断11——段不存在 263
14.9.12 中断12——堆栈异常 264
14.9.13 中断13——一般保护 264
14.9.14 中断14——页故障 265
14.9.15 中断16——浮点错 267
14.9.16 中断17——对齐检查 269
14.9.17 中断18——机器检查 270
14.10 异常摘要 270
14.11 出错代码汇总 271
第十五章 输入/输出 272
15.1 I/O寻址 272
15.1.1 I/0地址空间 272
15.1.2 存贮器映像的I/O 273
15.2 I/0指令 274
15.2.1 寄存器I/O指令 274
15.2.2 块I/O指令 275
15.3 保护方式I/O 275
第三部分 兼容性 276
15.3.2 I/O允许位映象 276
第二十一章 混合16位和32位代码 276
15.3.1 I/O特权级 276
15.4 I/O的次序 278
15.3.3 分页和高速缓存 278
第十六章 初始化和方式转换 280
16.1 处理器初始化 280
16.1.1 复位后的处理器状态 280
16.2 FPU初始化 283
16.1.2 执行的首条指令 283
16.2.1 配置数值计算环境 284
16.2.2 FPU软件仿真 286
16.3 高速缓存使能 286
16.4 实地址方式下的软件初始化 287
16.4.1 系统表 287
16.4.2 NMI中断 288
16.5 保护方式下的系统初始化 288
16.5.1 系统表 288
16.5.2 中断 288
16.5.3 分页 288
16.5.4 任务 289
16.6 方式转换 290
16.5.5 TLB、BTB和高速缓存测试 290
16.6.2 转回实地址方式 290
16.6.1 转换到保护方式 290
16.7 初始化和方式转换实例 291
16.7.1 本实例的目标 291
16.7.2 复位后的存贮器布局 291
16.7.3 算法 292
14.9.4 中断4——溢出 293
16.7.4 工具的使用 294
16.7.5 STARTUPASM清单 295
16.7.6 MAMASM源代码 302
16.7.7 支持文件 305
第十七章 调试 307
17.1 调试支持 307
17.2 调试寄存器 308
17.2.1 调试地址寄存器(DR0—DR3) 309
17.2.2 调试控制寄存器(DR7) 309
17.2.4 调试寄存器DR4和DR5 310
17.2.3 调试状态寄存器(DR6) 310
17.2.5 断点字段识别 310
17.3 调试异常 311
17.3.1 中断1——调试异常 312
17.3.2 中断3——断点指令 314
第十八章 高速缓存、流水线和缓冲 315
18.1 内部指令和数据高速缓存 315
18.1.1 数据高速缓存 316
18.1.2 数据高速缓存更新策略 316
18.1.3 指令高速缓存 317
18.2 内部高速缓存的操作 317
18.2.1 高速缓存控制位 317
18.2.2 高速缓存管理指令 318
18.2.3 自修改的代码 319
18.3 页面级高速缓存管理 319
18.3.2 PWT位 320
18.4 地址转换高速缓存 320
18.5 高速缓存替换算法 320
18.3.1 PCD位 320
18.6 执行流水线和配对 321
18.7 写缓冲器 321
18.8 串行化指令 321
第十九章 多处理 323
19.1 锁定的总线周期 323
19.1.1 LOCK前缀和LOCKˉ#信号 324
19.1.2 自动锁定 324
19.2 存贮器访问排序 325
19.3 Pentium处理器(735\90、815\100)的集成的AHC 325
19.3.1 中断控制机制 327
19.3.2 APIC总线和APIC间通信协议 342
19.3.3 APIC中的出错处理 347
19.3.4 定时器 350
19.3.5 APIC有效/无效编程组合 352
19.3.6 软件可见的APIC和82489DX间的差异 353
19.3.7 双处理自举交换信号协议序列及实例 354
第二十章 电源管理 358
20.1 Pentium处理器(510\60、567\66) 358
20.1.1 系统管理方式体系结构简介 358
20.1.2 术语 358
20.1.3 Pentium处理器系统中断的处理 359
20.1.4 系统管理方式编程模型 363
20.1.5 SMM特性 366
20.1.6 Pentium处理器的SMM软件 366
20.1.1 系统管理方式体系结构 370
20.2.2 Pentium处理器(735\90、815\100)的电源管理与Pentium处理器(510\60、567\66)的差异 370
20.2 Pentium处理器(735\90、815\100)的电源管理 370
20.2.3 通过ADIC的系统管理中断 371
20.2.4 I/0指令重启动 371
20.2.5 系统管理方式版本标识符 374
20.2.6 SMM一双处理的考虑 375
21.1 使用16位和32位环境 377
21.2 混合16位和32位操作 377
21.4 在混合尺寸的代码段之间转移控制 378
21.3 在混合尺寸的代码段之间共享数据 378
21.4.1 代码段指针的尺寸 379
21.4.2 用于控制转移的栈管理 381
21.4 3 中断控制的转移 381
21.4.4 参数转换 381
21.4.5 接口过程 381
第二十二章 虚拟8086方式 383
22.1 执行8086 CPU代码 383
22.1.1 寄存器和指令 383
22.1.2 地址转换 384
22.2 虚拟8086任务的结构 385
22.3 进入和离开虚拟8086方式 386
22.2.2 虚拟8086任务内的保护 386
22.2.2 虚拟8086任务的分页 386
22.3.1 通过任务切换转移 388
22.3.2 通过自陷门和中断门转贮 388
22.4 敏感指令 390
22.5 虚拟中断支持 390
22.6 仿真8086操作系统调用 390
22.7 虚拟I/O 391
22.7.1 I/0映射的I/0 391
22.7.2 存贮器映射的I/0 392
22.7.3 特殊I/O缓冲器 392
22.8 和8086 CPU的区别 392
22.9 和Intel286 CPU的区别 395
22.9.1 特权级 395
22.10 和Intel386及Intel486 CPU的区别 396
22.9.2 总线锁定 396
第二十三章 兼容性 397
23.1 保留位 397
23.2 整数部件 397
23.2.1 新功能和方式 398
23.2.2 串行化指令 398
23.2.3 检测新功能的存在 398
23.2.4 未定义操作码 399
23.2.5 时钟周期数 399
23.2.6 初始化和复位 399
23.2.7 新指令 403
23.2.8 过时指令 404
23.2.9 标志 404
23.2.10 控制寄存器 405
23.2.11 调试寄存器 408
23.2.12 测试寄存器 409
23.2.13 型号特定寄存器 409
23.2.14 异常 409
23.2.15 描述符的类型和内容 411
23.2.16 段描述符装入方面的改变 412
23.2.17 任务切换和任务状态段 412
23.2.18 分页 414
23.2.19 栈操作 415
23.2.20 混合16位和32位段 417
23.2.21 段和地址环绕 417
23.2.22 写缓冲器和存贮器排序 418
23.2.23 总线锁定 419
23.2.24 总线保持 419
23.2.25 远行Intel286 CPU任务的两种途径 419
23.3.1 控制寄存器位 420
23.3 浮点部件 420
23.3.2 数据类型 422
23.3.3 异常 423
23.3.4 指令 427
23.3.5 超越函数指令 429
23.3.6 过时的指令 429
第四部分 优化 431
第二十四章 优化 431
24.1 寻址方式和寄存器用法 431
24.2 对齐 433
24.2.1 代码对齐 433
24.2.2 数据对齐 433
24.3 前缀操作码 433
24.5 整数指令选择 434
24.4 操作数和寄存器用法 434
第五部分 指令集 437
第二十五章 指令集 437
25.1 操作数尺寸和地址尺寸属性 437
25.1.1 缺省段属性 437
25.1.2 操作数尺寸和地址尺寸指令前缀 438
25.1.3 堆栈的地址尺寸属性 438
25.2 指令格式 438
25.2.1 modR/M和SIB字节 440
25.2.2 如何阅读指令集 444
附录A 操作码映象 674
A.1 缩写符号的说明 674
A.2 表示寻址方法的代码 674
A.4 寄存器编码 675
A.3 操作数类型的代码 675
A.5 操作码查找的例子 676
A 5.1 一字节的操作码整数指令 676
A 5.2 两字节的操作码整数指令 676
A 5.3 转义操作码 677
附录B 标志速查表 688
B.1 代码的符号说明 688
附录c 状态标志摘要 692
C.1 状态标志功能 692
C.2 代码的符号说明 692
附录D 条件代码 694
D.1 条件的定义 694
附录E 数值异常摘要 696
F.1 整数指令格式和时序 698
附录F 指令格式和时序 698
F.2 I/0指令格式和时序 718
F.3 浮点指令格式和时序 719
F.3.1 格式 719
F.3.2 时钟数 720
F.3.3 注释 720
F.3.4 配对 720
附录G 关于超越函数的报告 725
G.1 概述 725
G.2 准确度、单调性和速度的摘要 726
G.2.1 准确度 726
G.2.2 单调性 726
G.2.3 速度 727
G.3 验证摘要 727
G.4 散布图 728
附录H 高级特性 741