齣版者的話
譯者序
前言
第1章 基本概念 1
1.1 歡迎來到匯編語言的世界 1
1.1.1 讀者可能會問的問題 2
1.1.2 匯編語言的應用 4
1.1.3 本節迴顧 5
1.2 虛擬機概念 5
1.3 數據錶示 7
1.3.1 二進製整數 7
1.3.2 二進製加法 8
1.3.3 整數存儲大小 9
1.3.4 十六進製整數 10
1.3.5 十六進製加法 11
1.3.6 有符號二進製整數 12
1.3.7 二進製減法 13
1.3.8 字符存儲 14
1.3.9 本節迴顧 15
1.4 布爾錶達式 16
1.4.1 布爾函數真值錶 18
1.4.2 本節迴顧 18
1.5 本章小結 19
1.6 關鍵術語 19
1.7 復習題和練習 20
1.7.1 簡答題 20
1.7.2 算法基礎 21
第2章 x86處理器架構 23
2.1 一般概念 23
2.1.1 基本微機設計 23
2.1.2 指令執行周期 24
2.1.3 讀取內存 25
2.1.4 加載並執行程序 26
2.1.5 本節迴顧 26
2.2 32位x86處理器 27
2.2.1 操作模式 27
2.2.2 基本執行環境 27
2.2.3 x86內存管理 30
2.2.4 本節迴顧 30
2.3 64位x86-64處理器 30
2.3.1 64位操作模式 31
2.3.2 基本64位執行環境 31
2.4 典型x86計算機組件 32
2.4.1 主闆 32
2.4.2 內存 34
2.4.3 本節迴顧 34
2.5 輸入輸齣係統 34
2.5.1 I/O訪問層次 34
2.5.2 本節迴顧 36
2.6 本章小結 36
2.7 關鍵術語 37
2.8 復習題 38
第3章 匯編語言基礎 39
3.1 基本語言元素 39
3.1.1 第一個匯編語言程序 39
3.1.2 整數常量 40
3.1.3 整型常量錶達式 41
3.1.4 實數常量 41
3.1.5 字符常量 42
3.1.6 字符串常量 42
3.1.7 保留字 42
3.1.8 標識符 43
3.1.9 僞指令 43
3.1.10 指令 44
3.1.11 本節迴顧 46
3.2 示例:整數加減法 46
3.2.1 AddTwo程序 46
3.2.2 運行和調試AddTwo程序 48
3.2.3 程序模闆 52
3.2.4 本節迴顧 52
3.3 匯編、鏈接和運行程序 53
3.3.1 匯編–鏈接–執行周期 53
3.3.2 列錶文件 53
3.3.3 本節迴顧 55
3.4 定義數據 55
3.4.1 內部數據類型 55
3.4.2 數據定義語句 55
3.4.3 嚮AddTwo程序添加一個變量 56
3.4.4 定義BYTE和SBYTE數據 57
3.4.5 定義WORD和SWORD數據 59
3.4.6 定義DWORD和SDWORD數據 59
3.4.7 定義QWORD數據 60
3.4.8 定義壓縮BCD(TBYTE)數據 60
3.4.9 定義浮點類型 61
3.4.10 變量加法程序 61
3.4.11 小端順序 62
3.4.12 聲明未初始化數據 62
3.4.13 本節迴顧 63
3.5 符號常量 63
3.5.1 等號僞指令 63
3.5.2 計算數組和字符串的大小 64
3.5.3 EQU僞指令 65
3.5.4 TEXTEQU僞指令 66
3.5.5 本節迴顧 66
3.6 64位編程 67
3.7 本章小結 68
3.8 關鍵術語 69
3.8.1 術語 69
3.8.2 指令、運算符和僞指令 70
3.9 復習題和練習 70
3.9.1 簡答題 70
3.9.2 算法基礎 71
3.10 編程練習 71
第4章 數據傳送、尋址和算術運算 73
4.1 數據傳送指令 73
4.1.1 引言 73
4.1.2 操作數類型 73
4.1.3 直接內存操作數 74
4.1.4 MOV指令 75
4.1.5 整數的全零/符號擴展 76
4.1.6 LAHF和SAHF指令 77
4.1.7 XCHG指令 78
4.1.8 直接–偏移量操作數 78
4.1.9 示例程序(Moves) 79
4.1.10 本節迴顧 80
4.2 加法和減法 81
4.2.1 INC和DEC指令 81
4.2.2 ADD指令 81
4.2.3 SUB指令 81
4.2.4 NEG指令 82
4.2.5 執行算術錶達式 82
4.2.6 加減法影響的標誌位 82
4.2.7 示例程序(AddSubTest) 85
4.2.8 本節迴顧 86
4.3 與數據相關的運算符和僞指令 87
4.3.1 OFFSET運算符 87
4.3.2 ALIGN僞指令 88
4.3.3 PTR運算符 88
4.3.4 TYPE運算符 89
4.3.5 LENGTHOF運算符 89
4.3.6 SIZEOF運算符 90
4.3.7 LABEL僞指令 90
4.3.8 本節迴顧 90
4.4 間接尋址 91
4.4.1 間接操作數 91
4.4.2 數組 91
4.4.3 變址操作數 92
4.4.4 指針 93
4.4.5 本節迴顧 95
4.5 JMP和LOOP指令 95
4.5.1 JMP指令 96
4.5.2 LOOP指令 96
4.5.3 在Visual Studio調試器中顯示數組 97
4.5.4 整數數組求和 98
4.5.5 復製字符串 98
4.5.6 本節迴顧 99
4.6 64位編程 99
4.6.1 MOV指令 99
4.6.2 64位的SumArray程序 100
4.6.3 加法和減法 101
4.6.4 本節迴顧 102
4.7 本章小結 102
4.8 關鍵術語 104
4.8.1 術語 104
4.8.2 指令、運算符和僞指令 104
4.9 復習題和練習 104
4.9.1 簡答題 104
4.9.2 算法基礎 106
4.10 編程練習 107
第5章 過程 108
5.1 堆棧操作 108
5.1.1 運行時堆棧(32位模式) 108
5.1.2 PUSH和POP指令 110
5.1.3 本節迴顧 112
5.2 定義並使用過程 112
5.2.1 PROC僞指令 112
5.2.2 CALL和RET指令 114
5.2.3 過程調用嵌套 115
5.2.4 嚮過程傳遞寄存器參數 116
5.2.5 示例:整數數組求和 116
5.2.6 保存和恢復寄存器 118
5.2.7 本節迴顧 119
5.3 鏈接到外部庫 119
5.3.1 背景知識 119
5.3.2 本節迴顧 120
5.4 Irvine32鏈接庫 120
5.4.1 創建庫的動機 120
5.4.2 概述 122
5.4.3 過程詳細說明 123
5.4.4 庫測試程序 133
5.4.5 本節迴顧 139
5.5 64位匯編編程 139
5.5.1 Irvine64鏈接庫 139
5.5.2 調用64位子程序 140
5.5.3 x64調用規範 140
5.5.4 調用過程示例 141
5.6 本章小結 142
5.7 關鍵術語 143
5.7.1 術語 143
5.7.2 指令、運算符和僞指令 143
5.8 復習題和練習 143
5.8.1 簡答題 143
5.8.2 算法基礎 146
5.9 編程練習 146
第6章 條件處理 148
6.1 條件分支 148
6.2 布爾和比較指令 148
6.2.1 CPU狀態標誌 149
6.2.2 AND指令 149
6.2.3 OR指令 150
6.2.4 位映射集 151
6.2.5 XOR指令 152
6.2.6 NOT指令 153
6.2.7 TEST指令 153
6.2.8 CMP指令 154
6.2.9 置位和清除單個CPU標誌位 155
6.2.10 64位模式下的布爾指令 155
6.2.11 本節迴顧 156
6.3 條件跳轉 156
6.3.1 條件結構 156
6.3.2 Jcond指令 156
6.3.3 條件跳轉指令類型 157
6.3.4 條件跳轉應用 159
6.3.5 本節迴顧 163
6.4 條件循環指令 163
6.4.1 LOOPZ和LOOPE指令 163
6.4.2 LOOPNZ和LOOPNE指令 164
6.4.3 本節迴顧 164
6.5 條件結構 164
6.5.1 塊結構的IF語句 165
6.5.2 復閤錶達式 167
6.5.3 WHILE循環 168
6.5.4 錶驅動選擇 169
6.5.5 本節迴顧 171
6.6 應用:有限狀態機 172
6.6.1 驗證輸入字符串 172
6.6.2 驗證有符號整數 172
6.6.3 本節迴顧 176
6.7 條件控製流僞指令 176
6.7.1 新建IF語句 177
6.7.2 有符號數和無符號數的比較 178
6.7.3 復閤錶達式 179
6.7.4 用.REPEAT和.WHILE創建循環 181
6.8 本章小結 182
6.9 關鍵術語 183
6.9.1 術語 183
6.9.2 指令、運算符和僞指令 184
6.10 復習題和練習 184
6.10.1 簡答題 184
6.10.2 算法基礎 186
6.11 編程練習 187
6.11.1 測試代碼的建議 187
6.11.2 習題 188
第7章 整數運算 191
7.1 移位和循環移位指令 191
7.1.1 邏輯移位和算術移位 191
7.1.2 SHL指令 192
7.1.3 SHR指令 193
7.1.4 SAL和SAR指令 193
7.1.5 ROL指令 194
7.1.6 ROR指令 195
7.1.7 RCL和RCR指令 195
7.1.8 有符號數溢齣 196
7.1.9 SHLD/SHRD指令 196
7.1.10 本節迴顧 198
7.2 移位和循環移位的應用 198
7.2.1 多個雙字的移位 198
7.2.2 二進製乘法 199
7.2.3 顯示二進製位 200
7.2.4 提取文件日期字段 200
7.2.5 本節迴顧 201
7.3 乘法和除法指令 201
7.3.1 MUL指令 201
7.3.2 IMUL指令 203
7.3.3 測量程序執行時間 205
7.3.4 DIV指令 207
7.3.5 有符號數除法 208
7.3.6 實現算術錶達式 211
7.3.7 本節迴顧 212
7.4 擴展加減法 212
7.4.1 ADC指令 212
7.4.2 擴展加法示例 213
7.4.3 SBB指令 215
7.4.4 本節迴顧 215
7.5 ASCII和非壓縮十進製運算 216
7.5.1 AAA指令 217
7.5.2 AAS指令 218
7.5.3 AAM指令 218
7.5.4 AAD指令 219
7.5.5 本節迴顧 219
7.6 壓縮十進製運算 219
7.6.1 DAA指令 220
7.6.2 DAS指令 220
7.6.3 本節迴顧 221
7.7 本章小結 221
7.8 關鍵術語 222
7.8.1 術語 222
7.8.2 指令、運算符和僞指令 222
7.9 復習題和練習 222
7.9.1 簡答題 222
7.9.2 算法基礎 224
7.10 編程練習 225
第8章 高級過程 227
8.1 引言 227
8.2 堆棧幀 227
8.2.1 堆棧參數 227
8.2.2 寄存器參數的缺點 228
8.2.3 訪問堆棧參數 230
8.2.4 32位調用規範 232
8.2.5 局部變量 233
8.2.6 引用參數 235
8.2.7 LEA指令 235
8.2.8 ENTER和LEAVE指令 236
8.2.9 LOCAL僞指令 238
8.2.10 Microsoft x64調用規範 239
8.2.11 本節迴顧 239
8.3 遞歸 239
8.3.1 遞歸求和 240
8.3.2 計算階乘 241
8.3.3 本節迴顧 246
8.4 INVOKE、ADDR、PROC和PROTO 246
8.4.1 INVOKE僞指令 246
8.4.2 ADDR運算符 247
8.4.3 PROC僞指令 247
8.4.4 PROTO僞指令 250
8.4.5 參數類彆 253
8.4.6 示例:交換兩個整數 253
8.4.7 調試提示 254
8.4.8 WriteStackFrame過程 255
8.4.9 本節迴顧 256
8.5 新建多模塊程序 256
8.5.1 隱藏和導齣過程名 256
8.5.2 調用外部過程 257
8.5.3 跨模塊使用變量和標號 258
8.5.4 示例:ArraySum程序 259
8.5.5 用Extern新建模塊 259
8.5.6 用INVOKE和PROTO新建模塊 262
8.5.7 本節迴顧 265
8.6 參數的高級用法(可選主題) 265
8.6.1 受USES運算符影響的堆棧 265
8.6.2 嚮堆棧傳遞8位和16位參數 266
8.6.3 傳遞64位參數 267
8.6.4 非雙字局部變量 268
8.7 Java字節碼(可選主題) 269
8.7.1 Java虛擬機 269
8.7.2 指令集 270
8.7.3 Java反匯編示例 271
8.7.4 示例:條件分支 273
8.8 本章小結 274
8.9 關鍵術語 275
8.9.1 術語 275
8.9.2 指令、運算符和僞指令 276
8.10 復習題和練習 276
8.10.1 簡答題 276
8.10.2 算法基礎 276
8.11 編程練習 277
第9章 字符串和數組 279
9.1 引言 279
9.2 字符串基本指令 279
9.2.1 MOVSB、MOVSW和MOVSD 280
9.2.2 CMPSB、CMPSW和CMPSD 280
9.2.3 SCASB、SCASW和SCASD 281
9.2.4 STOSB、STOSW和STOSD 282
9.2.5 LODSB、LODSW和LODSD 282
9.2.6 本節迴顧 282
9.3 部分字符串過程 283
9.3.1 Str_compare過程 283
9.3.2 Str_length過程 284
9.3.3 Str_copy過程 284
9.3.4 Str_trim過程 285
9.3.5 Str_ucase過程 287
9.3.6 字符串庫演示程序 288
9.3.7 Irivne64庫中的字符串過程 289
9.3.8 本節迴顧 291
9.4 二維數組 291
9.4.1 行列順序 291
9.4.2 基址–變址操作數 292
9.4.3 基址–變址–偏移量操作數 294
9.4.4 64位模式下的基址–變址操作數 294
9.4.5 本節迴顧 295
9.5 整數數組的檢索和排序 295
9.5.1 冒泡排序 295
9.5.2 對半查找 297
9.5.3 本節迴顧 302
9.6 Java字節碼:字符串處理(可選主題) 302
9.7 本章小結 303
9.8 關鍵術語和指令 304
9.9 復習題和練習 304
9.9.1 簡答題 304
9.9.2 算法基礎 305
9.10 編程練習 305
第10章 結構和宏 308
10.1 結構 308
10.1.1 定義結構 308
10.1.2 聲明結構變量 309
10.1.3 引用結構變量 310
10.1.4 示例:顯示係統時間 313
10.1.5 結構包含結構 315
10.1.6 示例:醉漢行走 315
10.1.7 聲明和使用聯閤 318
10.1.8 本節迴顧 320
10.2 宏 320
10.2.1 概述 320
10.2.2 定義宏 321
10.2.3 調用宏 322
10.2.4 其他宏特性 323
10.2.5 使用本書的宏庫(僅32位模式) 326
10.2.6 示例程序:封裝器 332
10.2.7 本節迴顧 333
10.3 條件匯編僞指令 333
10.3.1 檢查缺失的參數 333
10.3.2 默認參數初始值設定 334
10.3.3 布爾錶達式 335
10.3.4 IF、ELSE和ENDIF僞指令 335
10.3.5 IFIDN和IFIDNI僞指令 336
10.3.6 示例:矩陣行求和 336
10.3.7 特殊運算符 339
10.3.8 宏函數 342
10.3.9 本節迴顧 343
10.4 定義重復語句塊 344
10.4.1 WHILE僞指令 344
10.4.2 REPEAT僞指令 344
10.4.3 FOR僞指令 345
10.4.4 FORC僞指令 345
10.4.5 示例:鏈錶 346
10.4.6 本節迴顧 347
10.5 本章小結 348
10.6 關鍵術語 349
10.6.1 術語 349
10.6.2 運算符和僞指令 349
10.7 復習題和練習 349
10.7.1 簡答題 349
10.7.2 算法基礎 350
10.8 編程練習 351
第11章 MS-Windows編程 354
11.1 Win32控製颱編程 354
11.1.1 背景知識 354
11.1.2 Win32控製颱函數 357
11.1.3 顯示消息框 359
11.1.4 控製颱輸入 361
11.1.5 控製颱輸齣 366
11.1.6 讀寫文件 368
11.1.7 Irvine32鏈接庫的文件I/O 371
11.1.8 測試文件I/O過程 373
11.1.9 控製颱窗口操作 375
11.1.10 控製光標 378
11.1.11 控製文本顔色 379
11.1.12 時間與日期函數 380
11.1.13 使用64位Windows API 383
11.1.14 本節迴顧 384
11.2 編寫圖形化的Windows應用程序 384
11.2.1 必要的結構 385
11.2.2 MessageBox函數 386
11.2.3 WinMain過程 387
11.2.4 WinProc過程 387
11.2.5 ErrorHandler過程 388
11.2.6 程序清單 388
11.2.7 本節迴顧 391
11.3 動態內存分配 391
11.3.1 HeapTest程序 394
11.3.2 本節迴顧 397
11.4 x86存儲管理 397
11.4.1 綫性地址 398
11.4.2 頁轉換 400
11.4.3 本節迴顧 401
11.5 本章小結 402
11.6 關鍵術語 403
11.7 復習題和練習 403
11.7.1 簡答題 403
11.7.2 算法基礎 404
11.8 編程練習 404
第12章 浮點數處理與指令編碼 406
12.1 浮點數二進製錶示 406
12.1.1 IEEE二進製浮點數錶示 406
12.1.2 階碼 407
12.1.3 規格化二進製浮點數 407
12.1.4 新建IEEE錶示 408
12.1.5 十進製小數轉換為二進製實數 409
12.1.6 本節迴顧 411
12.2 浮點單元 411
12.2.1 FPU寄存器棧 411
12.2.2 捨入 413
12.2.3 浮點數異常 414
12.2.4 浮點數指令集 414
12.2.5 算術運算指令 416
12.2.6 比較浮點數值 419
12.2.7 讀寫浮點數值 422
12.2.8 異常同步 423
12.2.9 代碼示例 423
12.2.10 混閤模式運算 425
12.2.11 屏蔽與未屏蔽異常 426
12.2.12 本節迴顧 427
12.3 x86指令編碼 427
12.3.1 指令格式 427
12.3.2 單字節指令 428
12.3.3 立即數送寄存器 428
12.3.4 寄存器模式指令 429
12.3.5 處理器操作數大小前綴 429
12.3.6 內存模式指令 430
12.3.7 本節迴顧 432
12.4 本章小結 432
12.5 關鍵術語 433
12.6 復習題和練習 434
12.6.1 簡答題 434
12.6.2 算法基礎 434
12.7 編程練習 435
第13章 高級語言接口 438
13.1 引言 438
13.1.1 通用規範 438
13.1.2 .MODEL僞指令 439
13.1.3 檢查編譯器生成的代碼 441
13.1.4 本節迴顧 444
13.2 內嵌匯編代碼 444
13.2.1 Visual C++中的__asm僞指令 444
13.2.2 文件加密示例 447
13.2.3 本節迴顧 449
13.3 32位匯編程序與C/C++的鏈接 449
13.3.1 IndexOf示例 450
13.3.2 調用C和C++函數 453
13.3.3 乘法錶示例 454
13.3.4 調用C庫函數 457
13.3.5 目錄錶程序 459
13.3.6 本節迴顧 461
13.4 本章小結 461
13.5 關鍵術語 462
13.6 復習題 462
13.7 編程練習 462
附錄A MASM參考知識 464
附錄B x86指令集 483
附錄C “本節迴顧”問題答案 510
索引 527
· · · · · · (
收起)