目 錄
第1部分 預備知識
第1章 十六進制計數法\t3
1.1 二進制計數法回顧\t3
1.1.1 關于二進制計數法\t3
1.1.2 二進制到十進制的轉換\t3
1.1.3 十進制到二進制的轉換\t4
1.2 十六進制計數法\t4
1.2.1 十六進制計數法的原理\t4
1.2.2 十六進制到十進制的轉換\t5
1.2.3 十進制到十六進制的轉換\t6
1.3 為什么需要十六進制\t6
本章習題\t7
第2章 處理器、內存和指令\t8
2.1 最早的處理器\t8
2.2 寄存器和算術邏輯部件\t8
2.3 內存儲器\t10
2.4 指令和指令集\t11
2.5 古老的Intel 8086處理器\t13
2.5.1 8086的通用寄存器\t13
2.5.2 程序的重定位難題\t14
2.5.3 內存分段機制\t17
2.5.4 8086的內存分段機制\t18
本章習題\t21
第3章 匯編語言和匯編軟件\t22
3.1 匯編語言簡介\t22
3.2 NASM編譯器\t24
3.2.1 從網上下載NASM安裝程序\t24
3.2.2 安裝NASM編譯器\t25
3.2.3 下載配書源碼和工具\t26
3.2.4 用Nasmide體驗代碼的書寫和編譯過程\t28
3.2.5 用HexView觀察編譯后的機器代碼\t29
本章習題\t30
第4章 虛擬機的安裝和使用\t31
4.1 計算機的啟動過程\t31
4.1.1 如何將編譯好的程序提交給處理器\t31
4.1.2 計算機的加電和復位\t31
4.1.3 基本輸入輸出系統(tǒng)\t32
4.1.4 硬盤及其工作原理\t33
4.1.5 一切從主引導扇區(qū)開始\t35
4.2 創(chuàng)建和使用虛擬機\t35
4.2.1 別害怕,虛擬機是軟件\t35
4.2.2 下載Oracle VM VirtualBox\t36
4.2.3 安裝Oracle VM VirtualBox\t36
4.2.4 創(chuàng)建一臺虛擬PC\t37
4.2.5 虛擬硬盤簡介\t42
4.2.6 練習使用FixVhdWr工具向虛擬硬盤寫數據\t43
第2部分 16位處理器下的實模式
第5章 編寫主引導扇區(qū)代碼\t49
5.1 歡迎來到主引導扇區(qū)\t49
5.2 注釋\t49
5.3 在屏幕上顯示文字\t50
5.3.1 顯卡和顯存\t50
5.3.2 初始化段寄存器\t52
5.3.3 顯存的訪問和ASCII代碼\t53
5.3.4 顯示字符\t55
5.4 顯示標號的匯編地址\t56
5.4.1 標號\t56
5.4.2 如何顯示十進制數字\t60
5.4.3 在程序中聲明并初始化數據\t61
5.4.4 分解數的各個數位\t61
5.4.5 顯示分解出來的各個數位\t65
5.5 使程序進入無限循環(huán)狀態(tài)\t66
5.6 完成并編譯主引導扇區(qū)代碼\t67
5.6.1 主引導扇區(qū)有效標志\t67
5.6.2 代碼的保存和編譯\t68
5.7 加載和運行主引導扇區(qū)代碼\t68
5.7.1 把編譯后的指令寫入主引導扇區(qū)\t68
5.7.2 啟動虛擬機觀察運行結果\t70
5.7.3 程序的調試\t70
本章習題\t71
第6章 相同的功能,不同的代碼\t72
6.1 代碼清單6-1\t72
6.2 跳過非指令的數據區(qū)\t72
6.3 在數據聲明中使用字面值\t72
6.4 段地址的初始化\t73
6.5 段之間的批量數據傳送\t74
6.6 使用循環(huán)分解數位\t75
6.7 計算機中的負數\t77
6.7.1 無符號數和有符號數\t77
6.7.2 處理器視角中的數據類型\t80
6.8 數位的顯示\t82
6.9 其他標志位和條件轉移指令\t83
6.9.1 奇偶標志位PF\t83
6.9.2 進位標志CF\t83
6.9.3 溢出標志OF\t84
6.9.4 現(xiàn)有指令對標志位的影響\t84
6.9.5 條件轉移指令\t85
6.10 NASM編譯器的$和$$標記\t87
6.11 觀察運行結果\t87
本章習題\t88
第7章 比高斯更快的計算\t89
7.1 從1加到100的故事\t89
7.2 代碼清單7-1\t89
7.3 顯示字符串\t89
7.4 計算1到100的累加和\t90
7.5 累加和各個數位的分解與顯示\t90
7.5.1 堆棧和堆棧段的初始化\t90
7.5.2 分解各個數位并壓棧\t92
7.5.3 出棧并顯示各個數位\t94
7.5.4 進一步認識堆棧\t95
7.6 程序的編譯和運行\(zhòng)t96
7.7 8086處理器的尋址方式\t96
7.7.1 寄存器尋址\t96
7.7.2 立即尋址\t97
7.7.3 內存尋址\t97
本章習題\t101
第8章 硬盤和顯卡的訪問與控制\t102
8.1 本章代碼清單\t102
8.1.1 本章意圖\t102
8.1.2 代碼清單8-1\t103
8.2 用戶程序的結構\t103
8.2.1 分段、段的匯編地址和段內匯編地址\t103
8.2.2 用戶程序頭部\t106
8.3 加載程序(器)的工作流程\t109
8.3.1 初始化和決定加載位置\t109
8.3.2 準備加載用戶程序\t110
8.3.3 外圍設備及其接口\t111
8.3.4 I/O端口和端口訪問\t112
8.3.5 通過硬盤控制器端口讀扇區(qū)數據\t114
8.3.6 過程調用\t116
8.3.7 加載用戶程序\t121
8.3.8 用戶程序重定位\t122
8.3.9 將控制權交給用戶程序\t126
8.3.10 8086處理器的無條件轉移指令\t126
8.4 用戶程序的工作流程\t128
8.4.1 初始化段寄存器和堆棧切換\t128
8.4.2 調用字符串顯示例程\t129
8.4.3 過程的嵌套\t130
8.4.4 屏幕光標控制\t131
8.4.5 取當前光標位置\t131
8.4.6 處理回車和換行字符\t132
8.4.7 顯示可打印字符\t133
8.4.8 滾動屏幕內容\t134
8.4.9 重置光標\t134
8.4.10 切換到另一個代碼段中執(zhí)行\(zhòng)t135
8.4.11 訪問另一個數據段\t135
8.5 編譯和運行程序并觀察結果\t135
本章習題\t136
第9章 中斷和動態(tài)時鐘顯示\t137
9.1 外部硬件中斷\t137
9.1.1 非屏蔽中斷\t138
9.1.2 可屏蔽中斷\t138
9.1.3 實模式下的中斷向量表\t140
9.1.4 實時時鐘、CMOS RAM和BCD編碼\t141
9.1.5 代碼清單9-1\t145
9.1.6 初始化8259、RTC和中斷向量表\t145
9.1.7 使處理器進入低功耗狀態(tài)\t147
9.1.8 實時時鐘中斷的處理過程\t148
9.1.9 代碼清單9-1的編譯和運行\(zhòng)t150
9.2 內部中斷\t150
9.3 軟中斷\t151
9.3.1 常用的BIOS中斷\t151
9.3.2 代碼清單9-2\t155
9.3.3 從鍵盤讀字符并顯示\t155
9.3.4 代碼清單9-2的編譯和運行\(zhòng)t155
本章習題\t156
第3部分 32位保護模式
第10章 32位Intel微處理器編程架構\t159
10.1 IA-32架構的基本執(zhí)行環(huán)境\t164
10.1.1 寄存器的擴展\t162
10.1.2 基本的工作模式\t162
10.1.3 線性地址\t163
10.2 現(xiàn)代處理器的結構和特點\t164
10.2.1 流水線\t164
10.2.2 高速緩存\t165
10.2.3 亂序執(zhí)行\(zhòng)t165
10.2.4 寄存器重命名\t166
10.2.5 分支目標預測\t167
10.3 32位模式的指令系統(tǒng)\t168
10.3.1 32位處理器的尋址方式\t168
10.3.2 操作數大小的指令前綴\t169
10.3.3 一般指令的擴展\t171
本章習題\t174
第11章 進入保護模式\t175
11.1 代碼清單11-1\t175
11.2 全局描述符表\t175
11.3 存儲器的段描述符\t177
11.4 安裝存儲器的段描述符并加載GDTR\t180
11.5 關于第21條地址線A20的問題\t182
11.6 保護模式下的內存訪問\t184
11.7 清空流水線并串行化處理器\t188
11.8 保護模式下的堆棧\t189
11.8.1 關于堆棧段描述符中的界限值\t189
11.8.2 檢驗32位下的堆棧操作\t190
11.9 程序的編譯和運行\(zhòng)t191
本章習題\t191
第12章 存儲器的保護\t192
12.1 代碼清單12-1\t192
12.2 進入32位保護模式\t192
12.2.1 話說mov ds,ax和mov ds,eax\t192
12.2.2 創(chuàng)建GDT并安裝段描述符\t193
12.3 修改段寄存器時的保護\t195
12.4 地址變換時的保護\t197
12.4.1 代碼段執(zhí)行時的保護\t197
12.4.2 堆棧操作時的保護\t198
12.4.3 數據訪問時的保護\t200
12.5 使用別名訪問代碼段對字符排序\t201
12.6 程序的編譯和運行\(zhòng)t203
本章習題\t203
第13章 程序的動態(tài)加載和執(zhí)行\(zhòng)t204
13.1 本章代碼清單\t204
13.2 內核的結構、功能和加載\t205
13.2.1 內核的結構\t205
13.2.2 內核的加載\t206
13.2.3 安裝內核的段描述符\t208
13.3 在內核中執(zhí)行\(zhòng)t211
13.4 用戶程序的加載和重定位\t213
13.4.1 用戶程序的結構\t213
13.4.2 計算用戶程序占用的扇區(qū)數\t215
13.4.3 簡單的動態(tài)內存分配\t216
13.4.4 段的重定位和描述符的創(chuàng)建\t217
1