第1章 數制1
1.1 簡介1
1.2 按位記數制1
1.3 各數制的算術規(guī)則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 用加法器執(zhí)行減法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 指令的順序執(zhí)行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 三態(tài)緩沖器149
5.3.14 ROM151
5.4 時序邏輯電路153
5.4.1 SR觸發(fā)器153
5.4.2 時鐘控制D觸發(fā)器155
5.4.3 時鐘控制JK觸發(fā)器157
5.4.4 邊沿檢測157
5.4.5 T觸發(fā)器159
5.4.6 RAM159
5.4.7 二進制計數器160
5.4.8 寄存器161
5.4.9 時鐘和序列發(fā)生器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 序列發(fā)生器驅動的控制輸入端181
6.2.13 基本指令集的微代碼182
6.2.14 硬件/微代碼權衡187
6.3 在sim上使用新的微代碼189
6.3.1 如何使用!偽指令189
6.3.2 創(chuàng)建配置文件189
6.3.3 創(chuàng)建二進制微代碼191
6.3.4 用新指令集匯編192
6.3.5 在微級上跟蹤193
6.3.6 加密微代碼198
6.3.7 編寫并優(yōu)化復雜的微代碼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 確定動態(tài)局部變量和參數的地址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 分別匯編的優(yōu)點357
10.10 啟動代碼357
10.11 C++模塊的分別編譯367
10.12 問題371
第11章 用C++或Java實現匯編器和連接器376
11.1 簡介376
11.2 編寫匯編器376
11.2.1 一個簡單匯編器的規(guī)范377
11.2.2 操作碼表378
11.2.3 符號表380
11.2.4 使用二進制文件382
11.2.5 讀取輸入文本文件并創(chuàng)建標題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 一個簡單連接器的規(guī)范390
11.3.2 構建P、E、R和S表391
11.3.3 重定位地址并解析外部引用393
11.3.4添加庫支持395
11.4 問題396
第12章 最優(yōu)指令集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 鏈表——使用最優(yōu)指令集示例418
12.4 關于最優(yōu)指令集的進展報告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 難以執(zhí)行有符號數和無符號數比較426
12.4.14 難以執(zhí)行多字加法426
12.4.15 不支持位級操作427
12.5 問題427
第13章 使用、評估并實現最優(yōu)指令集和堆棧指令集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 虛函數和多態(tài)性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 比較最優(yōu)指令集和堆棧指令集491
13.6.9 關于JVM的幾點觀察492
13.7 編寫最優(yōu)和堆棧指令集的微代碼493
13.8 微編程的挑戰(zhàn)496
13.9 問題497
第14章 存儲系統(tǒng)503
14.1 簡介503
14.2 地址的傳送503
14.3 多程序系統(tǒng)505
14.4 直接存儲器存取505
14.5 分時系統(tǒng)506
14.6 重定位寄存器506
14.7 虛擬存儲器508
14.7.1 簡單分頁系統(tǒng)509
14.7.2 關聯(lián)存儲器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 執(zhí)行引擎的實現581
16.6 明智之舉:JVM使用堆棧體系結構582
16.7 一個簡單的例子582
16.8 常數池584
16.9 類文件格式585
16.10 字節(jié)碼的空間效率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虛擬機字節(jié)碼匯總(jvm.txt)620
附錄F ASCII匯總(ascii.txt)625
附錄G 數制匯總(number.txt)627
附錄H 了解C++對Java程序員的幫助628