目录 1
第1章 体系结构和实现方法 1
1.1 类比:钢琴的体系结构 1
1.2 计算机语言的类型 2
1.3 为什么要学习汇编语言 3
1.4 二进制倍数的词头 4
1.5 指令集体系结构 4
1.6 计算机体系结构的生命周期 5
1.6.1 32位Intel?体系结构及其先前结构 5
1.6.2 AlphaTM体系结构及其先前结构 6
1.6.3 安腾体系结构及其先前结构 7
1.6.4 体系结构和实现方法的命名 8
1.7 SQUARES:第一个编程实例 9
1.7.1 C、FORTRAN和COBOL语言描述 9
1.7.2 安腾体系结构的汇编语言描述 11
1.8 记数系统的回顾 13
1.8.1 位置系数和权值 13
1.8.2 二进制和十六进制表示 14
1.8.3 带符号整数 15
本章总结 16
参考文献 16
练习题 18
第2章 计算机结构和数据表示 20
2.1 计算机结构 20
2.1.2 存储器 21
2.1.1 中央处理器 21
2.1.3 输入输出系统 23
2.2 指令的执行 24
2.3 指令集体系结构的类别 25
2.4 向64位体系结构过渡 26
2.5 安腾体系结构的信息单位和数据类型 28
2.5.1 整数 29
2.5.2 浮点数 29
2.5.3 字母数字字符 32
本章总结 35
参考文献 35
练习题 36
3.1 编程环境 38
第3章 汇编程序和调试程序 38
3.2 程序开发步骤 39
3.3 比较源文件的不同 41
3.4 汇编语句的类型 42
3.4.1 语句格式 42
3.4.2 符号地址 43
3.4.3 汇编语言操作符的种类 43
3.5 符号汇编程序的功能 44
3.5.1 常量 44
3.5.2 符号或标识符 45
3.5.3 存储器分配 45
3.5.4 单元计数器 47
3.5.5 表达式 48
3.5.7 清单文件的组成部分 49
3.5.6 控制语句 49
3.6 汇编过程 51
3.7 连接过程 52
3.8 调试程序 55
3.8.1 调试程序的功能 55
3.8.2 使用gdb(Linux?和HP-UX?)运行SQUARES 56
3.8.3 使用adb(HP-UX)运行SQUARES 57
3.8.4 调试命令举例 58
3.9 编写程序的约定 61
本章总结 62
参考文献 62
练习题 63
第4章 安腾指令格式和寻址方式 65
4.1.1 指令包 66
4.1 安腾指令格式概述 66
4.1.2 指令位字段格式 67
4.1.3 安腾指令类型 67
4.2 整数算术指令 69
4.2.1 加法和减法 69
4.2.2 算术溢出 70
4.2.3 左移相加指令 71
4.2.4 算术操作的特殊情况 71
4.2.5 16位带符号整数的乘法 72
4.2.6 全宽度的乘法和除法 73
4.3 安腾指令的位编码 73
4.4 HEXNUM:使用算术指令 76
4.5.1 安腾高速缓存结构 78
4.5 数据存取指令 78
4.5.2 整型存储指令 80
4.5.3 整型装入指令 80
4.5.4 长立即数传送指令 81
4.5.5 存取简单的记录结构 82
4.5.6 存取专用CPU寄存器 83
4.6 其他ALU指令 84
4.6.1 符号扩展指令 84
4.6.2 零扩展指令 85
4.6.3 宽度小于64位的指令 85
4.7 DOTPROD:使用数据存取指令 85
4.8.3 寄存器间接寻址 88
4.8.2 寄存器直接寻址 88
4.8.1 立即寻址 88
4.8 安腾寻址方式 88
4.8.4 自动增量寻址 89
4.8.5 安腾寻址方式小结 89
4.8.6 前面程序中的寻址细节 89
4.9 其他体系结构中的寻址 94
4.9.1 基于寄存器间接寻址的方式 94
4.9.2 基于偏移寻址的方式 94
4.9.3 体系结构寻址方式的比较 95
本章总结 96
参考文献 96
练习题 96
5.1 控制流的硬件基础 99
第5章 比较、转移和判断 99
5.1.1 条件码 100
5.1.2 状态管理方法 100
5.1.3 谓词寄存器 101
5.2 整数比较指令 102
5.2.1 带符号比较和等式 102
5.2.2 无符号比较 103
5.3 程序转移 104
5.3.1 普通转移指令 104
5.3.2 转移的时间考虑 105
5.3.3 if...then...else结构 106
5.3.4 循环结构 108
5.3.6 局部性和程序性能 109
5.3.5 转移的寻址范围 109
5.4 DOTLOOP:使用计数循环 110
5.5 暂停、指令组和性能 111
5.5.1 DOTLOOP中的暂停和分组 111
5.5.2 数据相关性的简化规则 113
5.5.3 安腾汇编程序处理暂停的方法 115
5.5.4 循环的局部标号 115
5.5.5 循环、转移和整体性能 115
5.6 DOTCLOOP:使用循环计数寄存器 115
5.7 其他结构化程序设计成分 117
5.7.1 无条件比较指令 118
5.7.2 嵌套的if...then...else结构 118
5.7.3 多路转移 119
5.7.4 简单的分情况结构 120
5.8 MAXIMUM:使用条件指令 122
本章总结 123
参考文献 124
练习题 124
第6章 逻辑操作、移位操作和字节操作 126
6.1 逻辑函数 126
6.1.1 两个变量的布尔函数 126
6.1.2 逻辑指令 128
6.1.3 逻辑函数的应用 128
6.1.4 一位测试指令 129
6.1.5 并行(逻辑)条件 130
6.1.6 加法的逻辑基础 131
6.2 HEXNUM2:使用逻辑掩码 132
6.3 位操作和字段操作 134
6.3.1 移位指令 134
6.3.2 移位操作的应用 135
6.3.3 右移对指令 135
6.3.4 提取指令和存放指令 135
6.4 SCANTEXT:处理字节 137
6.5 整数乘法和除法 138
6.5.1 乘法的Booth算法 138
6.5.2 无符号乘法 141
6.5.3 使用已知倒数的除法 141
6.6 DECNUM:将整数转换成十进制格式 143
6.7 使用C语言进行ASCII输入和输出 145
6.7.2 IO_C:一个简单的测试程序 146
6.7.1 GETPUT:封装C函数 146
6.7.3 其他概念 148
6.8 BACKWARD:使用字节操作 148
本章总结 150
参考文献 151
练习题 152
第7章 子例程、过程和函数 155
7.1 存储器栈 155
7.1.1 CISC体系结构的栈寻址 155
7.1.2 装入/存储体系结构的栈寻址 156
7.1.3 安腾体系结构的栈寻址 156
7.1.4 用户定义的栈 158
7.2 DECNUM2:使用栈操作 159
7.3 寄存器栈 161
7.3.1 SPARC?寄存器窗 162
7.3.2 安腾寄存器栈 163
7.3.3 alloc指令 163
7.3.4 寄存器栈引擎(RSE) 164
7.3.5 存储体寄存器 164
7.4 程序分段 165
7.4.1 源级模块性 165
7.4.2 传统子例程 166
7.4.3 协同例程 166
7.4.4 过程和函数 167
7.4.5 共享库函数 167
7.5 调用约定 167
7.5.2 调用和返回转移指令 168
7.5.1 寄存器竞争和使用约定 168
7.5.3 变元传送:位置 171
7.5.4 变元传送:方法 172
7.5.5 开始部分和结束部分 172
7.5.6 .regstk命令 176
7.6 DECNUM3和BOOTH:建立一个函数 176
7.6.1 定义接口 176
7.6.2 BOOTH:可调用的函数 177
7.6.3 DECNUM3:测试程序 178
7.6.4 位置独立的代码 180
7.7 整数商和余数 181
7.7.1 高级语言使用的例程 181
7.8 RANDOM:一个可调用的函数 182
7.7.2 Intel公司的开放源例程 182
7.8.1 选择一个算法 183
7.8.2 RANDOM:函数的开发 183
7.8.3 高级语言调用程序 186
本章总结 187
参考文献 188
练习题 189
第8章 浮点操作 191
8.1 整数指令和浮点指令之间的并行性 191
8.2 浮点值的表示 192
8.2.1 IEEE特殊值 192
8.2.2 安腾浮点寄存器中的值 193
8.3.1 浮点存储指令 194
8.3 复制浮点数据 194
8.3.2 浮点装入指令 195
8.3.3 浮点装入对指令 196
8.3.4 用于寄存器-寄存器复制的浮点伪指令 197
8.3.5 浮点合并指令 198
8.4 浮点算术指令 198
8.4.1 加法、减法和乘法 198
8.4.2 熔丝型乘-加和乘-减指令 199
8.4.3 规范化为另一个特例 200
8.4.4 最大值和最小值操作 200
8.4.5 舍入、异常和浮点控制 200
8.5 HORNER:计算一个多项式 201
8.6 基于浮点值的判断 203
8.6.1 浮点比较指令 204
8.6.2 浮点类指令 204
8.7 浮点执行部件中的整数操作 205
8.7.1 数据转换指令 206
8.7.2 整数乘法指令 208
8.7.3 乘法策略 209
8.7.4 浮点逻辑指令 209
8.8 倒数和平方根的近似 209
8.8.1 浮点倒数的近似 210
8.8.2 倒数平方根的近似 211
8.8.3 浮点除法 211
8.9 APPROXPI:使用浮点指令 212
8.8.4 Intel公司的开放源例程 212
本章总结 216
参考文献 216
练习题 217
第9章 文本的输入和输出 219
9.1 文件系统 220
9.1.1 Unix?I/O软件 220
9.1.2 Linux?I/O软件 221
9.2 键盘和显示器I/O 221
9.2.1 未格式化的I/O行 221
9.2.2 格式化的I/O 222
9.3 SCANTERM:使用C的标准I/O 223
9.4 SORTSTR:排序串 226
9.5.1 目录级的访问 230
9.5 文本文件I/O 230
9.5.2 未格式化的I/O行 231
9.5.3 格式化的I/O 232
9.6 SCANFILE:文件的输入输出 232
9.7 SORTINT:对文件中的整数进行排序 236
9.8 二进制文件 240
本章总结 241
参考文献 241
练习题 241
第10章 性能考虑 244
10.1 处理器级的并行性 244
10.1.1 简化的指令流水线 244
10.1.2 超标量流水线 245
10.1.3 安腾2处理器流水线 246
10.1.4 流水线冒险 247
10.2 指令级并行性 249
10.2.1 RISC方法 249
10.2.2 VLIW思想 250
10.2.3 EPIC:体系结构发展的一个方向 250
10.3 安腾处理器中的显式并行性 250
10.3.1 指令模板 251
10.3.2 数据相关和猜测 254
10.3.3 控制相关和猜测 257
10.3.4 组合的控制和数据猜测 258
10.4 软件流水线循环 258
10.4.2 软件流水线 259
10.4.1 传统的循环展开 259
10.4.3 循环式寄存器 260
10.4.4 循环阶段 260
10.4.5 软件流水线的转移指令 261
10.5 按模调度一个循环 262
10.5.1 DOTCTOP:独立实现的调度 262
10.5.2 DOTCTOP2:安腾2处理器的调度 266
10.5.3 进一步的考虑 267
10.6 程序优化因素 269
10.6.1 指令宽度 269
10.6.2 寻址方式 270
10.6.3 指令能力 270
10.6.4 程序长度 270
10.6.7 指令重新排序 271
10.6.6 直接插入式函数的使用 271
10.6.5 将数据预取到高速缓存中 271
10.6.8 递归及相关因素 272
10.7 斐波纳契数 272
10.7.1 FIB1:使用递归的函数 273
10.7.2 FIB2:无递归的函数 275
10.7.3 FIB3:使用寄存器栈的函数 275
10.7.4 TESTFIB:显示递归的开销 276
本章总结 278
参考文献 278
练习题 279
第11章 查看编译程序的输出 281
11.1 类RISC系统的编译程序 281
11.1.1 开放源码编译程序的优化级别 282
11.1.2 Intel编译程序的优化级别 283
11.1.3 HP UX编译程序的优化级别 284
11.1.4 附加的优化可能性 284
11.2 编译一个简单程序 285
11.2.1 比较gcc和ecc(Linux)的输出 286
11.2.2 比较gcc和g77(Linux)的输出 289
11.2.3 比较cc_bundled和f90(HP-UX)的输出 292
11.3 优化一个简单程序 295
11.3.1 比较g77(Linux)的-O1级别和-O2级别的输出 296
11.3.2 编译程序信息 298
11.3.3 f90(HP-UX)的循环的长度和优化 299
11.4 直接插入式优化 304
11.6 调试经过优化的程序 306
11.5 剖面制导的优化或其他优化 306
11.7 重访斐波纳契数的递归 307
本章总结 309
参考文献 310
练习题 311
第12章 并行操作 313
12.1 计算系统的分类 313
12.2 整数并行操作 315
12.3 整数乘法的应用 316
12.3.1 源操作数32×32位得到32位无符号乘积 316
12.3.2 源操作数32×32位得到64位无符号数 317
12.5 浮点并行操作 319
12.4 机遇和挑战 319
12.6 支持并行处理的信号量 320
12.6.1 先前的体系结构 321
12.6.2 安腾体系结构 321
本章总结 324
参考文献 324
练习题 325
第13章 实现方法的变异 326
13.1 为什么改变实现方法 327
13.1.1 需求和机遇 327
13.1.2 摩尔定律的含义 327
13.1.3 期望体系结构具有较长的生命周期 328
13.2 如何改变实现方法 328
13.3.1 与安腾2处理器的对比 329
13.3 最初的安腾处理器 329
13.3.2 高速缓存的层次结构 330
13.3.3 执行部件和发射端口 331
13.3.4 流水线 331
13.3.5 等待因子 332
13.3.6 转移预测 332
13.3.7 其他区别和特征 334
13.4 软件的主要作用 334
13.4.1 新的体系结构 335
13.4.2 新的实现方法 335
13.4.3 新的指令或者更多的寄存器 336
13.6 确定扩展和实现方案 337
13.5 IA-32指令集模式 337
本章总结 338
参考文献 338
练习题 340
附录A 命令行环境 341
参考文献 344
练习题 344
附录B 推荐的系统资源 345
B.1 系统硬件 345
B.1.1 安腾工作站或服务器 345
B.1.2 IA-32 Linux系统上的Ski模拟器 345
B.1.3 Linux虚拟机上的Ski模拟器 346
B.1.4 其他模拟器 346
B.2.1 Linux 347
B.2.2 HP-UX 347
B.2 系统软件 347
B.2.3 Ski模拟器 348
B.2.4 64位Windows? 350
B.2.5 FreeBSD 350
B.2.6 OpenVMS? 351
B.3 桌面客户访问软件 351
B.3.1 Linux个人计算机 351
B.3.2 Macintosh个人计算机 351
B.3.3 Windows个人计算机 352
参考文献 353
附录C 安腾指令集 354
表C-1 按功能排列的安腾指令 354
表C-2 按汇编程序操作码排列的安腾指令 360
参考文献 366
附录D 安腾寄存器及其用途 367
D.1 指令指示字 367
D.2 通用寄存器和NaT位 367
D 3 谓词寄存器 369
D.4 转移寄存器 369
D.5 浮点寄存器 370
D.6 应用寄存器 370
D.7 状态管理寄存器 372
D.8 系统信息寄存器 373
D.9 系统控制寄存器 373
参考文献 374
E.1 显式停止的干扰 375
附录E 条件汇编和宏(GCC汇编程序) 375
E.2 重复块 376
E.2.1 简单重复块 376
E.2.2 使用.irp命令的不定重复块 377
E.2.3 使用.irpc命令的不定重复块 378
E.3 条件汇编 379
E.4 宏的处理 380
E.4.1 宏的定义 381
E.4.2 宏的调用 381
E 4.3 定位参数的处理 383
E.4.4 默认值和关键词参数的处理 383
E.4.5 串参数的处理 384
E.5 宏标号的使用 384
E.6 递归宏 385
E.7 目标文件段 386
E.8 MONEY:用于说明段的宏 387
本章总结 389
参考文献 390
练习题 390
附录F 直接插入式汇编 392
F.1 HP-UX的C编译程序 392
F.2 用于Linux的GCC编译程序 394
F.3 Intel的Linux编译程序 395
参考文献 395
参考文献汇总 396
部分练习题答案及提示 403
术语表 410