彙編語言:基於x86處理器(原書第8版) Assembly Language for x86 Processors

Kip R.Irvine 譯 吳為民

買這商品的人也買了...

商品描述

本書專門為Intel/Windows/DOS平台編寫,
對彙編語言進行了完整且詳細的研究和講解,教授讀者在機器級編寫和調試程序。
第1~9章包含彙編語言的基本概念、x86處理器架構、彙編語言基礎、
過程等核心概念,後續章節講解了結構和宏、MS-Windows編程、浮點數處理和指令編碼等內容。
本書不僅可作為彙編語言課程的教材,
還可以作為計算機系統基礎和體系結構基礎方面的教材,符合國內所提倡的系統觀教學理念。
書中不僅講授具體問題的解決方案,而且注重幫助學生舉一反三,
綜合應用,學到的編程理念能順利應用於其他編程的課程中。

作者簡介

Kip R. Irvine
擁有邁阿密大學計算機科學碩士、音樂藝術博士學位,
現為佛羅里達國際大學高級講師,教授計算機相關的課程。
他著有多本編程教材,這些書被翻譯成多國語言,
涵蓋的主題包括彙編語言、C++、Visual Basic和COBOL。

目錄大綱

譯者序
前言
關於作者
相關碼表
第1章 基本概念    1
1.1 歡迎來到彙編語言的世界    1
1.1.1 讀者可能會問的問題    2
1.1.2 彙編語言的應用    4
1.1.3 本節回顧    5
1.2 虛擬機概念    5
1.2.1 本節回顧    6
1.3 數據表示    7
1.3.1 二進制整數    7
1.3.2 二進制加法    9
1.3.3 整數存儲大小    9
1.3.4 十六進制整數    10
1.3.5 十六進制加法    11
1.3.6 有符號二進制整數    12
1.3.7 二進制減法    14
1.3.8 字符存儲    14
1.3.9 二進制編碼的十進制數    16
1.3.10 本節回顧    16
1.4 布爾表達式    17
1.4.1 布爾函數的真值表    18
1.4.2 本節回顧    19
1.5 本章小結    20
1.6 關鍵術語    20
1.7 複習題和練習    21
1.7.1 簡答題    21
1.7.2 算法題    22
第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 本節回顧    27
2.2 32位x86處理器    27
2.2.1 操作模式    27
2.2.2 基本執行環境    28
2.2.3 x86內存管理    30
2.2.4 本節回顧    31
2.3 64位x86-64處理器    31
2.3.1 64位操作模式    32
2.3.2 基本的64位執行環境    32
2.3.3 本節回顧    33
2.4 典型x86計算機的組件    33
2.4.1 母板    33
2.4.2 內存    35
2.4.3 本節回顧    35
2.5 輸入/輸出系統    36
2.5.1 I/O訪問層次    36
2.5.2 本節回顧    38
2.6 本章小結    38
2.7 關鍵術語    39
2.8 複習題    40
第3章 彙編語言基礎    41
3.1 基本語言元素    41
3.1.1 第一個彙編語言程序    41
3.1.2 整數字面量    42
3.1.3 常整數表達式    43
3.1.4 實數字面量    43
3.1.5 字符字面量    44
3.1.6 字符串字面量    44
3.1.7 保留字    44
3.1.8 標識符    45
3.1.9 偽指令    45
3.1.10 指令    46
3.1.11 本節回顧    48
3.2 示例:整數加減法    48
3.2.1 AddTwo程序    48
3.2.2 運行和調試AddTwo程序    50
3.2.3 程序模板    54
3.2.4 本節回顧    54
3.3 彙編、鏈接和運行程序    55
3.3.1 彙編–鏈接–執行週期    55
3.3.2 列表文件    55
3.3.3 本節回顧    57
3.4 定義數據    57
3.4.1 內部數據類型    57
3.4.2 數據定義語句    58
3.4.3 向AddTwo程序添加一個變量    58
3.4.4 定義BYTE和SBYTE數據    59
3.4.5 定義WORD和SWORD數據    61
3.4.6 定義DWORD和SDWORD數據    61
3.4.7 定義QWORD數據    62
3.4.8 定義壓縮的BCD(TBYTE)數據    62
3.4.9 定義浮點類型    62
3.4.10 變量相加程序    63
3.4.11 小端序    64
3.4.12 聲明未初始化數據    64
3.4.13 本節回顧    65
3.5 符號常量    65
3.5.1 等號偽指令    66
3.5.2 計算數組和字符串的大小    67
3.5.3 EQU偽指令    68
3.5.4 TEXTEQU偽指令    68
3.5.5 本節回顧    69
3.6 64位編程介紹    70
3.7 本章小結    71
3.8 關鍵術語    72
3.8.1 術語    72
3.8.2 指令、操作符及偽指令    72
3.9 複習題和練習    73
3.9.1 簡答題    73
3.9.2 算法題    73
3.10 編程練習    74
第4章 數據傳送、尋址及算術運算    75
4.1 數據傳送指令    75
4.1.1 引言    75
4.1.2 操作數類型    75
4.1.3 直接內存操作數    76
4.1.4 MOV指令    77
4.1.5 整數的零/符號擴展    78
4.1.6 LAHF和SAHF指令    79
4.1.7 XCHG指令    80
4.1.8 直接–偏移量操作數    80
4.1.9 傳送數據的示例    81
4.1.10 本節回顧    83
4.2 加法和減法    84
4.2.1 INC和DEC指令    84
4.2.2 ADD指令    84
4.2.3 SUB指令    85
4.2.4 NEG指令    85
4.2.5 實現算術表達式    85
4.2.6 加減法影響的標誌    86
4.2.7 示例程序(AddSubTest)    88
4.2.8 本節回顧    89
4.3 與數據相關的操作符和偽指令    90
4.3.1 OFFSET操作符    90
4.3.2 ALIGN偽指令    91
4.3.3 PTR操作符    92
4.3.4 TYPE操作符    92
4.3.5 LENGTHOF操作符    93
4.3.6 SIZEOF操作符    93
4.3.7 LABEL偽指令    94
4.3.8 本節回顧    94
4.4 間接尋址    94
4.4.1 間接操作數    94
4.4.2 數組    95
4.4.3 變址操作數    96
4.4.4 指針    97
4.4.5 本節回顧    99
4.5 JMP和LOOP指令    100
4.5.1 JMP指令    100
4.5.2 LOOP指令    101
4.5.3 在Visual Studio調試器中顯示數組    102
4.5.4 整數數組求和    103
4.5.5 複製字符串    103
4.5.6 本節回顧    104
4.6 64位編程    105
4.6.1 MOV指令    105
4.6.2 64位版本的SumArray程序    105
4.6.3 加法和減法    106
4.6.4 本節回顧    107
4.7 本章小結    107
4.8 關鍵術語    109
4.8.1 術語    109
4.8.2 指令、操作符及偽指令    109
4.9 複習題和練習    109
4.9.1 簡答題    109
4.9.2 算法題    111
4.10 編程練習    112
第5章 過程    113
5.1 堆棧操作    113
5.1.1 運行時堆棧(32位模式)    113
5.1.2 PUSH和POP指令    115
5.1.3 本節回顧    118
5.2 定義和使用過程    118
5.2.1 PROC偽指令    118
5.2.2 CALL和RET指令    120
5.2.3 嵌套過程調用    120
5.2.4 向過程傳遞寄存器參數    121
5.2.5 示例:整數數組求和    122
5.2.6 保存和恢復寄存器    123
5.2.7 本節回顧    124
5.3 鏈接到外部庫    124
5.3.1 背景信息    125
5.3.2 本節回顧    125
5.4 Irvine32庫    126
5.4.1 創建庫的動機    126
5.4.2 Win32控制台窗口    127
5.4.3 各個過程的描述    128
5.4.4 庫測試程序    138
5.4.5 本節回顧    144
5.5 64位彙編編程    145
5.5.1 Irvine64庫    145
5.5.2 調用64位子例程    145
5.5.3 x64調用規約    146
5.5.4 調用過程的示例程序    146
5.5.5 本節回顧    147
5.6 本章小結    148
5.7 關鍵術語    149
5.7.1 術語    149
5.7.2 指令、操作符及偽指令    149
5.8 複習題和練習    149
5.8.1 簡答題    149
5.8.2 算法題    151
5.9 編程練習    152
第6章 條件處理    154
6.1 布爾和比較指令    154
6.1.1 CPU狀態標誌    154
6.1.2 AND指令    155
6.1.3 OR指令    156
6.1.4 位映射集    157
6.1.5 XOR指令    158
6.1.6 NOT指令    159
6.1.7 TEST指令    159
6.1.8 CMP指令    160
6.1.9 置位和清零各個CPU標誌    161
6.1.10 64位模式下的布爾指令    161
6.1.11 本節回顧    161
6.2 條件跳轉    162
6.2.1 條件結構    162
6.2.2 Jcond指令    162
6.2.3 條件跳轉指令的類型    163
6.2.4 條件跳轉應用    166
6.2.5 本節回顧    169
6.3 條件循環指令    170
6.3.1 LOOPZ和LOOPE指令    170
6.3.2 LOOPNZ和LOOPNE指令    170
6.3.3 本節回顧    171
6.4 條件結構    171
6.4.1 塊結構的IF語句    171
6.4.2 複合表達式    175
6.4.3 WHILE循環    176
6.4.4 表驅動的選擇    178
6.4.5 本節回顧    180
6.5 應用:有限狀態機    181
6.5.1 驗證輸入字符串    181
6.5.2 驗證有符號整數    182
6.5.3 本節回顧    185
6.6 條件控制流偽指令(可選主題)    186
6.6.1 創建IF語句    186
6.6.2 有符號數和無符號數的比較    188
6.6.3 複合表達式    189
6.6.4 用.REPEAT和.WHILE創建循環    191
6.7 本章小結    192
6.8 關鍵術語    193
6.8.1 術語    193
6.8.2 指令、操作符及偽指令    193
6.9 複習題和練習    194
6.9.1 簡答題    194
6.9.2 算法題    195
6.10 編程練習    196
6.10.1 對代碼測試的建議    196
6.10.2 習題描述    197
第7章 整數算術運算    200
7.1 移位和循環移位指令    200
7.1.1 邏輯移位和算術移位    200
7.1.2 SHL指令    201
7.1.3 SHR指令    202
7.1.4 SAL和SAR指令    202
7.1.5 ROL指令    203
7.1.6 ROR指令    204
7.1.7 RCL和RCR指令    204
7.1.8 有符號數溢出    205
7.1.9 SHLD/SHRD指令    205
7.1.10 本節回顧    207
7.2 移位和循環移位的應用    207
7.2.1 多個雙字的移位    208
7.2.2 通過移位做乘法    208
7.2.3 顯示二進制位    209
7.2.4 提取文件日期字段    210
7.2.5 本節回顧    210
7.3 乘法和除法指令    212
7.3.1 無符號整數乘法(MUL)    212
7.3.2 有符號整數乘法(IMUL)    213
7.3.3 測量程序執行時間    216
7.3.4 無符號整數除法(DIV)    217
7.3.5 有符號整數除法(IDIV)    219
7.3.6 實現算術表達式    222
7.3.7 本節回顧    224
7.4 擴展的加減法    225
7.4.1 ADC指令    225
7.4.2 擴展加法的示例    225
7.4.3 SBB指令    227
7.4.4 本節回顧    228
7.5 ASCII和非壓縮十進制算術運算    228
7.5.1 AAA指令    229
7.5.2 AAS指令    230
7.5.3 AAM指令    231
7.5.4 AAD指令    231
7.5.5 本節回顧    231
7.6 壓縮十進制的算術運算    232
7.6.1 DAA指令    232
7.6.2 DAS指令    233
7.6.3 本節回顧    233
7.7 本章小結    234
7.8 關鍵術語    235
7.8.1 術語    235
7.8.2 指令、操作符及偽指令    235
7.9 複習題和練習    235
7.9.1 簡答題    235
7.9.2 算法題    237
7.10 編程練習    237
第8章 高級過程    240
8.1 引言    240
8.2 堆棧幀    240
8.2.1 堆棧參數    240
8.2.2 寄存器參數的缺點    241
8.2.3 訪問堆棧參數    243
8.2.4 32位調用規約    245
8.2.5 局部變量    246
8.2.6 引用參數    247
8.2.7 LEA指令    248
8.2.8 ENTER和LEAVE指令    249
8.2.9 LOCAL偽指令    250
8.2.10 Microsoft x64調用規約    251
8.2.11 本節回顧    252
8.3 遞歸    252
8.3.1 遞歸求和    253
8.3.2 計算階乘    254
8.3.3 本節回顧    258
8.4 INVOKE、ADDR、PROC及PROTO    259
8.4.1 INVOKE偽指令    259
8.4.2 ADDR操作符    260
8.4.3 PROC偽指令    260
8.4.4 PROTO偽指令    263
8.4.5 參數分類    266
8.4.6 示例:交換兩個整數    266
8.4.7 調試提示    267
8.4.8 WriteStackFrame過程    267
8.4.9 本節回顧    268
8.5 創建多模塊程序    269
8.5.1 隱藏和導出過程名    269
8.5.2 調用外部過程    269
8.5.3 跨模塊使用變量和符號    270
8.5.4 示例:ArraySum程序    271
8.5.5 用Extern創建模塊    271
8.5.6 用INVOKE和PROTO創建模塊    274
8.5.7 本節回顧    277
8.6 參數的高級用法(可選主題)    277
8.6.1 受USES操作符影響的堆棧    277
8.6.2 向堆棧傳遞8位和16位參數    278
8.6.3 傳遞64位參數    279
8.6.4 非雙字局部變量    280
8.7 Java字節碼(可選主題)    281
8.7.1 Java虛擬機    281
8.7.2 指令集    282
8.7.3 Java反彙編示例    283
8.7.4 示例:條件分支    285
8.8 本章小結    287
8.9 關鍵術語    288
8.9.1 術語    288
8.9.2 指令、操作符及偽指令    288
8.10 複習題和練習    288
8.10.1 簡答題    288
8.10.2 算法題    289
8.11 編程練習    289
第9章 字符串和數組    291
9.1 引言    291
9.2 字符串原語指令    291
9.2.1 MOVSB、MOVSW及MOVSD    292
9.2.2 CMPSB、CMPSW及CMPSD    293
9.2.3 SCASB、SCASW及SCASD    293
9.2.4 STOSB、STOSW及STOSD    294
9.2.5 LODSB、LODSW及LODSD    294
9.2.6 本節回顧    294
9.3 若干字符串過程    295
9.3.1 Str_compare過程    295
9.3.2 Str_length過程    296
9.3.3 Str_copy過程    297
9.3.4 Str_trim過程    297
9.3.5 Str_ucase過程    299
9.3.6 字符串庫演示程序    300
9.3.7 Irvine64庫中的字符串過程    301
9.3.8 本節回顧    304
9.4 二維數組    304
9.4.1 行列順序    304
9.4.2 基址–變址操作數    305
9.4.3 基址–變址–位移操作數    306
9.4.4 64位模式下的基址–變址操作數    307
9.4.5 本節回顧    308
9.5 整數數組的查找和排序    308
9.5.1 冒泡排序    309
9.5.2 對半查找    310
9.5.3 本節回顧    315
9.6 Java字節碼:字符串處理(可選主題)    315
9.7 本章小結    316
9.8 關鍵術語和指令    317
9.9 複習題和練習    317
9.9.1 簡答題    317
9.9.2 算法題    318
9.10 編程練習    318
第10章 結構和宏    322
10.1 結構    322
10.1.1 定義結構    322
10.1.2 聲明結構對象    323
10.1.3 引用結構對象    324
10.1.4 示例:顯示系統時間    327
10.1.5 結構包含結構    329
10.1.6 示例:醉漢行走    329
10.1.7 聲明和使用聯合    332
10.1.8 本節回顧    334
10.2 宏    334
10.2.1 概述    334
10.2.2 定義宏    335
10.2.3 調用宏    336
10.2.4 其他宏特性    337
10.2.5 使用本書的宏庫(僅32位模式)    340
10.2.6 示例程序:封裝器    345
10.2.7 本節回顧    346
10.3 條件彙編偽指令    347
10.3.1 檢查缺失的參數    347
10.3.2 默認參數初始化值    348
10.3.3 布爾表達式    348
10.3.4 IF、ELSE及ENDIF偽指令    349
10.3.5 IFIDN和IFIDNI偽指令    349
10.3.6 示例:矩陣行求和    350
10.3.7 特殊操作符    353
10.3.8 宏函數    356
10.3.9 本節回顧    357
10.4 定義重複語句塊    357
10.4.1 WHILE偽指令    358
10.4.2 REPEAT偽指令    358
10.4.3 FOR偽指令    358
10.4.4 FORC偽指令    359
10.4.5 示例:鍊錶    360
10.4.6 本節回顧    361
10.5 本章小結    362
10.6 關鍵術語    363
10.6.1 術語    363
10.6.2 操作符及偽指令    363
10.7 複習題和練習    364
10.7.1 簡答題    364
10.7.2 算法題    364
10.8 編程練習    366
第11章 MS-Windows編程    368
11.1 Win32控制台編程    368
11.1.1 背景信息    368
11.1.2 Win32控制台函數    371
11.1.3 顯示消息框    373
11.1.4 控制台輸入    375
11.1.5 控制台輸出    380
11.1.6 讀寫文件    382
11.1.7 Irvine32庫中的文件I/O    385
11.1.8 測試文件I/O過程    386
11.1.9 控制台窗口操作    389
11.1.10 控制光標    392
11.1.11 控製文本顏色    392
11.1.12 時間和日期函數    394
11.1.13 使用64位Windows API    397
11.1.14 本節回顧    398
11.2 編寫圖形化的Windows應用程序    398
11.2.1 必要的結構    399
11.2.2 MessageBox函數    400
11.2.3 WinMain過程    400
11.2.4 WinProc過程    401
11.2.5 ErrorHandler過程    401
11.2.6 程序清單    402
11.2.7 本節回顧    405
11.3 動態內存分配    405
11.3.1 HeapTest程序    408
11.3.2 本節回顧    411
11.4 32位x86存儲管理    411
11.4.1 線性地址    412
11.4.2 頁轉換    414
11.4.3 本節回顧    416
11.5 本章小結    416
11.6 關鍵術語    417
11.7 複習題和練習    417
11.7.1 簡答題    417
11.7.2 算法題    418
11.8 編程練習    418
第12章 浮點數處理和指令編碼    420
12.1 浮點數的二進製表示    420
12.1.1 IEEE二進制浮點數表示    420
12.1.2 階數    421
12.1.3 規格化二進制浮點數    422
12.1.4 創建IEEE表示    422
12.1.5 將十進制分數轉換為二進制實數    424
12.1.6 本節回顧    425
12.2 浮點單元    425
12.2.1 FPU寄存器棧    426
12.2.2 舍入    428
12.2.3 浮點異常    429
12.2.4 浮點指令集    429
12.2.5 算術運算指令    432
12.2.6 比較浮點數值    435
12.2.7 讀寫浮點數值    437
12.2.8 異常同步    438
12.2.9 代碼示例    439
12.2.10 混合模式算術運算    440
12.2.11 屏蔽和非屏蔽異常    441
12.2.12 本節回顧    442
12.3 x86指令編碼    443
12.3.1 指令格式    443
12.3.2 單字節指令    444
12.3.3 將立即數送入寄存器    444
12.3.4 寄存器模式指令    445
12.3.5 處理器操作數大小前綴    446
12.3.6 內存模式指令    446
12.3.7 本節回顧    448
12.4 本章小結    449
12.5 關鍵術語    450
12.6 複習題和練習    450
12.6.1 簡答題    450
12.6.2 算法題    451
12.7 編程練習    452
第13章 高級語言接口    454
13.1 引言    454
13.1.1 通用規約    454
13.1.2 .MODEL偽指令    455
13.1.3 檢查編譯器生成的代碼    457
13.1.4 本節回顧    460
13.2 內聯彙編代碼    461
13.2.1 Visual C++中的_?_asm偽指令    461
13.2.2 文件加密示例    463
13.2.3 本節回顧    465
13.3 將32位彙編語言代碼鏈接到C/C++    466
13.3.1 IndexOf示例    466
13.3.2 調用C和C++函數    469
13.3.3 乘法表的示例    471
13.3.4 本節回顧    474
13.4 本章小結    474
13.5 關鍵術語    474
13.6 複習題    474
13.7 編程練習    475
第14章 16位MS-DOS編程    476
14.1 MS-DOS和IBM-PC    476
14.1.1 內存組織    476
14.1.2 重定向輸入/輸出    478
14.1.3 軟件中斷    478
14.1.4 INT指令    478
14.1.5 16位程序的代碼編寫    479
14.1.6 本節回顧    481
14.2 MS-DOS功能調用(INT 21h)    481
14.2.1 若干輸出功能    482
14.2.2 Hello World程序示例    483
14.2.3 若干輸入功能    484
14.2.4 日期/時間功能    487
14.2.5 本節回顧    490
14.3 標準的MS-DOS文件I/O服務    490
14.3.1 創建或打開文件(716Ch)    491
14.3.2 關閉文件句柄(3Eh)    492
14.3.3 移動文件指針(42h)    493
14.3.4 獲取文件創建日期和時間    493
14.3.5 若干庫過程    494
14.3.6 示例:讀取和復制一個文本文件    495
14.3.7 讀取MS-DOS命令的尾部    496
14.3.8 示例:創建二進製文件    498
14.3.9 本節回顧    501
14.4 本章小結    501
14.5 關鍵術語    503
14.6 編程練習    503
第15章 磁盤基礎知識    505
15.1 磁盤存儲系統    505
15.1.1 磁道、柱面及扇區    505
15.1.2 磁盤分區(卷)    506
15.1.3 本節回顧    507
15.2 文件系統    508
15.2.1 FAT12    508
15.2.2 FAT16    509
15.2.3 FAT32    509
15.2.4 NTFS    509
15.2.5 主磁盤區    510
15.2.6 本節回顧    510
15.3 磁盤目錄    511
15.3.1 MS-DOS目錄結構    512
15.3.2 MS-Windows中的長文件名    513
15.3.3 文件分配表    515
15.3.4 本節回顧    515
15.4 讀寫磁盤扇區    515
15.4.1 扇區顯示程序    517
15.4.2 本節回顧    520
15.5 系統級文件功能    520
15.5.1 獲取磁盤空閒空間(7303h)    520
15.5.2 創建子目錄(39h)    523
15.5.3 刪除子目錄(3Ah)    523
15.5.4 設置當前目錄(3Bh)    523
15.5.5 獲取當前目錄(47h)    524
15.5.6 獲取和設置文件屬性(7143h)    524
15.5.7 本節回顧    525
15.6 本章小結    525
15.7 關鍵術語    526
15.8 編程練習    526
第16章 BIOS級編程    528
16.1 引言    528
16.1.1 BIOS數據區    528
16.2 使用INT 16h進行鍵盤輸入    529
16.2.1 鍵盤如何工作    530
16.2.2 INT 16h功能    530
16.2.3 本節回顧    534
16.3 使用INT 10h進行視頻編程    534
16.3.1 基本背景    534
16.3.2 控制顏色    536
16.3.3 INT 10h視頻功能    537
16.3.4 庫過程示例    546
16.3.5 本節回顧    547
16.4 使用INT 10h繪製圖形    547
16.4.1 INT 10h與像素有關的功能    548
16.4.2 程序DrawLine    548
16.4.3 笛卡爾坐標程序    550
16.4.4 將笛卡爾坐標轉換為屏幕坐標    552
16.4.5 本節回顧    552
16.5 內存映射的圖形    553
16.5.1 模式13h:320×200,256色    553
16.5.2 內存映射圖形程序    554
16.5.3 本節回顧    556
16.6 鼠標編程    557
16.6.1 鼠標INT 33h功能    557
16.6.2 鼠標跟踪程序    561
16.6.3 本節回顧    565
16.7 本章小結    565
16.8 編程練習    566
網絡資源
附錄A MASM參考知識
附錄B x86指令集
附錄C BIOS和MS-DOS中斷
附錄D “本節回顧”的問題答案(第14~16章)
詞彙表