第1章 欢迎阅读本书 1
1.1 我们的目标 1
1.2 怎么才能做到 1
1.3 两个反复出现的理念 2
1.3.1 抽象之理念 2
1.3.2 硬件与软件 3
1.4 计算机系统简述 4
1.5 两个非常重要的思想 6
1.6 计算机:通用计算设备 6
1.7 从问题描述到电子运转 8
1.7.1 问题的提出 8
1.7.2 算法 8
1.7.3 程序 9
1.7.4 指令集结构 9
1.7.5 微结构 10
1.7.6 逻辑电路 10
1.7.7 器件 10
1.7.8 小结 10
1.8 习题 11
第2章 bit、数据类型及其运算 14
2.1 bit和数据类型 14
2.1.1 bit——信息的基本单位 14
2.1.2 数据类型 14
2.2 整数数据类型 15
2.2.1 无符号整数 15
2.2.2 有符号整数 15
2.3 补码 16
2.4 二进制数与十进制数之间的转换 18
2.4.1 二进制数转换为十进制数 18
2.4.2 十进制数转换为二进制数 19
2.5 bit运算之一:算术运算 20
2.5.1 加法和减法 20
2.5.2 符号扩展 20
2.5.3 溢出 21
2.6 bit运算之二:逻辑运算 22
2.6.1 “与”运算 22
2.6.2 “或”运算 23
2.6.3 “非”运算 24
2.6.4 “异或”运算 24
2.7 其他类型 24
2.7.1 位矢量 25
2.7.2 浮点数 25
2.7.3 ASCII码 27
2.7.4 十六进制计数法 28
2.8 习题 29
第3章 数字逻辑 34
3.1 MOS晶体管 34
3.2 逻辑门 35
3.2.1 非门 35
3.2.2 或门、或非门 36
3.2.3 与门、与非门 37
3.2.4 摩根定律 38
3.2.5 多输入门 39
3.3 组合逻辑 39
3.3.1 译码器 40
3.3.2 多路复用器 40
3.3.3 全加器 41
3.3.4 可编程逻辑阵列 43
3.3.5 逻辑完备性 43
3.4 存储单元 44
3.4.1 R-S锁存器 44
3.4.2 门控D锁存器 45
3.4.3 寄存器 45
3.5 内存的概念 46
3.5.1 寻址空间 46
3.5.2 寻址能力 46
3.5.3 例子:22×3内存 47
3.6 时序电路 48
3.6.1 组合密码锁 49
3.6.2 状态的概念 50
3.6.3 有限状态机 51
3.6.4 有限状态机的实现 53
3.7 LC-3计算机的数据通路 55
3.8 习题 56
第4章 冯·诺伊曼模型 65
4.1 基本部件 65
4.1.1 内存 66
4.1.2 处理单元 66
4.1.3 输入和输出单元 67
4.1.4 控制单元 67
4.2 LC-3:一台冯·诺伊曼机器 67
4.3 指令处理 69
4.3.1 指令 69
4.3.2 指令周期 70
4.4 改变执行顺序 72
4.5 停机操作 74
4.6 习题 75
第5章 LC-3结构 77
5.1 ISA概述 77
5.1.1 内存组织 77
5.1.2 寄存器 77
5.1.3 指令集 78
5.1.4 操作码 78
5.1.5 数据类型 80
5.1.6 寻址模式 80
5.1.7 条件码 80
5.2 操作指令 80
5.3 数据搬移指令 83
5.3.1 PC相对寻址 83
5.3.2 间接寻址 84
5.3.3 基址偏移寻址 85
5.3.4 立即数寻址 86
5.3.5 一个例子 87
5.4 控制指令 88
5.4.1 条件跳转指令 88
5.4.2 一个例子 90
5.4.3 循环控制的两种方法 91
5.4.4 例子:哨兵法数组求和 92
5.4.5 JMP指令 92
5.4.6 TRAP指令 93
5.5 例子:字符数统计 93
5.6 总结:数据通路(LC-3) 96
5.6.1 数据通路的基本部件 97
5.6.2 指令周期 98
5.7 习题 98
第6章 编程 104
6.1 问题求解 104
6.1.1 系统分解 104
6.1.2 三种结构:顺序、条件、循环 104
6.1.3 实现三种结构的LC-3指令 105
6.1.4 回顾字符数统计例子 106
6.2 调试 109
6.2.1 调试的基本操作 110
6.2.2 交互式调试器的使用 111
6.3 习题 116
第7章 汇编语言 120
7.1 汇编语言编程——更上一层 120
7.2 一个汇编程序 120
7.2.1 指令 121
7.2.2 伪操作 123
7.2.3 例子:字符数统计程序 124
7.3 汇编过程 125
7.3.1 概述 125
7.3.2 两遍扫描 125
7.3.3 第1遍:创建符号表 126
7.3.4 第2遍:生成机器语言程序 126
7.4 相关知识 127
7.4.1 可执行映像 128
7.4.2 多目标文件 128
7.5 习题 129
第8章 输入/输出 134
8.1 输入/输出的基本概念 134
8.1.1 设备寄存器 134
8.1.2 内存映射I/O与专用I/O指令 134
8.1.3 异步I/O与同步I/O 135
8.1.4 中断驱动与轮询 135
8.2 键盘输入 136
8.2.1 基本输入寄存器 136
8.2.2 基本输入服务程序 136
8.2.3 内存映射输入的实现 136
8.3 显示器输出 137
8.3.1 基本输出寄存器(DDR和DSR) 137
8.3.2 基本输出服务程序 137
8.3.3 内存映射输出的实现 138
8.3.4 例子:键盘回显 139
8.4 一个更复杂的输入程序 139
8.5 中断驱动I/O 140
8.5.1 什么是中断驱动11O 140
8.5.2 为什么要引入中断驱动I/O 141
8.5.3 中断信号的产生 142
8.6 内存映射I/O的回顾 144
8.7 习题 144
第9章 TRAP程序和子程序 146
9.1 LC-3 TRAP程序 146
9.1.1 概述 146
9.1.2 TRAP机制 146
9.1.3 TRAP指令 147
9.1.4 完整机制 147
9.1.5 I/O中断处理程序 149
9.1.6 HALT中断程序 150
9.1.7 寄存器内容的保存和恢复 151
9.2 子程序 152
9.2.1 调用/返回机制 153
9.2.2 JSR(R)指令 154
9.2.3 字符输入的TRAP程序 154
9.2.4 PUTS:写字符串 156
9.2.5 库程序 157
9.3 习题 160
第10章 栈 166
10.1 栈的基本结构 166
10.1.1 抽象数据类型:栈 166
10.1.2 两个实现例子 166
10.1.3 内存中的实现 167
10.1.4 小结 170
10.2 中断驱动I/O(第二部分) 171
10.2.1 启动和执行 171
10.2.2 中断返回 173
10.2.3 例子:嵌套中断 173
10.3 基于栈的算术运算 175
10.3.1 栈的临时存储作用 175
10.3.2 例子:算术表达式 175
10.3.3 加、乘和取反 176
10.4 数据类型转换 180
10.4.1 一个错误结果的例子:2+3=e 181
10.4.2 ASCII/二进制转换 181
10.4.3 二进制/ASCII转换 183
10.5 模拟计算器 184
10.6 习题 188
第11章 C语言编程概述 192
11.1 我们的目标 192
11.2 软硬件结合 192
11.3 高级语言翻译 194
11.3.1 解释执行 194
11.3.2 编译执行 194
11.3.3 两种方法的优缺点 194
11.4 C编程语言 195
11.5 一个简单的C程序 197
11.5.1 main函数 198
11.5.2 编程风格 198
11.5.3 C预处理器 199
11.5.4 输入和输出 200
11.6 小结 202
11.7 习题 202
第12章 变量和运算符 204
12.1 概述 204
12.2 变量 204
12.2.1 三种基本数据类型:int、char、double 204
12.2.2 标识符的选择 206
12.2.3 局部变量和全局变量 206
12.2.4 更多的例子 208
12.3 运算符 208
12.3.1 表达式和语句 209
12.3.2 赋值运算符 209
12.3.3 算术运算符 210
12.3.4 算术优先级 210
12.3.5 位运算符 211
12.3.6 关系运算符 212
12.3.7 逻辑运算符 213
12.3.8 递增/递减运算符 214
12.3.9 运算符混合表达式 215
12.4 基于运算符的问题求解 215
12.5 编译器处理 217
12.5.1 符号表 217
12.5.2 变量的空间分配 218
12.5.3 完整的例子 219
12.6 补充话题 221
12.6.1 三种基本类型的变种 221
12.6.2 文字常量、常量和符号值 222
12.6.3 存储类型 223
12.6.4 更多的C运算符 223
12.7 小结 224
12.8 习题 224
第13章 控制结构 227
13.1 概述 227
13.2 条件结构 227
13.2.1 if语句 227
13.2.2 if-else语句 229
13.3 循环结构 231
13.3.1 while语句 231
13.3.2 for语句 233
13.3.3 do-while循环 236
13.4 基于控制结构的问题求解 236
13.4.1 问题1:π的近似值求解 236
13.4.2 问题2:找出100以内的质数 239
13.4.3 问题3:分析一个E-mail地址 241
13.5 其他C语言控制结构 243
13.5.1 switch语句 243
13.5.2 break和continue语句 244
13.5.3 简单计算器的例子 244
13.6 小结 245
13.7 习题 246
第14章 函数 250
14.1 概述 250
14.2 C语言中的函数 250
14.2.1 带参数的函数 251
14.2.2 求解圆面积 253
14.3 C语言中函数的实现 254
14.3.1 运行时栈 254
14.3.2 实现机制 254
14.3.3 汇总 259
14.4 问题求解 260
14.4.1 例1:大小写转换 260
14.4.2 例2:毕达哥拉斯三角形 262
14.5 小结 263
14.6 习题 263
第15章 测试与调试技术 268
15.1 概述 268
15.2 错误类型 269
15.2.1 语法错误 269
15.2.2 语义错误 269
15.2.3 算法错误 270
15.3 测试 271
15.3.1 黑盒测试 271
15.3.2 白盒测试 272
15.4 调试 272
15.4.1 特定方法 273
15.4.2 源码级调试工具 273
15.4.3 断点 273
15.5 正确的编程方法 274
15.5.1 明确规格说明 274
15.5.2 模块化设计 275
15.5.3 预防错误式编程 275
15.6 小结 276
15.7 习题 276
第16章 指针和数组 280
16.1 概述 280
16.2 指针 280
16.2.1 声明指针变量 281
16.2.2 指针运算符 282
16.2.3 指针传递一个引用 283
16.2.4 空指针 284
16.2.5 语法 284
16.2.6 指针例程 285
16.3 数组 286
16.3.1 数组声明 286
16.3.2 数组应用 287
16.3.3 数组参数 289
16.3.4 C语言的字符串 290
16.3.5 数组与指针的关系 293
16.3.6 实例:插入排序 293
16.3.7 C语言数组的不足 295
16.4 小结 296
16.5 习题 296
第17章 递归 299
17.1 概述 299
17.2 什么是递归 299
17.3 递归与循环 300
17.4 汉诺塔 301
17.5 斐波纳契数列 304
17.6 二分查找 307
17.7 整数转换为ASCII字符串 309
17.8 小结 310
17.9 习题 310
第18章 C语言中的I/O 315
18.1 概述 315
18.2 C标准库函数 315
18.3 字符I/O操作 315
18.3.1 I/O流 316
18.3.2 putchar函数 316
18.3.3 getchar函数 316
18.3.4 缓冲I/O 316
18.4 格式化I/O 317
18.4.1 printf 317
18.4.2 scanf 318
18.4.3 可变长参数 320
18.5 文件I/O 321
18.6 小结 322
18.7 习题 323
第19章 数据结构 324
19.1 概述 324
19.2 结构体 324
19.2.1 typedef 326
19.2.2 结构体在C中的实现 326
19.3 结构体数组 327
19.4 动态内存分配 328
19.5 链表 330
19.6 小结 336
19.7 习题 336
附录A LC-3指令集结构 339
附录B 从LC-3到x86 353
附录C LC-3的微结构 367
附录D C编程语言 383
附录E 常用表 403