目录 1
第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.19 小结 35
1.18.5 长格式 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/O 115
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.1 门 133
5.3 组合逻辑电路 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 ROM 151
5.4 时序逻辑电路 153
5.4.1 SR触发器 153
5.4.2 时钟控制D触发器 155
5.4.3 时钟控制JK触发器 157
5.4.4 边沿检测 157
5.4.6 RAM 159
5.4.5 T触发器 159
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.1 如何使用!伪指令 189
6.3.2 创建配置文件 189
6.3 在sim上使用新的微代码 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.1 使用V1 202
6.6 垂直微编程 202
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和rem 399
12.2.2 addc和subc 400
12.2.3 scmp 401
12.2.4 ucmp 402
12.2.5 shll和shrl 403
12.2.6 shra 404
12.2.7 addy 405
12.2.8 or、xor、and和flip 407
12.2.9 cali 409
12.2.10 sect和dect 409
12.2.11 sodd 410
12.2.12 esba、reba、bpbp、pobp和pbp 411
12.2.13 cora 416
12.2.14 bcpy 417
12.3 链表——使用最优指令集示例 418
12.4.2 存储器存储字符串的效率不高 424
12.4 关于最优指令集的进展报告 424
12.4.1 主存储器的数量不足 424
12.4.3 缺少加和减的立即指令 425
12.4.4 缺少变址寄存器 425
12.4.5 累加器型寄存器太少 425
12.4.6 swap指令破坏sp寄存器 425
12.4.14 难以执行多字加法 426
12.4.13 难以执行有符号数和无符号数比较 426
12.4.12 aloc和dloc指令的局限性 426
12.4.11 难以调用地址已知的函数 426
12.4.10 缺少块复制指令 426
12.4.9 难以获得堆栈上变量的地址 426
12.4.8 sp寄存器作为栈顶指针和基址寄存器的双重用途 426
12.4.7 缺少乘法和除法指令 426
12.4.15 不支持位级操作 427
12.5 问题 427
第13章使用、评估并实现最优指令集和堆栈指令集 430
13.1 简介 430
13.2 H1上的乘法 430
13.3 二维数组 437
13.4.1 C++的结构、类和对象 441
13.4 汇编语言中的面向对象编程 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.4 直接存储器存取 505
14.3 多程序系统 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.1 简介 530
15.2 CISC与RISC 530
第15章 某些现代体系结构 530
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/O 565
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