第一章 引论 1
1.1概述 1
1.2建立C语言程序 1
1.3建立其它程序 2
1.4库的建立和维护 2
1.5程序源文件的维护 2
1.6用shell命令建立程序 3
第二章 CC:C编译程序 4
2.1引言 4
2.2调用C编译程序 4
2.3由C源文件建立程序 4
2.3.1编译一个C源文件 4
2.3.2编译若干个源文件 5
2.3.3输出文件命名 6
2.4建立大、中、小型程序 6
2.4.1 -Ms选择项 7
2.4.2 -Ms和-i选择项 7
2.4.3 -Mm选择项 7
2.4.4 -Ml选择项 7
2.4.5建立小型程序 7
2.4.6建立纯正文的小型程序 7
2.4.7建立中型程序 8
2.4.8建立大型程序 8
2.5使用目标文件和库 8
2.5.1建立目标文件 8
2.5.2由目标文件建立程序 9
2.5.3程序与库中函数的连接 9
2.6建立较小较快的程序 9
2.6.1建立优化的目标程序 10
2.6.2删除符号表 10
2.6.3从程序中删去栈检测 10
2.7准备调试用程序 11
2.7.1产生汇编语言清单 11
2.7.2程序的直方图统计 11
2.8控制C预处理程序 11
2.8.1定义宏 12
2.8.2定义包含目录 12
2.8.3忽略缺省包含目录 12
2.8.4保存预处理过的源文件 13
2.9错误信息 13
2.9.1 C编译程序信息 13
2.9.2设置警告的级别 13
2.10使用高级选择项 14
2.10.1由汇编语言源文件建立程序 14
2.10.2使用关键字near和far 14
2.10.3设置栈的大小 15
2.10.4使用模块、段和组 15
2.10.5建立DOS程序 16
2.11编译程序小结 16
2.11.1 cc选择项 16
2.11.2存贮模式 17
2.11.3指针和整数的大小 18
2.11.4段名和模块名 18
第三章 XENIX到DOS:交叉开发系统 19
3.1引言 19
3.2建立源文件 19
3.3编译DOS源文件 20
3.4使用汇编语言源文件 20
3.5建立连接目标文件 20
3.6 DOS程序的运行和调试 21
3.7系统间程序的传送 21
3.8建立DOS库 21
第四章 lint程序——C程序检查器 22
4.1引言 22
4.2调用lint 22
4.3检查无用的变量和函数 23
4.4检查局部变量 23
4.5检查不可到达语句 24
4.6检查无限循环 24
4.7检查函数返回值 25
4.8检查无用的返回值 25
4.9类型检查 25
4.10检查类型强制转换 26
4.11检查不可移植字符的使用 26
4.12检查long到int的赋值 26
4.13检查奇怪的结构 27
4.14检查老的C文法的使用 27
4.15检查指针排列 28
4.16检查表达式计值顺序 28
4.17嵌入伪指令 29
4.18检查库相容性 29
第五章 程序的维护程序:make 31
5.1引言 31
5.2建立makefile文件 31
5.3调用make 32
5.4使用伪目标名 33
5.5使用宏 34
5.6使用Shell环境变量 36
5.7使用内部规则 36
5.8改变内部规则 37
5.9使用库 38
5.10故障查找 39
5.11使用make:一个例子 40
第六章 SCCS:源代码控制系统 42
6.1引言 42
6.2基本信息 42
6.2.1文件和目录 42
6.2.2 Delta和SID 42
6.2.3 SCCS工作文件 43
6.2.4 SCCS命令参数 44
6.2.5文件管理者 44
6.3建立和使用S文件 44
6.3.1建立S文件 44
6.3.2为读入恢复文件 45
6.3.3为编辑恢复文件 45
6.3.4保持文件的新版本 46
6.3.5恢复某一特定版本 47
6.3.6改变文件的发行号 47
6.3.7建立分版本 48
6.3.8恢复分版本 48
6.3.9恢复最新版本 48
6.3.10显示一个版本 48
6.3.11保存新版本的拷贝 49
6.3.12显示帮助信息 49
6.4使用标识关键字 49
6.4.1往文件中插入关键字 49
6.4.2对关键字赋值 50
6.4.3强置关键字 50
6.5使用S文件标志 50
6.5.1设置S文件标志 51
6.5.2使用i标志 51
6.5.3使用d标志 51
6.5.4换用v标志 51
6.5.5删去S文件标志 51
6.6修改S文件信息 51
6.6.1加入注释 52
6.6.2改变注释 52
6.6.3加入修改请求 52
6.6.4改变修改请求 53
6.6.5加入描述正文 53
6.7打印S文件 53
6.7.1使用数据说明 53
6.7.2打印特定版本 54
6.7.3打印较新的和较早的版本 54
6.8由若干用户编辑 54
6.8.1编辑不同版本 54
6.8.2编辑一个版本 54
6.8.3保存一特定版本 55
6.9保护S文件 55
6.9.1向用户表中加入一个用户 55
6.9.2从用户表中删去一个用户 56
6.9.3设置底层标志 56
6.9.4设置顶层标志 56
6.9.5对一版本加锁 56
6.10订正SCCS文件 56
6.10.1检查S文件 56
6.10.2编辑S文件 57
6.10.3改变S文件的校验和 57
6.10.4为编辑重新产生G文件 57
6.10.5恢复受损的P文件 57
6.11使用其它命令选择项 57
6.11.1用SCCS命令获取帮助 57
6.11.2用标准输入建立文件 58
6.11.3从特定发行号开始 58
6.11.4向第一版中加入注释 58
6.11.5禁止正常输出 58
6.11.6包含和排斥Delta 58
6.11.7列出版本的Delta 59
6.11.8映射行到Delta 59
6.11.9行命名 59
6.11.10显示差异表 59
6.11.11显示文件信息 60
6.11.12删去Delta 60
6.11.13对串进行搜索 60
6.11.14比较SCCS文件 60
第七章 adb程序调试器 62
7.1引言 62
7.2启停adb 62
7.2.1用程序文件启动 62
7.2.2用内存映象文件启动 62
7.3用写选择项启动 63
7.4用提示选择项启动 63
7.5退出adb 63
7.6显示指令和数据 64
7.6.1形成地址 64
7.6.2形成表达式 64
7.6.2.1十、八、十六进制整数 64
7.6.2.2符号 64
7.6.2.3 adb中的变量 65
7.6.2.4当前地址 65
7.6.2.5寄存器名 66
7.6.2.6运算符 66
7.6.3选择数据格式 67
7.7使用等于命令 68
7.7.1使用(?)命令和反斜线命令 68
7.7.2一个例子:简单格式化 69
7.8调试程序的执行 70
7.9运行一程序 70
7.9.1设置断点 71
7.9.2显示断点 71
7.9.3继续执行 71
7.9.4用Interrupt和Quit停止程序 71
7.9.5单步执行程序 72
7.9.6抹去一程序 72
7.10删去断点 72
7.10.1显示C语言栈回溯踪迹 72
7.10.2显示CPU寄存器 72
7.10.3显示外部变量 73
7.10.4一个例子:跟踪多个函数 73
7.11使用adb内存映象 76
7.11.1显示内存映象 76
7.11.2改变内存映象 77
7.11.3建立新的映象条目 77
7.12验证地址 78
7.13其它特点 78
7.13.1在一行中组合命令 78
7.13.2建立adb原本文件 78
7.13.3设置输出宽度 79
7.13.4设置最大偏移量 79
7.14设置缺省输入格式 79
7.15 使用XENIX命令 80
7.16计算数值和显示正文 80
7.17一个例子:目录和I节点 80
7.18修补二进制文件 81
7.19在文件中确定值的位置 82
7.20写文件 82
7.21修改内存 82
第八章 lex程序:词法分析器 83
8.1引言 83
8.2 lex源格式 84
8.3 lex正则表达式 85
8.4调用lex 85
8.5说明字符类 86
8.6说明一任意字符 86
8.7说明可选表达式 86
8.8说明重复表达式 86
8.9说明选择和分组 87
8.10说明上下文相关性 87
8.11说明表达式重复 87
8.12说明定义 88
8.13说明动作 88
8.14处理模糊源规则 90
8.15说明左上下文相关性 92
8.16说明源定义 94
8.17程序lex和yacc 95
8.18说明字符集 98
8.19源格式 98
第九章 yacc程序产生器:编译程序的编译程序 101
9.1引言 101
9.2规范说明 103
9.3动作 104
9.4词法分析 106
9.5语法分析程序的工作过程 107
9.6二义性和冲突 110
9.7优先级 113
6.8出错处理 115
9.9 yacc的环境 117
9.10准备规范说明 118
9.11输入风格 118
9.12左递归 118
9.13词法上的标注 119
9.14处理保留字 119
9.15在动作中模拟出错处理和接收 120
9.16在封闭规则中访问值 120
9.17对任意值类型的支持 120
9.18一个小型台式计算器 122
9.19 yacc的输入语法 122
9.20一个高级例子 124
9.21早先的特性 128
第十章 C shell 130
10.1引言 130
10.2调用C shell 130
10.3使用shell变量 131
10.4使用C shell历史列表 132
10.5使用别名 134
10.6改向输入和输出 135
10.7建立后台和前台作业 135
10.8使用内部命令 136
10.9建立命令原本 137
10.10使用argv变量 137
10.11替代shell变量 137
10.12使用表达式 139
10.13使用C shell:一个实例原本 139
10.14使用其它控制结构 141
10.15提供命令的输入 142
10.16捕捉中断 142
10.17使用其它特性 143
10.18在终端上启动一个循环 143
10.19使用带有参数的花括号 144
10.20替换命令 144
10.21特殊字符 144
10.21.1句法元字符 144
10.21.2文件名元字符 144
10.21.3引用元字符 145
10.21.4输入/输出元字符 145
10.21.5扩展/替换元字符 145
10.21.6其它元字符 145
附录A C语言的可移植性 146
A.1引言 146
A.2程序的可移植性 146
A.3机器硬件 147
A.3.1字节长度 147
A.3.2字长 147
A.3.3存贮器排列 147
A.3.4字中的字节顺序 148
A.3.5位段 148
A.3.6指针 149
A.3.7地址空间 149
A.3.8字符集 149
A.4编译程序的差异 150
A.4.1有符号/无符号字符,符号扩展 150
A.4.1移位操作 150
A.4.3标识符长度 150
A.4.4寄存器变量 150
A.4.5类型转换 151
A.4.6带有可变个参数的函数 151
A.4.7副作用,计值顺序 152
A.5程序环境差异 153
A.6数据的可移植性 153
A.7 lint C程序检查器 154
A.8字节顺序小结 154
附录B m4宏处理程序 155
B.1引言 155
B.2调用m4 155
B.3定义宏 155
B.4加引号 156
B.5使用参数 157
B.6使用内部算术运算 158
B.7文件操作 159
B.8使用系统命令 159
B.9使用条件 159
B.10使用串 160
B.11打印 161
附录C XENIX设备驱动程序指南 162
C.1 引言 162
C.2预备知识 162
C.3字符设备 164
C.4块设备 165
C.5配置与安装 166
C.6警告 167
C.7行式打印机驱动程序实例 167
C.7.1 lpopen() 168
C.7.2 lpclose( ) 168
C.7.3 lpwrite( ) 168
C.7.4 lpstart( ) 168
C.7.5 lpintr( ) 168
C.8终端驱动程序实例 170
C.8.1 tdopen( ) 171
C.8.2 tdclose( ) 171
C.8.3 tdread( )tdwrite( ) 171
C.8.4 tdparam( ) 171
C.8.5 tmodem( ) 172
C.8.6 tdintr( ) 172
C.8.7 tdxint( ) 172
C.8.8 tdrint( ) 172
C.8.9 tdmint( ) 172
C.8.10 tdioctl() 172
C.8.11 tdproc() 172
C.9磁盘驱动程序实例 181
C.9.1 hdstrategy 182
C.9.2 hdstart( ) 182
C.9.3 hdintr() 182
C.9.4 hdread() 182
C.9.5 hdwrite() 182
附录D 连接程序错误信息 187