買這商品的人也買了...
-
$779$740 -
$773$734 -
$720$648 -
$834$792 -
$500$390 -
$750$675 -
$653C語言非常道
-
$774$735 -
$250匯編語言, 4/e
-
$714$678 -
$709CTF 競賽權威指南 (Pwn篇)
-
$404C/C++ 代碼調試的藝術
-
$594$564 -
$834$792 -
$680$530 -
$662二進制分析實戰
-
$620$490 -
$780$616 -
$862原子嵌入式 Linux 驅動開發詳解
-
$800$632 -
$479$455 -
$454擴散模型:生成式 AI 模型的理論、應用與代碼實踐
-
$880$695 -
$580$458 -
$599$569
相關主題
商品描述
《x86彙編語言:從實模式到保護模式》第二版修改方向
1,在書的前面添加基礎性的內容,用來說明彙編語言的由來和要性,
說明彙編語言編程的特點,以期平滑自然地進入彙編語言主題。
2,原書中對指令系統及x86指令格式的描述過於簡略,此版增補這部分內容;
3,讀者普遍反映第14章太難太緊湊,此版將相關內容拆分,降低學習的難度;
4,整個保護模式部分以現在的觀點來看,內容組織不夠合理,予以重新組織,配書代碼重新編寫和組織;
5,原書中有模糊的錯誤的表述,此版予以更正。
作者簡介
李忠
主要出版著作《穿越計算機的迷霧》
《x86彙編語言:從實模式到保護模式》
《穿越計算機的迷霧(第2版)》《C語言非常道》等。
目錄大綱
目錄
第1部分預備知識
第1章十六進制計數法 002
1.1 二進制計數法回顧 002
1.1.1 關於二進制計數法 002
1.1.2 二進製到十進制的轉換 003
1.1.3 十進製到二進制的轉換 003
1.2 十六進制計數法 004
1.2.1 十六進制計數法的原理 004
1.2.2 十六進製到十進制的轉換 005
1.2.3 十進製到十六進制的轉換 005
1.2.4 為什麼需要十六進制 006
1.3 使用Windows計算器方便你的學習過程 007
本章習題 008
第2章計算機和彙編語言 009
2.1 用電錶示數字 009
2.2 二進制加法機 010
2.3 具有記憶功能的器件——寄存器 011
2.4 帶寄存器的加法機 013
2.5 能做四則運算的機器 014
2.6 機器指令 015
2.7 內存 017
2.8 自動計算 021
2.9 處理器 023
2.10 彙編語言的誕生 025
本章習題 027
第3章分段機制和邏輯地址 028
3.1 寄存器和字長 028
3.2 內存訪問和字節序 029
3.3 古老的INTEL 8086處理器 030
3.3.1 8086的通用寄存器 030
3.3.2 程序的重定位難題 031
3.3.3 邏輯地址 034
3.3.4 8086的內存分段機制 036
本章習題 040
第4章彙編語言和彙編軟件 041
4.1 彙編語言程序 041
4.2 NASM編譯器 043
4.2.1 NASM的下載和安裝 043
4.2.2 代碼的書寫和編譯過程 044
4.2.3 用HexView觀察編譯後的機器代碼 047
4.3 配書文件包的下載和使用 048
本章習題 049
第2部分實模式
第5章虛擬機的安裝和使用 051
5.1 計算機的啟動過程 051
5.1.1 如何將編譯好的程序提交給處理器 051
5.1.2 計算機的加電和復位 052
5.1.3 基本輸入輸出系統 052
5.1.4 硬盤及其工作原理 054
5.1.5 一切從主引導扇區開始 055
5.2 創建和使用虛擬機 056
5.2.1 別害怕,虛擬機是軟件 056
5.2.2 下載和安裝Oracle VM VirtualBox 057
5.2.3 虛擬硬盤簡介 058
5.2.4 練習使用FixVhdWr工具向虛擬硬盤寫數據 059
第6章編寫主引導扇區代碼 063
6.1 本章代碼清單 063
6.2 歡迎來到主引導扇區 063
6.3 註釋 064
6.4 在屏幕上顯示文字 064
6.4.1 顯卡和顯存 064
5.4.2 初始化段寄存器 067
6.4.3 顯存的訪問和ASCII代碼 067
6.4.4 顯示字符 070
6.4.5 mov指令的格式 071
6.5 顯示標號的彙編地址 072
6.5.1 標號 072
6.5.2 如何顯示十進制數字 076
6.5.3 在程序中聲明並初始化數據 077
6.5.4 分解數的各個數位 078
6.5.5 顯示分解出來的各個數位 082
6.6 使程序進入無限循環狀態 083
6.7 完成並編譯主引導扇區代碼 085
6.7.1 主引導扇區有效標誌 085
6.7.2 代碼的保存和編譯 086
6.8 加載和運行主引導扇區代碼 086
6.8.1 把編譯後的指令寫入主引導扇區 086
6.8.2 啟動虛擬機觀察運行結果 087
6.9 程序的調試技術 087
6.9.1 開源的Bochs虛擬機軟件 087
6.9.2 Bochs下的程序調試入門 088
本章習題 094
第7章相同的功能,不同的代碼 095
7.1 代碼清單7-1 095
7.2 跳過非指令的數據區 095
7.3 在數據聲明中使用字面值 096
7.4 段地址的初始化 096
7.5 段之間的批量數據傳送 097
7.6 使用循環分解數位 099
7.7 計算機中的負數 101
7.7.1 無符號數和有符號數 101
7.7.2 處理器視角中的數據類型 104
7.8 數位的顯示 107
7.9 其他標誌位和條件轉移指令 108
7.9.1 奇偶標誌位PF 108
7.9.2 進位標誌CF 109
7.9.3 溢出標誌OF 109
7.9.4 現有指令對標誌位的影響 110
7.9.5 條件轉移指令 111
7.10 NASM編譯器的$和$$標記 113
7.11 觀察運行結果 114
7.12 本章程序的調試 114
7.12.1 調試命令“n”的使用 114
7.12.2 調試命令“u”的使用 115
7.12.3 用調試命令“info”查看標誌位 117
本章習題 118
?
第8章比高斯更快的計算 119
8.1 從1加到100的故事 119
8.2 代碼清單8-1 119
8.3 顯示字符串 119
8.4 計算1到100的累加和 120
8.5 累加和各個數位的分解與顯示 121
8.5.1 棧和棧段的初始化 121
8.5.2 分解各個數位並壓棧 121
8.5.3 出棧並顯示各個數位 124
8.5.4 進一步認識棧 125
8.6 程序的編譯和運行 127
8.6.1 觀察程序的運行結果 127
8.6.2 在調試過程中查看棧中內容 127
8.7 8086處理器的尋址方式 128
8.7.1 寄存器尋址 129
8.7.2 立即尋址 129
8.7.3 內存尋址 129
本章習題 134
第9章硬盤和顯卡的訪問與控制 135
9.1 本章代碼清單 136
9.2 用戶程序的結構 136
9.2.1 分段、段的彙編地址和段內彙編地址 136
9.2.2 用戶程序頭部 140
9.3 加載程序(器)的工作流程 142
9.3.1 初始化和決定加載位置 142
9.3.2 準備加載用戶程序 143
9.3.3 外圍設備及其接口 145
9.3.4 I/O端口和端口訪問 146
9.3.5 通過硬盤控制器端口讀扇區數據 148
9.3.6 過程調用 151
9.3.7 加載用戶程序 156
9.3.8 用戶程序重定位 157
9.3.9 將控制權交給用戶程序 161
9.3.10 8086處理器的無條件轉移指令 161
9.4 用戶程序的工作流程 164
9.4.1 初始化段寄存器和棧切換 164
9.4.2 調用字符串顯示例程 165
9.4.3 過程的嵌套 165
9.4.4 屏幕光標控制 166
9.4.5 取當前光標位置 167
9.4.6 處理回車和換行字符 168
9.4.7 顯示可打印字符 169
9.4.8 滾動屏幕內容 169
9.4.9 重置光標 170
9.4.10 切換到另一個代碼段中執行 170
9.4.11 訪問另一個數據段 171
9.5 編譯和運行程序並觀察結果 171
本章習題 172
第3部分保護模式
第10章中斷和動態時鐘顯示 174
10.1 外部硬件中斷 175
10.1.1 非屏蔽中斷 176
10.1.2 可屏蔽中斷 176
10.1.3 實模式下的中斷向量表 178
10.1.4 實時時鐘、CMOS RAM和BCD編碼 179
10.1.5 實時時鐘RTC的中斷信號 181
10.1.6 代碼清單10-1 185
10.1.7 初始化8259、RTC和中斷向量表 185
10.1.8 使處理器進入低功耗狀態 187
10.1.9 實時時鐘中斷的處理過程 187
10.1.10 代碼清單10-1的編譯和運行 190
10.2 內部中斷 191
10.3 軟中斷 191
10.3.1 BIOS中斷 192
10.3.2 代碼清單10-2 193
10.3.3 從鍵盤讀字符並顯示 193
10.3.4 代碼清單10-2的編譯和運行 194
本章習題 194
第11章32位x86處理器編程架構 195
11.1 IA-32架構的基本執行環境 195
11.1.1 寄存器的擴展 195
11.1.2 基本的工作模式 198
11.1.3 線性地址和分頁 199
11.2 現代處理器的結構和特點 200
11.2.1 流水線 200
11.2.2 高速緩存 201
11.2.3 亂序執行 201
11.2.4 寄存器重命名 202
11.2.5 分支目標預測 203
11.3 32位處理器的尋址方式 204
第12章進入保護模式 206
12.1 代碼清單12-1 207
12.2 全局描述符表 207
12.3 存儲器的段描述符 208
12.4 安裝存儲器的段描述符並加載GDTR 213
12.5 關於第21條地址線A20的問題 215
12.6 保護模式下的內存訪問 216
12.7 程序的運行和調試 221
12.7.1 運行程序並觀察結果 221
12.7.2 處理器剛加電時的段寄存器狀態 222
12.7.3 設置PE位後的段寄存器狀態 224
12.7.4 加載段寄存器DS之後的狀態 225
12.7.5 查看全局描述符表GDT 225
12.7.6 查看控制寄存器的內容 226
本章習題 226
第13章操作數和有效地址的尺寸 227
13.1 代碼清單13-1 227
13.2 INTEL 80286處理器的16位保護模式 227
13.3 指令的操作尺寸 228
13.3.1 16位操作尺寸 228
13.3.2 32位操作尺寸 229
13.3.3 默認操作尺寸 229
13.3.4 操作尺寸反轉前綴 232
13.3.5 編譯時的操作尺寸 234
13.4 清空流水線並串行化處理器 235
13.5 有效地址尺寸和內存訪問 237
13.6 一般指令在32位操作尺寸下的擴展 239
本章習題 241
第14章存儲器的保護 243
14.1 代碼清單14-1 243
14.2 進入32位保護模式 243
14.2.1 話說mov ds,ax和mov ds,eax 243
14.2.2 創建GDT並安裝段描述符 244
14.3 修改段寄存器時的保護 247
14.4 地址變換時的保護 249
14.4.1 代碼段執行時的保護 249
14.4.2 數據訪問時的保護 250
14.4.3 棧操作時的保護 251
14.5 使用別名訪問代碼段對字符排序 253
14.6 程序的編譯和運行 256
本章習題 256
第15章程序的動態加載和執行 257
15.1 本章代碼清單 258
15.2 內核的結構、功能和加載 258
15.2.1 內核的結構 258
15.2.2 內核的加載 259
15.2.3 安裝內核的段描述符 261
15.3 在內核中執行 265
15.4 用戶程序的加載和重定位 267
15.4.1 用戶程序的結構 267
15.4.2 計算用戶程序佔用的扇區數 268
15.4.3 簡單的動態內存分配 270
15.4.4 段的重定位和描述符的創建 271
15.4.5 重定位用戶程序內的符號地址 274
15.5 執行用戶程序 278
15.6 代碼的編譯、運行和調試 279
本章習題 281
第16章任務和特權級保護 282
16.1 任務的隔離和特權級保護 283
16.1.1 任務、任務的LDT和TSS 283
16.1.2 全局空間和局部空間 284
16.1.3 特權級保護概述 287
16.2 代碼清單16-1 295
16.3 內核程序的初始化 295
16.3.1 調用門 296
16.3.2 調用門的安裝和測試 299
16.4 加載用戶程序並創建任務 301
16.4.1 任務控制塊和TCB鏈 301
16.4.2 使用棧傳遞過程參數 304
16.4.3 加載用戶程序 306
16.4.4 創建局部描述符表 306
16.4.5 重定位U-SALT表 308
16.4.6 創建0、1和2特權級的棧 309
16.4.7 安裝LDT描述符到GDT中 309
16.4.8 任務狀態段TSS的格式 310
16.4.9 創建任務狀態段TSS 314
16.4.10 安裝TSS描述符到GDT中 315
16.4.11 帶參數的過程返回指令 315
16.5 用戶程序的執行 316
16.5.1 通過調用門轉移控制的完整過程 316
16.5.2 進入3特權級的用戶程序的執行 320
16.5.3 檢查調用者的請求特權級RPL 323
16.5.4 在Bochs中調試程序的新方法 324
本章習題 325
第17章協同式任務切換 326
17.1 本章代碼清單 326
17.2 任務切換前的設置 326
17.3 任務切換的方法 329
17.4 用jmp指令發起任務切換的實例 333
17.5 處理器在實施任務切換時的操作 340
17.6 程序的編譯和運行 342
本章習題 342
第18章中斷和異常的處理與搶占式多任務 343
18.1 中斷和異常 343
18.1.1 中斷和異常概述 343
18.1.2 中斷描述符表、中斷門和陷阱門 346
18.2 本章代碼清單 348
18.3 內核的加載和初始化 348
18.3.1 創建中斷描述符表 348
18.3.2 8259A芯片的初始化 352
18.3.3 中斷和異常處理程序的保護 354
18.3.4 中斷任務 355
18.3.5 錯誤代碼 357
18.3.6 用定時中斷實施任務切換 358
18.4 內核任務的創建 360
18.5 用戶任務的創建和執行 360
18.6 程序的編譯和執行 362
本章習題 362
?
第19章分頁機制和動態頁面分配 363
19.1 分頁機制概述 364
19.1.1 簡單的分頁模型 364
19.1.2 頁目錄、頁表和頁 373
19.1.3 地址變換的具體過程 375
19.2 本章代碼清單 376
19.3 使內核在分頁機制下工作 377
19.3.1 創建內核的頁目錄表和頁表 377
19.3.2 任務全局空間和局部空間的頁面映射 382
19.4 創建內核任務 389
19.4.1 內核的虛擬內存分配 389
19.4.2 頁面位映射串和空閒頁的查找 394
19.4.3 內核任務的確立 398
19.5 用戶任務的創建和切換 399
19.5.1 用戶任務的虛擬內存分配策略 399
19.5.2 用戶任務的虛擬地址空間分配 402
19.5.3 創建用戶任務的LDT 403
19.5.4 用戶程序的加載 405
19.5.5 重定位U-SALT並複制頁目錄表 405
19.5.6 切換到用戶任務執行 408
19.6 程序的編譯、執行和調試 409
19.6.1 本章程序的編譯和運行方法 409
19.6.2 查看CR3寄存器的內容 409
19.6.3 查看線性地址對應的物理頁信息 410
19.6.4 查看當前任務的頁表信息 411
19.6.5 使用線性(虛擬)地址調試程序 411
本章習題 412
第20章平坦內存模型和軟件任務切換 413
20.1 多段模型和平坦模型 413
20.1.1 多段模型和段頁式內存管理 413
20.1.2 平坦模型 415
20.2 本章代碼清單 416
20.3 初始化系統並加載內核 416
20.3.1 定義平坦模型下的段描述符 417
20.3.2 平坦模型下的內核程序 418
20.3.3 加載內核程序 419
20.4 內核的初始化 421
20.4.1 進入內核並初始化中斷系統 421
20.4.2 軟中斷和系統調用 422
20.4.3 系統調用的安裝及其工作原理 423
20.4.4 任務狀態段TSS的新用法 424
20.5 用戶任務的創建 427
20.5.1 平坦模型下的用戶程序結構 428
20.5.2 用戶任務的創建過程 428
20.6 軟件任務切換 429
20.6.1 保存當前任務的狀態 430
20.6.2 恢復並執行新任務 430
20.7 內核任務的執行 431
20.8 用戶任務的執行 432
本章習題 433