第1章 数制1
1.1 简介1
1.2 按位记数制1
1.3 各数制的算术规则4
1.4 数制转换6
1.5 Horner法9
1.6 有符号二进制数10
1.6.1 符号—绝对值表示法10
1.6.2 2的补码表示法11
1.6.3 1的补码表示法13
1.6.4 加n表示法14
1.7 用2的补码加法计算减法14
1.8 2的补码和无符号数的范围15
1.9 扩展2的补码和无符号数16
1.10 溢出17
1.10.1 有符号数溢出17
1.10.2 无符号数溢出18
1.11 分析2的补码数20
1.12 加法器电路21
1.13 门23
1.14 用加法器执行减法24
1.15 比较有符号数26
1.16 比较无符号数27
1.17 正数、负数和无符号数的一致对待27
1.18 浮点数表示法28
1.18.1 科学记数法28
1.18.2 32位IEEE 754浮点数格式29
1.18.3 下溢、溢出和特殊值30
1.18.4 某些Java程序中的计算误差30
1.18.5 长格式35
1.19 小结35
1.20 问题36
第2章 机器语言40
2.1 简介40
2.2 计算机的组件40
2.3 机器语言编程44
2.4 在sim上运行机器语言程序48
2.5 问题52
第3章 H1汇编语言:第1部分54
3.1 简介54
3.2 汇编语言基础55
3.3 注释汇编语言程序58
3.4 使用标号58
3.5 使用汇编器61
3.6 低级语言与高级语言65
3.7 汇编器工作原理66
3.8 使用dup修饰符67
3.9 操作数字段中的算术表达式68
3.10 指定当前位置70
3.11 字符串71
3.12 org伪指令74
3.13 end伪指令75
3.14 指令的顺序执行76
3.15 问题78
第4章 H1汇编语言:第2部分81
4.1 简介81
4.2 描述指令的简写形式81
4.3 直接指令82
4.4 堆栈指令83
4.5 立即指令85
4.6 I/O指令90
4.7 转移指令96
4.8 间接指令98
4.9 相对指令102
4.10 变址103
4.11 连接指令105
4.12 终止指令109
4.13 高级语言中指令的自动生成109
4.14 调试110
4.15 使用存储映像式I/O115
4.16 equ伪指令117
4.17 Java程序的潜在问题:大小端118
4.18 问题121
第5章 电子学和数字逻辑电路基础125
5.1 简介125
5.2 电子学基础125
5.2.1 导体和绝缘体125
5.2.2 一个简单电路126
5.2.3 有效电压127
5.2.4 电源127
5.2.5 如何避免触电128
5.2.6 晶体管129
5.2.7 电容、电感和阻抗131
5.3 组合逻辑电路133
5.3.1 门133
5.3.2 布尔函数134
5.3.3 最小电路135
5.3.4 使用布尔代数使电路最小化136
5.3.5 摩根定律的图示法137
5.3.6 使用卡诺图使电路最小化138
5.3.7 多路复用器141
5.3.8 解码器和编码器142
5.3.9 半加器和全加器143
5.3.10 一位移位器144
5.3.11 乘法器阵列145
5.3.12 算术逻辑单元148
5.3.13 三态缓冲器149
5.3.14 ROM151
5.4 时序逻辑电路153
5.4.1 SR触发器153
5.4.2 时钟控制D触发器155
5.4.3 时钟控制JK触发器157
5.4.4 边沿检测157
5.4.5 T触发器159
5.4.6 RAM159
5.4.7 二进制计数器160
5.4.8 寄存器161
5.4.9 时钟和序列发生器163
5.5 集成电路164
5.6 问题165
第6章 H1和V1的微级168
6.1 简介168
6.2 H1的微级168
6.2.1 H1的组织概述168
6.2.2 微指令170
6.2.3 存储器数据总线171
6.2.4 存储器地址总线172
6.2.5 寄存器库172
6.2.6 指定微操作175
6.2.7 驱动寄存器库的控制输入端175
6.2.8 整合H1各部分176
6.2.9 分支多路复用器178
6.2.10 定时问题180
6.2.11 微指令格式181
6.2.12 序列发生器驱动的控制输入端181
6.2.13 基本指令集的微代码182
6.2.14 硬件/微代码权衡187
6.3 在sim上使用新的微代码189
6.3.1 如何使用!伪指令189
6.3.2 创建配置文件189
6.3.3 创建二进制微代码191
6.3.4 用新指令集汇编192
6.3.5 在微级上跟踪193
6.3.6 加密微代码198
6.3.7 编写并优化复杂的微代码198
6.4 解释机器语言指令200
6.5 硬接线控制201
6.6 垂直微编程202
6.6.1 使用V1202
6.6.2 构成更短的微指令203
6.6.3 汇编垂直微代码205
6.7 问题210
第7章 评估H1的指令集体系结构:第1部分214
7.1 简介214
7.2 哑编译器214
7.3 全局变量218
7.4 局部变量221
7.5 变化的相对地址229
7.6 参数和传值调用230
7.7 返回值235
7.8 需要相对指令的原因236
7.9 确定动态局部变量和参数的地址238
7.10 间接引用指针241
7.11 问题243
第8章 评估H1的指令集体系结构:第2部分249
8.1 简介249
8.2 引用调用249
8.2.1 引用调用的实现249
8.2.2 C++引用参数的概念视图256
8.2.3 不间接引用C++引用参数的情况257
8.2.4 传值调用与引用调用的比较258
8.2.5 常数和表达式作为变元259
8.3 函数重载和重命名263
8.4 结构267
8.5 Java中的指针271
8.6 函数指针272
8.7 数组274
8.7.1 定义并访问数组274
8.7.2 数组作为变元278
8.7.3 Java中的数组282
8.8 控制语句283
8.9 有符号数和无符号数比较285
8.10 多字加法285
8.11 位级操作286
8.12 递归287
8.13 问题293
第9章 高级汇编语言编程301
9.1 简介301
9.2 指向指针的指针301
9.3 引用调用及其他地方存在的潜在错误307
9.4 关系和布尔表达式310
9.5 字符串313
9.6 值结果调用315
9.7 变长变元列表321
9.8 问题326
第10章 连接和加载329
10.1 简介329
10.2 浮动字段330
10.3 显示标题和机器代码正文的程序334
10.4 小s项336
10.5 禁止重定位337
10.6 分别汇编338
10.7 乘法子例程348
10.8 使用库350
10.9 分别汇编的优点357
10.10 启动代码357
10.11 C++模块的分别编译367
10.12 问题371
第11章 用C++或Java实现汇编器和连接器376
11.1 简介376
11.2 编写汇编器376
11.2.1 一个简单汇编器的规范377
11.2.2 操作码表378
11.2.3 符号表380
11.2.4 使用二进制文件382
11.2.5 读取输入文本文件并创建标题385
11.2.6 汇编机器字387
11.2.7 将机器正文写入输出文件388
11.2.8 分析输入388
11.2.9 Java程序的大小端问题388
11.2.10 添加对public、extern和end伪指令的支持389
11.3 编写连接器390
11.3.1 一个简单连接器的规范390
11.3.2 构建P、E、R和S表391
11.3.3 重定位地址并解析外部引用393
11.3.4添加库支持395
11.4 问题396
第12章 最优指令集397
12.1 简介397
12.2 新增和改进的指令398
12.2.1 mult、m、div和rem399
12.2.2 addc和subc400
12.2.3 scmp401
12.2.4 ucmp402
12.2.5 shll和shrl403
12.2.6 shra404
12.2.7 addy405
12.2.8 or、xor、and和flip407
12.2.9 cali409
12.2.10 sect和dect409
12.2.11 sodd410
12.2.12 esba、reba、bpbp、pobp和pbp411
12.2.13 cora416
12.2.14 bcpy417
12.3 链表——使用最优指令集示例418
12.4 关于最优指令集的进展报告424
12.4.1 主存储器的数量不足424
12.4.2 存储器存储字符串的效率不高424
12.4.3 缺少加和减的立即指令425
12.4.4 缺少变址寄存器425
12.4.5 累加器型寄存器太少425
12.4.6 swap指令破坏sp寄存器425
12.4.7 缺少乘法和除法指令426
12.4.8 sp寄存器作为栈顶指针和基址寄存器的双重用途426
12.4.9 难以获得堆栈上变量的地址426
12.4.10 缺少块复制指令426
12.4.11 难以调用地址已知的函数426
12.4.12 aloc和dloc指令的局限性426
12.4.13 难以执行有符号数和无符号数比较426
12.4.14 难以执行多字加法426
12.4.15 不支持位级操作427
12.5 问题427
第13章 使用、评估并实现最优指令集和堆栈指令集430
13.1 简介430
13.2 H1上的乘法430
13.3 二维数组437
13.4 汇编语言中的面向对象编程441
13.4.1 C++的结构、类和对象441
13.4.2 继承452
13.4.3 通过指针调用成员函数457
13.4.4 虚函数和多态性464
13.5 名调用472
13.6 面向堆栈的体系结构479
13.6.1 体系结构与组织479
13.6.2 以栈顶代替ac寄存器480
13.6.3 4位操作码的可用性484
13.6.4 特殊的堆栈操作485
13.6.5 更简单的编译486
13.6.6 返回值487
13.6.7 使用堆栈指令集示例489
13.6.8 比较最优指令集和堆栈指令集491
13.6.9 关于JVM的几点观察492
13.7 编写最优和堆栈指令集的微代码493
13.8 微编程的挑战496
13.9 问题497
第14章 存储系统503
14.1 简介503
14.2 地址的传送503
14.3 多程序系统505
14.4 直接存储器存取505
14.5 分时系统506
14.6 重定位寄存器506
14.7 虚拟存储器508
14.7.1 简单分页系统509
14.7.2 关联存储器512
14.7.3 中断514
14.7.4 请求式分页516
14.7.5 请求式分页的页面替换策略518
14.7.6 页面大小的考虑519
14.7.7 超级用户/用户模式520
14.7.8 存储器保护521
14.7.9 分页的分段521
14.8 高速缓冲存储器522
14.8.1 缓存的替换策略523
14.8.2 写策略523
14.8.3 存储器到缓存的映射方案524
14.9 可共享的程序526
14.10 问题527
第15章 某些现代体系结构530
15.1 简介530
15.2 CISC与RISC530
15.3 SPARC:RISC体系结构532
15.3.1 重叠的寄存器窗口532
15.3.2 保存和恢复指令536
15.3.3 加载和存储指令538
15.3.4 转移、call和jmpl指令543
15.3.5 指令流水线546
15.3.6 连接指令552
15.3.7 寻址方式553
15.3.8 一个简单的汇编语言程序555
15.3.9 合成指令557
15.3.10 编译器生成的代码559
15.3.11 存储映像式I/O565
15.4 Pentium:CISC体系结构566
15.4.1 寄存器结构566
15.4.2 汇编语言567
15.4.3 编译器生成的代码568
15.4.4 I/O指令570
15.5 问题571
第16章 Java虚拟机(JVM)576
16.1 简介576
16.2 JVM的结构577
16.3 某些使用操作数堆栈的普通操作578
16.4 方法的调用和返回579
16.5 执行引擎的实现581
16.6 明智之举:JVM使用堆栈体系结构582
16.7 一个简单的例子582
16.8 常数池584
16.9 类文件格式585
16.10 字节码的空间效率589
16.11 控制语句590
16.12 反汇编类文件591
16.13 对象和数组593
16.14 JVM:抽象机器595
16.15 问题595
附录A 指令集汇总(s.txt、b.txt、o.txt、k.txt)598
附录B 微指令级汇总(mic.txt)606
附录C 标准指令集的微代码(s.has)609
附录D SPARC汇总(sparc.txt)614
附录E java虚拟机字节码汇总(jvm.txt)620
附录F ASCII汇总(ascii.txt)625
附录G 数制汇总(number.txt)627
附录H 了解C++对Java程序员的帮助628