第一章 i486TM处理器简介 2
1.1 本手册的编排 2
1.1.1 第一部分——应用程序设计 2
1.1.2 第二部分——系统程序设计 2
目录 2
1.1.3 第三部分——数值处理 3
1.1.4 第四部分——兼容性 3
1.1.5 第五部分——指令集 4
1.1.6 附录部分 4
1.2 参考文献 4
1.3 有关约定 5
1.3.1 位和字节顺序 5
1.3.2 未定义的位和软件兼容性 5
1.3.5 分段寻址 6
1.3.6 异常 6
1.3.4 十六进制数 6
1.3.3 指令的操作数 6
第一部分 应用程序设计 8
第二章 基本程序设计模式 8
2.1 内存组织 8
2.1.1 未分段或“平板”模式 9
2.1.2 分段模式 9
2.2 数据类型 9
2.3 寄存器 11
2.3.1 通用寄存器 13
2.3.2 段寄存器 15
2.3.3 栈的实现 16
2.4 指令格式 19
2.5 操作数的选择 20
2.5.1 立即操作数 21
2.5.2 寄存器操作数 22
2.5.3 内存操作数 23
2.6 中断和异常 24
3.1.1 通用数据传送指令 28
第三章 应用程序设计 28
3.1 数据传送指令 28
3.1.2 栈操作指令 29
3.1.3 类型转换指令 29
3.2 二进制算术指令 31
3.2.1 加法和减法指令 32
3.2.2 比较和符号转换指令 33
3.2.3 乘法指令 33
3.2.4 除法指令 34
3.3 十进制算术指令 34
3.3.1 压缩BCD的调节指令 34
3.3.2 非压缩BCD调节指令 35
3.4 逻辑指令 35
3.4.1 布尔运算指令 35
3.4.2 位测试和修改指令 36
3.4.3 位扫描指令 36
3.4.4 移位和循环移位指令 36
3.4.5 字节的条件设置指令 44
3.4.6 测试指令………………………………………………………………………(44 )3.5 转移控制指令 45
3.5.1 无条件转移指令 45
3.5.2 条件转移指令 46
3.5.3 软件中断 47
3.6 串运算 48
3.6.1 重复前缀 49
3.6.2 变址和方向标志控制 49
3.6.3 串指令 49
3.7 用于块结构语言的指令 50
3.8 标志控制指令 54
3.8.1 进位和方向标志控制指令 55
3.8.2 标志转移指令 55
3.9 数值指令 56
3.10 段寄存器指令 56
3.10.1 段寄存器转移指令 57
3.11.1 地址计算指令 58
3.11 其它指令 58
3.10.2 远转移控制指令 58
3.10.3 数据指针指令 58
3.11.2 空操作指令 59
3.11.3 变换指令 59
3.11.4 字节交换指令 59
3.11.5 交换及相加指令 60
3.11.6 比较并交换指令 60
第二部分 系统程序设计 64
第四章 系统体系结构 64
4.1 系统寄存器 64
4.1.1 系统标志 64
4.1.2 内存管理寄存器 66
4.1.3 控制寄存器 66
4.1.4 调试寄存器 68
4.2 系统指令 69
5.1.1 平板模式 73
第五章 内存管理 73
5.1 选择分段模式 73
5.1.2 受保护的平板模式 74
5.1.3 多段模式 74
5.2 段的转换 75
5.2.1 段寄存器 75
5.2.2 段选择子 76
5.2.3 段描述子 78
5.2.4 段描述子表 82
5.2.5 描述子表基址寄存器 82
5.3 页式转换 83
5.3.1 PG位开放页机构 84
5.3.2 线性地址 85
5.3.3 页表 85
5.3.4 页表项 85
5.4.1 平板模式 87
5.4.2 跨越多页的段 87
5.4 组合的段页式转换 87
5.3.5 转换旁视缓冲器 87
5.4.3 跨越多段的页 88
5.4.4 对齐的段页边界 88
5.4.5 每段一个页表 88
第六章 保护 90
6.1 段一级的保护 90
6.2 段描述子和保护 90
6.2.1 类型检查 91
6.2.2 限长检查 92
6.2.3 特权级 93
6.3 限制数据的存取 94
6.3.1 存取代码段中的数据 95
6.4 限制控制的转移 96
6.5 门描述子 97
6.5.1 任务切换 99
6.5.2 过程的返回 101
6.6.1 特权指令 103
6.6 操作系统保留的指令 103
6.6.2 敏感指令 104
6.7 用于检查的指令 104
6.7.1 描述子的合法性 105
6.7.2 指针完整性和RPL 105
6.8 页面保护 106
6.8.1 页表项包括保护参数 106
6.8.2 两级页表的组合保护 107
6.9 段和页的组合保护 108
6.8.3 页保护的超越情况 108
第七章 多任务 109
7.1 任务状态段 109
7.2 TSS描述子 110
7.3 任务寄存器 110
7.4 任务门描述子 111
7.5 任务切换 112
7.6 任务连接 116
7.6.1 忙位阻止循环 117
7.7 任务地址空间 118
7.7.1 任务线性物理空间 118
7.6.2 修改任务的连接状态 118
7.7.2 任务逻辑地址空间 119
第八章 输入输出 120
8.1 I/O寻址 120
8.1.1 I/O地址空间 120
8.1.2 内存映象I/O 121
8.2 I/O指令 122
8.2.1 寄存器I/O指令 122
8.3.1 I/O特权级 123
8.2.2 块I/O指令 123
8.3 保护与I/O 123
8.3.2 I/O权限位映象 124
第九章 异常与中断 126
9.1 异常和中断向量 126
9.2 指令再启动 127
9.3.4 对SS进行MOV、POP可屏蔽某些异常和中断 128
9.3.3 RF屏蔽调试故障 128
9.3.1 NMI屏蔽多重不可屏蔽中断 128
9.3.2 IF屏蔽INTR中断 128
9.3 开放与关闭中断 128
9.4 异常和中断的优先级 129
9.5 中断描述子表 129
9.6 IDT描述子 130
9.7 中断门和中断处理 131
9.7.1 中断过程 131
9.7.2 中断任务 133
9.8 错误代码 134
9.9 异常条件 135
9.9.1 中新0——除法错 135
9.9.2 调试异常 136
9.9.3 中断3——断点 136
9.9.4 中断4——溢出 136
9.9.6 中断6——非法操作码 137
9.9.7 中断7——设备不可用 137
9.9.5 中断5——界限检查 137
9.9.8 中断8——双故障 138
9.9.9 中断9——Intel保留 139
9.9.10 中断10——非法TSS 139
9.9.11 中断11——段不存在 140
9.9.12 中断12——栈异常 141
9.9.13 中断13——通用保护 141
9.9.14 中断14——页故障 142
9.9.15 中断16——浮点错误 143
9.9.16 中断17——对齐检查 143
9.10 异常小结 144
9.11 错误代码小结 145
第十章 初始化 147
10.1 初始化后处理器的状态 147
10.2 实方式下软件初始化 148
10.2.4 开放高速缓存 149
10.2.3 ?条指令 149
10.2.1 系统表 149
10.2.2 NMI中断 149
10.3 切换至保护方式 150
10.3.1 系统表 150
10.3.2 NMI中断 150
10.3.3 PE位 150
10.4 保护方式下的软件初始化 150
10.4.1 分段 150
10.5 TLB测试 151
10.5.1 TLB结构 151
10.4.3 任务 151
10.4.2 分页 151
10.5.2 测试寄存器 152
10.5.3 测试操作 153
10.6 高速缓存(Chache)测试 154
10.6.1 Cache结构 154
10.6.2 测试寄存器 155
10.7 初始化举例 157
11.2 调试寄存器 163
11.1 调试支持 163
第十一章 调试 163
11.2.1 调试地址寄存器(DR0~DR3) 164
11.2.2 调试控制寄存器(DR7) 164
11.2.3 调试状态寄存器(DR6) 165
11.2.4 断点域识别 165
11.3 调试异常 165
11.3 1 中断1——调试异常 166
11.3.2 中断3——断点指令 168
12.1 高速缓存介绍 169
第十二章 高速缓存Cache 169
12.2 内部Cache操作 170
12.2.1 Cache禁止位 170
12.2.2 Cahce管理指令 170
12.2.3 自身修改代码 170
12.3 页级Cache管理 171
12.3.1 Cache管理位 171
13.1.1 LOCK前缀和LOCK#信号 172
13.1 锁定和伪锁定的总线周期 172
第十三章 多机处理 172
13.1.2 自动锁定 173
13.1.3 伪锁…………………………………………………………………………(173 )第三部分 数值处理第十四章 数值应用程序介绍14.1 历史 175
14.2 性能 175
14.3 应用简便性 176
14.4 应用程序 177
14.5 程序设计接口 178
15.1.1 FPU寄存器栈 181
15.1 数值寄存器 181
第十五章 浮点部件的结构 181
15.1.2 FPU状态字 182
15.1.3 控制字 184
15.1.4 FPU标记字 185
15.1.5 数值指令和数据指针 186
15.2 计算基础 187
15.2.1 数字系统 187
15.2.2 数据类型和格式 188
15.2.3 舍入控制 192
15.2.4 精度控制 193
第十六章 特殊的计算情况 194
16.1 特殊的数值 194
16.1.1 浮点实数 194
16.1.2 零 198
16.1.3 无穷数 200
16.1. 4 NaN(“不是数”) 202
16.1.7 未支持的格式 204
16.1.6 数据类型的编码形式 204
16.1.5 不定数 204
16.2 数值异常 208
16.2.1 处理数值异常 209
16.2.2 非法运算 210
16.2.3 除零 211
16.2.4 非规格化操作数 212
16.2.5 算术上溢和下溢 212
16.2.6 非精确(精度) 214
16.2.8 标准上溢/下溢异常处理程序 215
16.2.7 异常的优先级 215
第十七章 浮点指令集 216
17.1 目的操作数和源操作数 216
17.2 数据传送指令 216
17.3 基本算术指令 217
17.4 比较指令 218
17.5 超越数指令 219
17.6 常数指令 220
17.7 控制指令 220
第十八章 数值应用程序 222
18.1 编程工具 222
18.1.1 高级语言 222
18.1.2 C程序 222
18.1.3 PL/M—386/486 222
18.1.4 ASM386/486 224
18.1.5 示范程序 227
18.2 并发处理 231
18.2.1 并发的管理 232
第十九章 系统一级的考虑 234
19.1 体系结构 234
19.1.1 独立的寻址方式 234
19.2 处理器的初始化和控制 234
19.2.1 系统的初始化 234
19.2.2 设置数值环境 234
19.2.3 初始化FPU 235
19.2.4 仿真 235
19.2.5 处理数值异常 236
19.2.6 响应多重异常 236
19.2.7 异常恢复示例 236
第二十章 数值示范程序 238
20.1 条件分支程序 238
20.2 异常处理程序 238
20.3 浮点数到ASCII码的转换程序 242
20.3.1 功能划分 242
20.3.2 对异常的考虑 243
20.3.3 特殊指令 257
20.3.4 操作的描述 257
20.3.5 数值的调节 257
20.3.6 输出格式 258
20.4 三角运算程序 258
第四部分 兼容性 270
第二十一章 运行80286和386DX或SX CPU程序 270
21.1 运行80286CPU任务的两种方式 270
21.2 与80286CPU的差别 270
21.2.1 24位物理地址空间的环绕 270
21.2.2 段描述子的保留字 271
21.2.3 新段描述子类型代码 271
21.2.4 限制LOCK前缀的语义 271
21.2.5 增加的异常 271
21.3 与386TMCPU的差别 271
21.3.5 新的页表项位 272
21.3.4 新的控制寄存器位 272
21.3.6 装入段描述子时的变化 272
21.3.2 新的异常 272
21.3.1 新的标志 272
21.3.3 新的指令 272
第二十二章 实地址方式 273
22.1 地址的形式 273
22.2 寄存器和指令 274
22.3 中断和异常处理 274
22.4 进入和退出实地址方式 275
22.4.1 进入保护方式 275
22.5 返回实地址方式 275
22.6 实地址方式异常 276
22.7 与8086CPU的差别 277
22.8.3 通用寄存器的初始值 280
22.8.5 与算述协处理器的差别 280
22.8.4 总线保持 280
22.8.1 总线锁定 280
22.8 与80286CPU实地址方式的差别 280
22.8.2 指令的存贮位置 280
22.9 与386TMDX CPU实方式的差别 281
22.10 处理器类型检测代码 281
第二十三章 虚拟8086方式 282
23.1 运行8086CPU代码 282
23.1.1 寄存器和指令 282
23.2 V—8086任务的结构 283
23.1.2 地址转换 283
23.2.1 V—8086任务的分页 284
23.2.2 V—8086任务的保护 284
23.3 进入和退出V—8086方式 285
23.3.1 通过任务切换的转移 286
23.3.2 通过陷井门和中断门的转移 286
23.4 补充的敏感指令 287
23.4.1 仿真8086操作系统调用 287
23.5.2 存储映象的I/O 288
23.5.1 I/O映象的I/O 288
23.4.2 仿真可中断标志位 288
23.5 虚拟I/O 288
23.5.3 特殊I/O缓冲区 289
23.6与 8086CPU的区别 289
23.7 与实地址方式下的80286CPU的区别 291
23.7.1 特权级 291
23.7.2 总线封锁 291
23.8 与386TMDX和SX CPU的区别 292
第十四章 混合16位和32位的代码 293
24.1 使用16位和32位环境 293
24.2 混合16位和32位的操作 294
24.3 混合长度代码段中数据的共享 294
24.4 混合长度代码段中的控制转移 295
24.4.1 代码段指针的长度 295
24.4.2 控制转移的栈管理 295
24.4.4 参量转换 297
24.4.5 接口过程 297
24.4.3 中断控制转移 297
第二十五章 与387、80287和8087协处理器的兼容性 299
25.1 与386TMCPU/387TMNPX系统的区别 299
25.2 与80286/80287系统的区别 300
25.2.1 数据类型与异常处理 300
25.2.2 特征字、状态字与控制字 304
25.2.3 指令设置 306
25.3 与8086/8087系统的区别 309
26.1.1 缺省段属性 312
26.1.2 操作数长度和地址长度指令前缀 312
第五部分 i486指令集 312
26.1 操作数的地址长度属性 312
第二十六集 指令集 312
26.1.3 堆栈的地址长度属性 313
26.2 指令格式 313
26.2.1 ModR/M和SIB字节 314
26.2.2 如何阅读指令集 318
AAA 325
ADD 326
AAM 327
AAS 327
ADC 328
ADD 329
AND 330
ARPL 330
BOUND 331
BSF 332
BSR 333
BSWAP 334
BT 334
BTC 335
BTR 336
PTS 337
CALL 339
CBW/CWDE 342
CLD 343
CLC 343
CLI 344
CLTS 344
CMC 345
CMP 345
CMPS/CMPSB/CMPSD 346
CMPXCHG 348
DAA 349
CWD/CDC 349
DAS 350
DEC 351
DIV 351
ENTER 352
F2XM1 354
FABS 354
FADD/FADDP/FLADD 355
FBLD 356
FBSTP 356
FCLEX/FNCLEX 357
FCH3 357
FCOM/FCOMP/FCMPP 358
FCOS 359
FDECSTP 360
FDIV/FDIVP/FIDIV 361
FDIVR/FDIVPR/FIDIVR 362
FFREE 362
FICOM/FICOMP 363
FILD 364
FINIT/FNINIT 365
FINCSTP 365
FIST/FISTP 366
FLD 367
FLDI/FLD2F/FLD2E 368
FLDPI/FLDG2/FLDLN2/FLDZ 368
FLDCW 369
FLDENV 369
FMUL/FMULP/FIMUL 370
FNOP 371
FPATAN 371
FPREM1 373
F?TAN 374
F?NDINT 375
FRSTOR 376
F?AVE/FNSAVE 376
FSCALE 377
FSIN 378
FSINCOS 379
FSQRT 380
FST/FSTP 380
FSTCW/FNSTCW 381
FSTENV/FNSTENV 382
FSTSW/FNSTSW 383
FSUB/FSUBP/FISUB 384
FSUBR/FSUBPR/FISUBR 385
FUCOM/FUCOMP/FUCOMPP 385
FWAIT 387
FXAM 388
FXCH 388
FXTRACT 389
FYL2X 390
FYL2XP1 391
HLT 392
IDIV 392
IMUL 393
IN ……………………………………(?) 396
INC 396
INS/INSB/INSW/INSD 396
INT/INTO 398
INVD 400
INVLPG 401
IRET/IRETD 403
Jcc 408
JMP 411
LAHF 415
LAR 415
LEA 416
LEAVE 418
LGDT/LIDT 418
LGS/LSS/LDS/LES/LFS 420
LLDT…………………………………( 421 ) 422
LMSW 422
LOCK 423
LODS/LOSB/LODSW/LODSD 424
LOOP/LOOPcond 425
LSL 426
LTR 427
MOV 429
MOV 430
MOVSW/MOVSD 431
MOVS/MOVSB/ 431
MOVSX 433
MOVZX 433
MUL 434
NEG 435
NOP 435
NOT 436
OR 437
OUT 438
OUTS/OUTSB/ 439
OUTSW/OUTSD 439
POP 440
POPA/POPAD 442
POPF/POPFD 443
PUSH 444
PUSHA/PUSHAD 445
PUSHF/PUSHFD 446
RCL/RCR/ROR 447
REP/REPE/PEPZ/ 449
REPNE/REPNZ 449
RET 451
SAHF 454
SAL/SAR/SHL/SHR 455
SBB 457
SCAS/SCASB/SCASW/SCASD 458
SETcc 459
SGDT/SIDT 460
SHLD 461
SHRD 462
SLDT 463
SMSW 464
STD 465
STI 465
STC 465
STOS/STOSB/STOSW/STOSD 466
STR 467
SUB 468
TEST 470
VERR/VERW 470
WAIT 471
WBINVD 472
XADD 473
XCHG 474
XLAT/XLATB 474
XOR 475
A.2 编址方式的代码 477
A.1 缩写的关键 477
A.3 操作数类型的代码 477
附录A 操作码映象 477
A.4 寄存器代码 478
附录B 标志交叉引用 483
B.1 编码关键 483
C.1 状态标志 485
C.2 编码关键 485
附录C 状态标志归纳 485
附录D 条件代码 487
D.1 条件的定义 487
附录G 代码优化 500
附录F 数字异常小结 500
G.1 录址方式 500
附录E 指令格式与时序 500
G.2 预取单元 501
G.3 缓存和代码定位 501
G.4 NOP指令 502
G.5 整数指令 503
G.6 条件代码 504
G.7 串指令 505
G.8 浮点指针指令 505
G.10 时钟覆盖 506
G.11 杂项用法准则 506
G.9 前缓操作码 506
FPREM 3372