第一部分 编程工具和编程环境 1
第一章 编程工具 2
1.0 引言 2
1.1 程序开发硬件 2
1.2 参考资料 2
1.3 软件工具 3
1.3.1 文本编辑器 3
1.3.2 汇编器 3
1.3.3 连接器 4
1.3.4 库和库设备 4
1.3.4.1 Microsoft PASCAL和FORTRAN数学库 5
1.3.4.2 Intel 8087模拟器和支持库 7
1.3.4.3 其它库 7
1.3.5 调试程序 7
1.3.6 辅助设备 8
1.4 选择开发系统 8
1.4.1 Microsoft宏汇编器(Microsoft Macro Assembler) 8
1.4.2 Intel ASM86 9
1.5 软件工程 9
1.5.1 程序开发的阶段 10
1.5.1.1 定义及资源分配 10
1.5.1.2 程序设计 10
1.5.1.3 程序编码 11
1.5.1.4 程序文档 11
1.5.1.5 正确性检验 13
1.5.2 工程技术 15
1.5.2.1 模块化 15
1.5.2.2 标准化 15
1.5.2.3 程序流程图 16
第二章 程序环境 18
2.0 引言 18
2.1 内存结构 18
2.1.1 内存空间 18
2.1.2 物理地址计算 19
2.2 程序驻留 19
2.2.1 段式内存 19
2.2.2 逻辑地址 20
2.2.3 附加段寄存器 21
2.2.4 例外段分配 22
2.2.5 重新定位和装入 26
2.3 程序结构 26
2.3.1 惯用的段定义 26
2.3 2 SEGMENT和ENDS指令 28
2.3.3 ASSUME指令 29
2.3.4 GROUP指令 30
2.3.5 程序设计考虑因素 31
2.4 共同驻留的软件 32
2.4.1 回避系统软件 33
2.4.2 IBM的内存映射 33
2.4.3 IBM BIOS 33
2.4.4 自举加载器 35
2.4.5 DOS 36
2.4.6 兼容性问题 36
2.5 生成一个定制的系统 37
2.5.1 回避DOS 37
2.5.2 定制自举加载器 38
2.5.3 配置系统盘 40
第三章 对硬件编程 44
3.1 微处理器 44
3.1.1 8086/8088处理器家族 44
3.1.2 8087数学协处理器家族 45
3.2 中断 46
3.2.1 中断机构 46
3.2.2 中断向量表 47
3.2.3 获取中断控制 49
3.2.4 MS DOS下的中断 51
3.2.5 保护安装的中断 52
3.2.6 设置段寄存器 53
3.2.7 截取执行 55
3.2.8 中断处理与优先级 57
3.2.9 外部中断 57
3.2.10 PS/2系统上的中断共享 60
3.3 其它可编程组件 60
3.3.1 8255可编程外围界面(PPI) 61
3.3.2 系统定时器 61
3.3.2.1 访问系统定时器 62
3.3.2.2 再编程定时器 66
3.3.3 对扬声器的输出 78
第二部分 编程技术 85
第四章 文本管理 86
4.1 文本处理 86
4.1.1 字符代码 86
4.1.2 控制码 87
4.1.3 文本文件块 88
4.2 文本编辑器的结构 88
4.2.1 文本缓冲区 88
4.2.2 嵌入控制码 89
4.2.3 终止符字节 89
4.2.4 位移字节 92
4.2.5 其它控制字符 95
4.2.6 用控制码给文本定块 95
4.2.7 以行为基础和以屏幕为基础的编辑器 98
4.3 文本文件管理 98
4.3.1 文本文件结构 98
4.3.2 文本输入 98
4.3.3 文本文件显示 98
4.3.3.1 移动光标实例 99
4.3.3.2 无光标编辑 110
4.3.4 视频到内存操作 127
4.4 编辑文本文件 130
4.4.1 文件扩展和压缩 130
4.4.2 文本文件控制 133
4.4.3 基本的编辑操作 134
4.4.3.1 插入 134
4.4.3.2 替换 134
4.4.3.3 删除 134
4.5 特殊的文本操作 135
4.5.1 连续输入 135
4.5.2 文本排版 147
4.5.2.1 填加空格 147
4.5.2.2 调和空间 148
第五章 数字计算 149
5.0 引言 149
5.1 8087数字协处理器的范围与设计 149
5.1.1 8087芯片概述 150
5.1.2 局限性 150
5.1.3 8086与8087界面 151
5.1.4 同步操作 151
5.2 8087结构 152
5.2.1 堆栈寄存器 152
5.2.2 控制寄存器 153
5.2.3 状态寄存器 155
5.2.4 指令与数据指针 156
5.2.5 8087标志寄存器 156
5.3 数字数据类型 157
5.3.1 数字数据转换 158
5.3.2 数据类型编码 158
5.3.3 8087的非正规数 159
5.4 对8087编程 160
5.4.1 8087编码格式 161
5.4.2 8087异常处理 161
5.5 8087指令组 163
5.5.1 数据传递指令 163
5.5.2 算法指令 164
5.5.3 比较指令 165
5.5.4 超越函数指令 166
5.5.5 常数指令 166
5.5.6 处理器控制指令 167
5.6 仿真器和支持软件 168
5.6.1 Intel支持软件包 168
5.6.1.1 使用8087仿真器 169
5.6.1.2 使用十进制转换程序库 172
5.6.1.3 使用初等函数程序库 184
5.6.2 Microsoft仿真器 186
5.7 计算机算法原理 187
5.7.1 内存中数据的排列 187
5.7.2 向量和矩阵操作 189
5.7.3 线性系统的处理 189
5.7.4 迭代法和Heuristic法 191
第六章 数字字母显示 193
6.0 引言 194
6.1 IBM视频硬件 194
6.1.1 来自BIOS的视频数据 195
6.1.2 IBM/PC和PS/2视频系统 204
6.1.2.1 单色显示适配器(MDA) 204
6.1.2.2 彩色图形适配器(CGA) 206
6.1.2.3 增强图形适配器(EGA) 207
6.1.2.4 PCjr显示器硬件 208
6.1.2.5 PS/2 30型MCGA系统 209
6.1.2.6 PS/2 50/60/70/80型VGA系统 209
6.1.2.7 IBM高分辨率板 210
6.1.3 光标操作 210
6.1.3.1 隐藏光标 210
6.1.3.2 修改光标 210
6.1.3.3 控制光标 212
6.1.4 对6845 CRT控制器编程 218
6.1.4.1 开关CRT 218
6.1.4.2 字符同步输出 220
6.2 字母数字视频显示编程 221
6.2.1 可移植性讨论 221
6.2.2 DOS字符输出视频服务 221
6.2.3 BIOS字符输出视频服务 225
6.2.4 获得直接存取视频缓冲区 234
6.2.5 彩色/单色兼容 243
6.2.6 字符图形 246
6.2.6.1 画框技巧 246
6.2.6.2 属性操作 246
6.2.7 BLOCKDEMO程序 246
第七章 通讯 258
7.1 串行和并行 258
7.1.1 对并行口编程 259
7.1.2 通过DOS访问并行口 259
7.1.3 通过BIOS访问并行口 259
7.1.3.1 BIOS服务号0,INT 17H 260
7.1.3.2 BIOS服务号1,INT 17H 260
7.1.3.3 BIOS服务号2,INT 17H 261
7.1.4 并行口的直接控制 262
7.1.4.1 接口地址 262
7.1.4.2 输出数据功能 263
7.1.4.3 输入状态功能 263
7.1.4.4 输出控制功能 265
7.1.4.5 打印机中断 266
7.1.5 打印机应用的编程技术 267
7.1.5.1 基本的打印机控制功能 267
7.1.5.2 行索引 268
7.1.5.3 文本对中 269
7.1.5.4 格式长度 269
7.1.6 打印机控制样本例程 269
7.2 串行接口 272
7.2.1 通讯协议 273
7.2.2 对串行接口编程 273
7.2.2.1 用DOS对串行口编程 274
7.2.3 通过BIOS访问串行接口 274
7.2.3.1 BIOS服务号0,INT 14H 274
7.2.3.2 BIOS服务号1,INT 14H 277
7.2.3.3 BIOS服务号2,INT 14H 278
7.2.3.4 BIOS服务号3,INT 14H 278
7.2.4 串行口的直接控制 278
7.2.4.1 发送器保持寄存器THR(xF8H) 280
7.2.4.2 接收器数据寄存器RDR(xF8H) 281
7.2.4.3 波特率分部(LSD)(xF8H)和(MSB)(xF9H) 281
7.2.4.4 中断启动寄存器IER(xF9H) 282
7.2.4.5 中断识别寄存器IIR(xFAH) 283
7.2.4.6 线路控制寄存器LCK(xFBH) 283
7.2.4.7 调制解调器控制寄存器MCR(xFCH) 284
7.2.4.8 线路状态寄存器LSR(xFDH) 284
7.2.4.9 调制解调器状态寄存器MSR(xFEH) 286
7.3 通讯中的硬件中断 286
7.3.1 中断服务例程 288
7.3.2 环形缓冲器 289
7.3.3 开发中断驱动通讯程序 289
7.3.4 TERMINAL程序 290
第八章 颜色和图形 304
8.0 引言 305
8.1 EGA/VGA结构 305
8.1.1 APA高分辨率模式 305
8.1.2 视频内存结构 305
8.1.3 颜色和调色板 307
8.1.4 边界颜色和全局寄存器 308
8.1.5 字母数字模式中的颜色 309
8.2 对EGA-VGA图形编程 319
8.2.1 扩展BIOS视频操作 320
8.2.1.1 BIOS扩展服务号16,INT 10H(AH=16:设置调色板寄存器) 320
8.2.1.2 BIOS扩展服务号17,INT 10H(AH=17:字符生成器) 322
8.2.1.3 BIOS扩展服务号18,INT 10H(AH=18:EGA信息和多种服务) 324
8.2.1.4 BIOS扩展服务号19,INT 10H(AH=19:写字串) 325
8.2.1.5 BIOS扩展服务号26,INT 10H(AH=26:监控器和适配器信息) 325
8.2.2 图形读写模式 326
8.2.3 视图子系统可编程硬件 326
8.2.3.1 通用图形寄存器 326
8.2.3.2 定序寄存器 327
8.2.3.3 CRT控制寄存器 327
8.2.3.4 图形控制寄存器 327
8.2.3.5 属性控制寄存器 328
8.2.4 开发图形 328
8.2.5 字节边界例程 328
8.2.6 字节和象素边界例程 330
8.2.7 缓冲区地址计算 332
8.2.8 画直线 335
8.2.8.1 水平和竖直线 335
8.2.8.2 斜线 336
8.2.9 用8087画图 336
8.2.9.1 圆逼近 337
8.2.9.2 其它画图功能 337
8.2.9.3 程序GRAGDEMO 337
8.2.10 矩形填充例程 360
8.2.11 图形块显示例程 360
8.2.12 USFLAG程序 360
8.2.13 屏幕绘图算法 374
8.3 文本与图形 375
8.3.1 图形模式中的文本字符显示 375
8.3.2 作为图形工具的文本 376
8.3.2.1 可选择的字符根 376
8.3.2.2 同时使用多种字符根 376
8.3.3 图形模式中的常用字符 376
8.3.3.1 软件字符生成器 376
8.3.3.2 使用BIOS字符生成器 377
8.4 动作与图象变换 377
8.4.1 图象显示 377
8.4.2 异或(XOR)象素 378
8.4.3 BILBOARD程序 378
第九章 数据输入和存贮 384
9.1 键盘 384
9.1.1 键盘硬件及操作 384
9.1.1.1 LOCK键 385
9.1.1.2 SYS REQ键 385
9.1.1.3 HOT键 385
9.1.2 BIOS中的键盘数据 386
9.1.2.1 键盘缓冲区 386
9.1.2.2 第一个键盘状态字节 387
9.1.2.3 第二个键盘状态字节 388
9.1.3 键盘中断处理程序 388
9.1.4 替换键盘中断处理程序 389
9.1.5 截取键盘中断 392
9.1.5.1 扫描码表的问题 392
9.1.5.2 抑制HOT键 392
9.1.5.3 生成HOT键 397
9.1.5.4 BIOS键盘截取 398
9.1.6 键盘不反弹和响应速率 401
9.1.6.1 改变延迟和响应速率 401
9.1.6.2 TYPMATIC程序 401
9.1.7 对锁模式键编程(Num、Caps、Scroll) 407
9.1.7.1 从软件中开关LOCK键 407
9.1.7.2 TOGGLE程序 407
9.1.8 BREAK键 409
9.1.8.1 使用Break键处理程序 409
9.1.8.2 DOS Ctrl-C处理程序 410
9.2 对键盘输入编程 411
9.2.1 BIOS键盘服务 411
9.2.1.1 BIOS服务号0,INT 16H(AH=1:读键盘状态) 411
9.2.1.2 BIOS服务号2,INT 16H(AH=2:取键盘状态字节) 412
9.2.1.3 BIOS服务号3,INT 16H(AH=3:设置响应速率和延迟时间) 412
9.2.2 DOS键盘服务 412
9.2.2.1 DOS功能号10,INT 21H(缓冲区的键盘输入) 413
9.3 磁盘存贮导论 413
9.3.1 DOS下的盘存贮机置 414
9.3.2 磁盘存贮格式 414
9.3.2.1 BIOS下的磁盘格式 415
9.3.2.2 DOS下的磁盘格式 416
9.3.3 DOS磁盘操作的逻辑结构 416
9.3.3.1 磁盘转换区(DAT) 417
9.3.3.2 文件控制块(FCB) 417
9.3.3.3 程序段前缀(PSP) 418
9.4 对磁盘操作编程 419
9.4.1.1 BIOS服务号0,INT 13H(AH=0:重置软盘系统) 419
9.4.1.2 BIOS服务号1,INT 13H(AH=1:读上次软盘操作的状态) 420
9.4.1.3 BIOS服务号2,INT 13H(AH=2:读软盘扇区到内存) 420
9.4.1.4 BOIS服务号3,INT 13H(AH=3:将内存写入软盘扇区) 420
9.4.1.5 BIOS服务号4,INT 13H(AH=4:检查软盘扇区) 421
9.4.1.6 BIOS服务号5,INT 13H(AH=5:格式化软盘磁道) 421
9.4.2 DOS服务综述 421
9.4.2.1 DOS服务号14,INT 21H(AH=14:设置缺省磁盘驱动器) 422
9.4.2.2 DOS服务号23,INT 21H(AH=23:改变文件名) 422
9.4.2.3 DOS服务号25,INT 21H(AH=25:获得缺省的驱动器) 423
9.4.2.4 DOS服务号26,INT 21H(AH=26:获得缺省的驱动器) 423
9.4.2.5 DOS服务号41,INT 21H(AH=41:从串创建FCB) 423
9.4.3 使用FCB的DOS磁盘服务 424
9.4.3.1 DOS服务号15,INT 21H(AH=15:使用FCB打开文件) 424
9.4.3.2 DOS服务号16,INT 21H(AH=16:使用FCB关闭文件) 424
9.4.3.3 DOS服务号20,INT 21H(AH=20:使用FCB顺序读文件) 424
9.4.3.4 DOS服务号21,INT 21H(AH=21:使用FCB顺序写文件) 424
9.4.3.5 DOS服务号22,INT 21H(AH=22:使用FCB创建文件) 425
9.4.4 使用文件句柄的DOS磁盘服务 425
9.4.4.1 DOS服务号60,INT 21H(AH=60:创建文件并获得句柄) 425
9.4.4.2 DOS服务号61,INT 21H(AH=61:打开文件并获得句柄) 426
9.4.4.3 DOS服务号62,INT 21H(AH=62:使用句柄关闭文件) 427
9.4.4.4 DOS服务号63,INT 21H(AH=63:使用句柄读文件) 427
9.4.4.5 DOS服务号64,INT 21H(使用句柄写文件) 427
9.4.4.6 DOS服务号78,INT 21H(AH=78:搜寻第一个匹配的ASCIIZ串) 427
9.4.4.7 DOS服务号79,INT 21H(AH=21:搜寻下一个匹配的文件名) 428
9.4.5 FILECOM程序 428