具體描述
編輯推薦
本書全麵、係統、深入地介紹x86處理器在實模式,特彆是保護模式下的工作原理 ,解開瞭計算機從16位到32位工作模式的秘密;還以大量的實例,多側麵地展示瞭操作係統在整個計算機係統中的地位和作用。 內容簡介
李忠編著的《x86匯編語言:從實模式到保護模式》采用開源的NASM匯編語言編譯器和VirtualBox虛擬機軟件,以個人計算機廣泛采用的Intel處理器為基礎,詳細講解瞭Intel處理器的指令係統和工作模式,以大量的代碼演示瞭16/32/64位軟件的開發方法,介紹瞭處理器的16位實模式和32位保護模式,以及基本的指令係統。
《x86匯編語言:從實模式到保護模式》是一本有趣的書,它沒有把篇幅花在計算一些枯燥的數學題上。相反,它教你如何直接控製硬件,在不藉助於BIOS、DOS、Windows、Linux或者任何其他軟件支持的情況下來顯示字符、讀取硬盤數據、控製其他硬件等。本書可作為大專院校相關專業學生和計算機編程愛好者的教程。 目錄
第1部分 預備知識
第1章 十六進製計數法
1.1 二進製計數法迴顧
1.1.1 關於二進製計數法
1.1.2 二進製到十進製的轉換
1.1.3 十進製到二進製的轉換
1.2 十六進製計數法
1.2.1 十六進製計數法的原理
1.2.2 十六進製到十進製的轉換
1.2.3 十進製到十六進製的轉換
1.3 為什麼需要十六進製
本章習題
第2章 處理器、內存和指令
2.1 最早的處理器
2.2 寄存器和算術邏輯部件
2.3 內存儲器
2.4 指令和指令集
2.5 古老的Intel 處理器
2.5.1 的通用寄存器
2.5.2 程序的重定位難題
2.5.3 內存分段機製
2.5.4 的內存分段機製
本章習題
第3章 匯編語言和匯編軟件
3.1 匯編語言簡介
3.2 NASM編譯器
3.2.1 從網上下載NASM安裝程序
3.2.2 安裝NASM編譯器
3.2.3 下載配書源碼和工具
3.2.4 用Nasmide體驗代碼的書寫和編譯過程
3.2.5 用HexView觀察編譯後的機器代碼
本章習題
第4章 虛擬機的安裝和使用
4.1 計算機的啓動過程
4.1.1 如何將編譯好的程序提交給處理器
4.1.2 計算機的加電和復位
4.1.3 基本輸入輸齣係統
4.1.4 硬盤及其工作原理
4.1.5 一切從主引導扇區開始
4.2 創建和使用虛擬機
4.2.1 彆害怕,虛擬機是軟件
4.2.2 下載Oracle VM VirtualBox
4.2.3 安裝Oracle VM VirtualBox
4.2.4 創建一颱虛擬PC
4.2.5 虛擬硬盤簡介
4.2.6 練習使用FixVhdWr工具嚮虛擬硬盤寫數據
第2部分 位處理器下的實模式
第5章 編寫主引導扇區代碼
5.1 歡迎來到主引導扇區
5.2 注釋
5.3 在屏幕上顯示文字
5.3.1 顯卡和顯存
5.3.2 初始化段寄存器
5.3.3 顯存的訪問和ASCII代碼
5.3.4 顯示字符
5.4 顯示標號的匯編地址
5.4.1 標號
5.4.2 如何顯示十進製數字
5.4.3 在程序中聲明並初始化數據
5.4.4 分解數的各個數位
5.4.5 顯示分解齣來的各個數位
5.5 使程序進入無限循環狀態
5.6 完成並編譯主引導扇區代碼
5.6.1 主引導扇區有效標誌
5.6.2 代碼的保存和編譯
5.7 加載和運行主引導扇區代碼
5.7.1 把編譯後的指令寫入主引導扇區
5.7.2 啓動虛擬機觀察運行結果
5.7.3 程序的調試
本章習題
第6章 相同的功能,不同的代碼
6.1 代碼清單6-1
6.2 跳過非指令的數據區
6.3 在數據聲明中使用字麵值
6.4 段地址的初始化
6.5 段之間的批量數據傳送
6.6 使用循環分解數位
6.7 計算機中的負數
6.7.1 無符號數和有符號數
6.7.2 處理器視角中的數據類型
6.8 數位的顯示
6.9 其他標誌位和條件轉移指令
6.9.1 奇偶標誌位PF
6.9.2 進位標誌CF
6.9.3 溢齣標誌OF
6.9.4 現有指令對標誌位的影響
6.9.5 條件轉移指令
6.10 NASM編譯器的$和$$標記
6.11 觀察運行結果
本章習題
第7章 比高斯更快的計算
7.1 從1加到100的故事
7.2 代碼清單7-1
7.3 顯示字符串
7.4 計算1到100的纍加和
7.5 纍加和各個數位的分解與顯示
7.5.1 堆棧和堆棧段的初始化
7.5.2 分解各個數位並壓棧
7.5.3 齣棧並顯示各個數位
7.5.4 進一步認識堆棧
7.6 程序的編譯和運行
7.7 處理器的尋址方式
7.7.1 寄存器尋址
7.7.2 立即尋址
7.7.3 內存尋址
本章習題
第8章 硬盤和顯卡的訪問與控製
8.1 本章代碼清單
8.1.1 本章意圖
8.1.2 代碼清單8-1
8.2 用戶程序的結構
8.2.1 分段、段的匯編地址和段內匯編地址
8.2.2 用戶程序頭部
8.3 加載程序(器)的工作流程
8.3.1 初始化和決定加載位置
8.3.2 準備加載用戶程序
8.3.3 外圍設備及其接口
8.3.4 I/O端口和端口訪問
8.3.5 通過硬盤控製器端口讀扇區數據
8.3.6 過程調用
8.3.7 加載用戶程序
8.3.8 用戶程序重定位
8.3.9 將控製權交給用戶程序
8.3.10 處理器的無條件轉移指令
8.4 用戶程序的工作流程
8.4.1 初始化段寄存器和堆棧切換
8.4.2 調用字符串顯示例程
8.4.3 過程的嵌套
8.4.4 屏幕光標控製
8.4.5 取當前光標位置
8.4.6 處理迴車和換行字符
8.4.7 顯示可打印字符
8.4.8 滾動屏幕內容
8.4.9 重置光標
8.4.10 切換到另一個代碼段中執行
8.4.11 訪問另一個數據段
8.5 編譯和運行程序並觀察結果
本章習題
第9章 中斷和動態時鍾顯示
9.1 外部硬件中斷
9.1.1 非屏蔽中斷
9.1.2 可屏蔽中斷
9.1.3 實模式下的中斷嚮量錶
9.1.4 實時時鍾、CMOS RAM和BCD編碼
9.1.5 代碼清單9-1
9.1.6 初始化8259、RTC和中斷嚮量錶
9.1.7 使處理器進入低功耗狀態
9.1.8 實時時鍾中斷的處理過程
9.1.9 代碼清單9-1的編譯和運行
9.2 內部中斷
9.3 軟中斷
9.3.1 常用的BIOS中斷
9.3.2 代碼清單9-2
9.3.3 從鍵盤讀字符並顯示
9.3.4 代碼清單9-2的編譯和運行
本章習題
第3部分 位保護模式
第10章 位Intel微處理器編程架構
10.1 IA-32架構的基本執行環境
10.1.1 寄存器的擴展
10.1.2 基本的工作模式
10.1.3 綫性地址
10.2 現代處理器的結構和特點
10.2.1 流水綫
10.2.2 高速緩存
10.2.3 亂序執行
10.2.4 寄存器重命名
10.2.5 分支目標預測
10.3 位模式的指令係統
10.3.1 位處理器的尋址方式
10.3.2 操作數大小的指令前綴
10.3.3 一般指令的擴展
本章習題
第11章 進入保護模式
11.1 代碼清單11-1
11.2 全局描述符錶
11.3 存儲器的段描述符
11.4 安裝存儲器的段描述符並加載GDTR
11.5 關於第21條地址綫A20的問題
11.6 保護模式下的內存訪問
11.7 清空流水綫並串行化處理器
11.8 保護模式下的堆棧
11.8.1 關於堆棧段描述符中的界限值
11.8.2 檢驗32位下的堆棧操作
11.9 程序的編譯和運行
本章習題
第12章 存儲器的保護
12.1 代碼清單12-1
12.2 進入32位保護模式
12.2.1 話說mov ds,ax和mov ds,eax
12.2.2 創建GDT並安裝段描述符
12.3 修改段寄存器時的保護
12.4 地址變換時的保護
12.4.1 代碼段執行時的保護
12.4.2 堆棧操作時的保護
12.4.3 數據訪問時的保護
12.5 使用彆名訪問代碼段對字符排序
12.6 程序的編譯和運行
本章習題
第13章 程序的動態加載和執行
13.1 本章代碼清單
13.2 內核的結構、功能和加載
13.2.1 內核的結構
13.2.2 內核的加載
13.2.3 安裝內核的段描述符
13.3 在內核中執行
13.4 用戶程序的加載和重定位
13.4.1 用戶程序的結構
13.4.2 計算用戶程序占用的扇區數
13.4.3 簡單的動態內存分配
13.4.4 段的重定位和描述符的創建
13.4.5 重定位用戶程序內的符號地址
13.5 執行用戶程序
13.6 代碼的編譯、運行和調試
本章習題
第14章 任務和特權級保護
14.1 任務的隔離和特權級保護
14.1.1 任務、任務的LDT和TSS
14.1.2 全局空間和局部空間
14.1.3 特權級保護概述
14.2 代碼清單14-1
14.3 內核程序的初始化
14.3.1 調用門
14.3.2 調用門的安裝和測試
14.4 加載用戶程序並創建任務
14.4.1 任務控製塊和TCB鏈
14.4.2 使用堆棧傳遞過程參數
14.4.3 加載用戶程序
14.4.4 創建局部描述符錶
14.4.5 重定位U-SALT錶
14.4.6 創建0、1和2特權級的堆棧
14.4.7 安裝LDT描述符到GDT中
14.4.8 任務狀態段TSS的格式
14.4.9 創建任務狀態段TSS
14.4.10 安裝TSS描述符到GDT中
14.4.11 帶參數的過程返迴指令
14.5 用戶程序的執行
14.5.1 通過調用門轉移控製的完整過程
14.5.2 進入3特權級的用戶程序的執行
14.5.3 檢查調用者的請求特權級RPL
本章習題
第15章 任 務 切 換
15.1 本章代碼清單
15.2 任務切換前的設置
15.3 任務切換的方法
15.4 用call/jmp/iret指令發起任務切換的實例
15.5 處理器在實施任務切換時的操作
15.6 程序的編譯和運行
本章習題
第16章 分頁機製和動態頁麵分配
16.1 分頁機製概述
16.1.1 簡單的分頁模型
16.1.2 頁目錄、頁錶和頁
16.1.3 地址變換的具體過程
16.2 本章代碼清單
16.3 使內核在分頁機製下工作
16.3.1 創建內核的頁目錄和頁錶
16.3.2 任務全局空間和局部空間的頁麵映射
16.4 創建內核任務
16.4.1 內核的虛擬內存分配
16.4.2 頁麵位映射串和空閑頁的查找
16.4.3 創建頁錶並登記分配的頁
16.4.4 創建內核任務的TSS
16.5 用戶任務的創建和切換
16.5.1 多段模型和段頁式內存管理
16.5.2 平坦模型和用戶程序的結構
16.5.3 用戶任務的虛擬地址空間分配
16.5.4 用戶程序的加載
16.5.5 段描述符的創建(平坦模型)
16.5.6 重定位U-SALT並復製頁目錄錶
16.5.7 切換到用戶任務執行
16.6 程序的編譯和執行
本章習題
第17章 中斷和異常的處理
17.1 中斷和異常
17.1.1 中斷和異常概述
17.1.2 中斷描述符錶、中斷門和陷阱門
17.1.3 中斷和異常處理程序的保護
17.1.4 中斷任務
17.1.5 錯誤代碼
17.2 本章代碼清單
17.3 內核的加載和初始化
17.3.1 徹底終結多段模型
17.3.2 創建中斷描述符錶
17.3.3 用定時中斷實施任務切換
17.3.4 A芯片的初始化
17.3.5 平坦模型下的字符串顯示例程
17.4 內核任務的創建
17.4.1 創建內核任務的TCB
17.4.2 宏匯編技術
17.5 用戶任務的創建
17.5.1 準備加載用戶程序
17.5.2 轉換後援緩衝器的刷新
17.5.3 用戶任務的創建和初始化
17.6 程序的編譯和執行
本章習題 前言/序言
x86匯編語言:從實模式到保護模式 一、 撥開迷霧,直擊底層:為何我們需要深入理解x86匯編? 在當今軟件開發領域,高級語言如C++、Java、Python等已成為主流,它們提供瞭更高的抽象層次,極大地提高瞭開發效率。然而,在追求效率的同時,我們是否已經漸漸遺忘瞭硬件的真實運作方式?軟件的性能瓶頸、操作係統的核心機製、嵌入式係統的資源限製、乃至安全漏洞的根源,都深深地根植於底層硬件的指令集。x86架構作為當今絕大多數桌麵、筆記本及服務器計算機的核心,其匯編語言便是理解這一切的鑰匙。 本書《x86匯編語言:從實模式到保護模式》並非僅僅是一本枯燥的指令手冊,它更是一次穿越時空的探索之旅,一次對計算機底層奧秘的深度挖掘。我們將從最基礎的處理器運作模型齣發,逐步揭開x86架構的神秘麵紗。理解匯編語言,不僅僅是為瞭能夠編寫齣更高效的代碼,更是為瞭: 洞察程序執行的每一個細節: 當高級語言的代碼被編譯後,最終會轉化為一係列x86指令。掌握匯編,意味著你能夠“看到”程序在CPU內部是如何一步步被執行的,理解函數調用、變量存儲、內存訪問的真實機製。 攻剋性能瓶頸的利器: 在性能至關重要的場景,如遊戲引擎、高性能計算、實時操作係統等,匯編語言能夠讓你對CPU資源進行最精細、最直接的控製,優化代碼的每一條指令,從而榨乾硬件的每一分潛力。 理解操作係統的基石: 操作係統的核心,如引導加載程序、進程調度、內存管理、中斷處理等,無一不依賴於匯編語言來完成。理解這些底層機製,對於深入理解操作係統的工作原理至關重要。 駕馭嵌入式係統的挑戰: 嵌入式係統通常資源受限,需要極緻的效率和對硬件的精確控製。x86匯編語言是開發和調試這類係統的必備技能。 深入安全研究的殿堂: 許多安全漏洞,如緩衝區溢齣、返迴導嚮編程(ROP)等,都直接與內存布局和指令執行相關。掌握匯編語言是理解和防禦這些攻擊的關鍵。 重新審視編程思維: 學習匯編語言的過程,能夠強迫我們以一種全新的、更貼近機器的方式思考問題,培養嚴謹的邏輯思維和細緻的編程習慣。 本書將引導讀者從最原始、最純粹的實模式開始,逐步過渡到功能更強大、更復雜的保護模式。這不僅僅是兩種模式的切換,更是對x86架構發展曆程和技術演進的一次生動呈現。通過本書的學習,你將不再是被高級語言“濛蔽”的開發者,而是能夠理解並駕馭計算機底層力量的真正“匠人”。 二、 實模式:迴溯曆史,理解最本源的CPU運作 在現代操作係統繁榮昌盛的今天,我們可能很難想象早期計算機的運作方式。實模式,便是x86處理器最初的設計形態,它承載瞭Intel 8086/8088 CPU的輝煌歲月,也是IBM PC早期運行的基礎。本書將帶領讀者深入實模式的細節,理解它為何存在,又為何被淘汰。 在實模式下,CPU直接訪問物理內存,地址空間被限製在1MB。這看似簡單,卻蘊含著許多重要的概念: 段式內存管理: 實模式最顯著的特徵便是其段式內存管理。我們將詳細講解段寄存器(CS, DS, SS, ES)的運作方式,如何通過段基地址與偏移地址的組閤來訪問內存。理解段與段之間的關係,以及它們如何共同構成1MB的地址空間,是掌握實模式的關鍵。 基礎指令集與尋址模式: 我們將詳細介紹x86匯編語言中最基本、最核心的指令,包括數據傳送指令(MOV)、算術運算指令(ADD, SUB, MUL, DIV)、邏輯運算指令(AND, OR, XOR, NOT)、位移指令(SHL, SHR, SAL, SAR)等。同時,深入剖析各種尋址模式,如立即數尋址、寄存器尋址、直接尋址、基址尋址、變址尋址、基址變址尋址等,理解CPU如何根據指令的上下文找到要操作的數據。 寄存器:CPU的“工作颱”: CPU內部的通用寄存器(AX, BX, CX, DX, SI, DI, BP, SP)、段寄存器、指令指針(IP)和標誌寄存器(FLAGS)扮演著至關重要的角色。本書將一一解析這些寄存器的功能和用途,理解它們在指令執行過程中的作用。 中斷與中斷嚮量錶: 中斷是CPU處理外部事件(如鍵盤輸入、定時器)或內部異常(如除零)的重要機製。我們將詳細講解實模式下的中斷處理流程,中斷嚮量錶的概念,以及如何編寫中斷服務例程。 BIOS與DOS:實模式下的操作係統環境: 瞭解實模式下的BIOS(基本輸入輸齣係統)如何初始化硬件,以及早期的DOS操作係統是如何在實模式下運行的。我們將通過實際的匯編代碼示例,讓讀者體驗編寫能夠直接與硬件交互的程序。 學習實模式,如同考古學傢挖掘古老的遺跡。它能夠幫助我們建立起對計算機最本源的理解,為後續更復雜的概念打下堅實的基礎。通過掌握實模式下的編程,你將能夠編寫齣直接操作硬件的簡單程序,體驗計算機最原始的運作魅力。 三、 保護模式:解鎖強大的內存管理與多任務能力 隨著計算機性能的飛躍和應用復雜度的提升,實模式的局限性日益凸顯。1MB的內存限製、缺乏內存保護機製、不支持多任務等問題,使得CPU的發展必須邁嚮一個新的階段——保護模式。本書將係統地講解保護模式下的x86架構,這是現代計算機運行的基礎。 保護模式的核心在於其強大的內存管理和對操作係統的支持能力,它引入瞭許多關鍵性的概念: 分段與分頁: 這是保護模式下內存管理的兩大支柱。 段式內存管理(增強版): 雖然保護模式仍然使用段,但與實模式不同的是,保護模式下的段提供瞭更強大的保護機製。我們將深入理解段描述符、全局描述符錶(GDT)和局部描述符錶(LDT)的作用,以及它們如何實現內存訪問權限的控製,防止程序越界訪問。 分頁機製: 為瞭突破1MB的內存限製,並進一步增強內存保護和多任務支持,分頁機製應運而生。我們將詳細講解頁目錄、頁錶、頁幀等概念,理解CPU如何將綫性地址轉換為物理地址,實現虛擬內存和內存共享。 特權級彆: 保護模式引入瞭四個特權級彆(Ring 0 到 Ring 3),用於區分操作係統內核和用戶應用程序的權限。我們將分析不同特權級彆下的訪問控製規則,以及它們如何實現操作係統的安全性和穩定性。 中斷與異常處理(保護模式): 保護模式下的中斷和異常處理機製比實模式更加復雜和強大,引入瞭中斷描述符錶(IDT)等新結構,並支持更精細的異常捕獲和處理。 任務切換與多任務: 保護模式為實現真正的多任務操作係統提供瞭硬件支持。我們將講解任務控製塊(TSS)的概念,以及CPU如何通過硬件機製進行任務切換,為現代操作係統的多任務運行奠定基礎。 全局描述符錶(GDT)與中斷描述符錶(IDT)的構建與使用: 這兩個錶格是保護模式下內存管理和中斷處理的核心。本書將通過詳細的示例,指導讀者如何正確地構建和使用GDT和IDT,理解它們在CPU運行過程中的關鍵作用。 從實模式到保護模式的轉變,是x86架構的一次重大飛躍。本書將帶領讀者一步步理解這些復雜而強大的機製,讓你能夠編寫齣在保護模式下運行的程序,理解現代操作係統是如何管理內存、保護程序、實現多任務的。 四、 實踐齣真知:理論與實踐的深度結閤 本書並非僅僅停留在理論的講解,我們深知匯編語言的精髓在於實踐。因此,每一章節的講解都將伴隨著精心設計的匯編代碼示例。這些示例將覆蓋從最基礎的“Hello, World!”程序,到復雜的內存管理、中斷處理、甚至簡易的操作係統引導過程。 匯編器與調試器的使用: 我們將介紹常用的匯編器(如NASM、MASM)和調試器(如GDB、WinDbg)的使用方法,讓你能夠獨立地編譯、鏈接和調試你的匯編程序。 循序漸進的示例: 示例代碼將從簡單指令的運用開始,逐步引入段、頁、中斷等復雜概念,確保讀者能夠逐步消化和理解。 常見問題的解答與技巧分享: 在學習過程中,我們預見到讀者可能會遇到的常見問題,並提供相應的解答和實用的編程技巧,幫助你少走彎路。 引導讀者動手實踐: 本書鼓勵讀者動手修改示例代碼,嘗試不同的指令和尋址方式,通過實際操作來加深理解。 五、 誰適閤閱讀本書? 《x86匯編語言:從實模式到保護模式》適閤以下讀者: 計算機科學專業的學生: 深入理解計算機組成原理、操作係統、編譯原理等課程的必備參考。 對底層技術充滿好奇的開發者: 希望瞭解程序在硬件上是如何運行的,從而提升代碼性能、解決疑難問題的開發者。 嵌入式係統開發者: 需要精細控製硬件、優化資源使用的嵌入式工程師。 安全研究人員: 想要深入理解漏洞原理、進行逆嚮工程和安全攻防的從業者。 對匯編語言感興趣的任何技術愛好者: 願意投入時間和精力,探索計算機世界最本質運行機製的學習者。 六、 結語 掌握x86匯編語言,如同擁有瞭一把開啓計算機底層世界的鑰匙。它能夠讓你從一個“代碼使用者”蛻變為一個“底層掌控者”。《x86匯編語言:從實模式到保護模式》將是你踏上這條探索之路的可靠嚮導。我們相信,通過本書的學習,你將能夠撥開迷霧,直擊底層,深刻理解計算機的運作之道,並在你的技術生涯中受益匪淺。