編輯推薦
全麵講解IA-32結構係列(80x86係列)處理器的32位編程。
新目標:理解係統原理,提升編程技能。
新方法:依托高級語言,講解低級語言。
新平颱:利用虛擬機器,運行示例代碼。
內容簡介
本書設定新目標,采用新方法,基於新平颱,講解IA��32結構係列(80x86係列)CPU的32位編程。本書分為4個部分: 第一部分利用VC 2010環境的嵌入匯編和目標代碼,介紹IA��32係列(80x86係列)CPU的基本功能和32位編程技術; 第二部分利用開源匯編器NASM、開源虛擬機VirtualBox和模擬器Bochs,介紹匯編語言和計算機係統底層輸入輸齣的實現方式; 第三部分詳細講解保護方式編程技術,生動展示保護方式編程細節; 第四部分簡要說明相關軟件工具的使用。
本書依托高級語言,講解低級語言;利用虛擬平颱,演示係統原理。第一部分和第二部分可作為高校計算機及電子信息類專業學生學習匯編語言的教材,第三部分可作為編程愛好者學習保護方式編程技術的教材或參考書。
目錄
第1章基礎知識
1.1CPU簡介
1.1.1目標代碼
1.1.2基本功能
1.2匯編語言概念
1.2.1機器指令
1.2.2匯編格式指令
1.2.3匯編語言及其優缺點
1.3數據的錶示和存儲
1.3.1數值數據的錶示
1.3.2非數值數據的錶示
1.3.3基本數據類型
1.3.4數據的存儲
習題
第2章IA��32處理器基本功能
2.1IA��32處理器簡介
2.1.1IA��32係列處理器
2.1.2保護方式和實地址方式
2.2通用寄存器及使用
2.2.1通用寄存器
2.2.2簡單傳送指令
2.2.3簡單加減指令
2.2.4VC嵌入匯編和實驗
2.3標誌寄存器及使用
2.3.1標誌寄存器
2.3.2狀態標誌
2.3.3狀態標誌操作指令
2.3.4帶進位加減指令
2.4段寄存器及使用
2.4.1存儲器分段
2.4.2邏輯地址
2.4.3段寄存器
2.5尋址方式
2.5.1立即尋址方式和寄存器尋址方式
2.5.232位的存儲器尋址方式
2.5.3取有效地址指令
2.6指令指針寄存器和簡單控製轉移
2.6.1指令指針寄存器
2.6.2常用條件轉移指令
2.6.3比較指令和數值大小比較
2.6.4簡單的無條件轉移指令
2.7堆棧和堆棧操作
2.7.1堆棧
2.7.2堆棧操作指令
習題
第3章程序設計初步
3.1堆棧的作用
3.1.1過程調用和返迴指令
3.1.2參數傳遞
3.1.3局部變量
3.2算術邏輯運算指令
3.2.1乘除運算指令
3.2.2邏輯運算指令
3.2.3移位指令
3.3分支程序設計
3.3.1分支程序設計示例
3.3.2無條件和條件轉移指令
3.3.3多路分支的實現
3.4循環程序設計
3.4.1循環程序設計示例
3.4.2循環指令
3.4.3多重循環設計舉例
3.5子程序設計
3.5.1子程序設計要點
3.5.2子程序設計舉例
3.5.3子程序調用方法
習題
第4章字符串操作和位操作
4.1字符串操作
4.1.1字符串操作指令
4.1.2重復操作前綴
4.1.3應用舉例
4.2位操作
4.2.1位操作指令
4.2.2應用舉例
4.3條件設置字節指令
4.3.1條件設置字節指令概述
4.3.2應用舉例
習題
第5章VC目標代碼的閱讀理解
5.1匯編語言形式的目標代碼
5.1.1基本樣式
5.1.2符號化錶示
5.2C語言部分編譯的解析
5.2.1類型的轉換
5.2.2錶達式求值
5.2.3指針的本質
5.2.4結構體變量
5.3C++部分功能實現細節
5.3.1引用
5.3.2通過引用傳遞參數
5.3.3函數重載
5.3.4虛函數
5.4目標程序的優化
5.4.1關於程序優化
5.4.2使大小最小化
5.4.3使速度最大化
5.4.4內存地址對齊
5.5C庫函數分析
5.5.1函數strlen
5.5.2函數strpbrk
5.5.3函數memset
5.6C程序的目標代碼
5.6.1Base64編碼操作
5.6.2源程序
5.6.3目標程序
習題
第6章匯編語言
6.1實方式執行環境
6.1.1寄存器和指令集
6.1.2存儲器分段管理
6.1.316位的存儲器尋址方式
6.2源程序和語句
6.2.1匯編語言源程序
6.2.2語句及其格式
6.3操作數錶示
6.3.1常數
6.3.2數值錶達式
6.3.3有效地址
6.3.4數據類型說明
6.4僞指令語句和變量
6.4.1數據定義語句
6.4.2存儲單元定義語句
6.4.3常數符號聲明語句
6.4.4演示舉例
6.5段聲明和段間轉移
6.5.1段聲明語句
6.5.2無條件段間轉移指令
6.5.3段間過程調用和返迴指令
6.6目標文件和段模式
6.6.1目標文件
6.6.2段模式聲明語句
6.7宏
6.7.1宏指令的聲明和使用
6.7.2單行宏的聲明和使用
6.7.3宏相關方法
習題
第7章BIOS和虛擬機
7.1BIOS及其調用
7.1.1BIOS簡介
7.1.2鍵盤輸入和顯示輸齣
7.1.3應用舉例
7.2磁盤及其讀寫
7.2.1磁盤簡介
7.2.2磁盤讀寫
7.2.3主引導記錄分析
7.3虛擬機
7.3.1虛擬機工作原理
7.3.2虛擬硬盤文件
7.3.3直接寫屏顯示方式
7.4一個簡易的加載器
7.4.1加載方法
7.4.2程序加載器
7.4.3工作程序示例
習題
第8章輸入輸齣和中斷
8.1輸入輸齣的基本概念
8.1.1I/O端口地址
8.1.2I/O指令
8.1.3數據傳送方式
8.1.4實時時鍾的存取
8.2查詢傳送方式
8.2.1查詢傳送流程
8.2.2實時時鍾的穩妥存取
8.3中斷概述
8.3.1中斷的概念
8.3.2中斷嚮量錶
8.3.3中斷響應過程
8.3.4內部中斷
8.3.5外部中斷
8.3.6中斷優先級和中斷嵌套
8.4中斷處理程序設計
8.4.1鍵盤中斷處理程序
8.4.2除法齣錯中斷處理程序
8.4.3擴展顯示I/O程序
8.4.4時鍾顯示程序
習題
第9章保護方式程序設計
9.1概述
9.1.1存儲器管理
9.1.2特權級設置
9.2分段存儲管理機製
9.2.1存儲段
9.2.2存儲段描述符
9.2.3全局和局部描述符錶
9.2.4段選擇子
9.2.5邏輯地址到綫性地址的轉換
9.3存儲管理寄存器和控製寄存器
9.3.1存儲管理寄存器
9.3.2控製寄存器
9.3.3相關存取指令
9.4實方式與保護方式切換示例
9.4.1實方式和保護方式切換的演示(示例一)
9.4.2不同模式代碼段切換的演示(示例二)
9.4.3局部描述符錶使用的演示(示例三)
9.5分頁存儲管理機製
9.5.1存儲分頁
9.5.2綫性地址到物理地址的轉換
9.5.3頁級保護和虛擬存儲器支持
9.5.4分頁存儲管理機製的演示(示例四)
9.6任務狀態段和控製門
9.6.1係統段描述符
9.6.2門描述符
9.6.3任務狀態段
9.7控製轉移
9.7.1任務內相同特權級的轉移
9.7.2相同特權級轉移的演示(示例五)
9.7.3任務內不同特權級的變換
9.7.4特權級變換的演示(示例六)
9.7.5任務切換
9.7.6任務切換的演示(示例七)
9.8中斷和異常的處理
9.8.1異常概念
9.8.2異常類型
9.8.3中斷和異常的處理
9.8.4中斷處理的演示(示例八)
9.8.5異常處理的演示(示例九)
9.9保護機製小結
9.9.1轉移途徑小結
9.9.2特權指令
習題
第10章實驗工具的使用
10.1匯編器NASM的使用
10.1.1NASM簡介
10.1.2NASM的使用
10.1.3鏈接器及其使用
10.2虛擬機管理器VirtualBox的使用
10.2.1VirtualBox簡介
10.2.2VirtualBox的使用
10.2.3關於硬件加速
10.3模擬器Bochs的使用
10.3.1Bochs簡介
10.3.2Bochs的配置與運行
10.3.3控製颱調試
10.3.4圖形化界麵調試
10.4VHDWriter的使用
參考文獻
精彩書摘
閱讀理解高級語言源程序的目標代碼,不僅有助於學習匯編語言程序設計,而且有助於提升高級語言程序設計能力。在介紹VC編譯器生成的目標代碼文件樣式的基礎上,本章解析C和C++部分語言功能的實現細節,介紹目標代碼優化的相關概念和方法,討論幾個典型庫函數的匯編源代碼。
5.1匯編語言形式的目標代碼
在微軟Visual Studio 2010的VC集成開發環境中,可以由C或者C++源程序生成匯編語言形式的目標代碼。本節簡要介紹這樣的目標代碼文件的樣式。
5.1.1基本樣式
首先介紹項目屬性頁中的配置屬性的相關選項值及其使用。
為瞭便於對比源程序和目標程序,盡量減少由編譯器額外增加的指令,所以在項目屬性頁中的配置屬性中采用如下設置。
(1) 在C/C++項下,常規的調試信息格式子項,選擇“C7兼容(/Z7)”。
(2) 在C/C++項下,代碼生成的基本運行時檢查子項,選擇“默認值”,既不進行堆棧幀的檢查,也不進行未初始化變量的檢查。
(3) 在C/C++項下,代碼生成的緩衝區安全檢查子項,選擇“否(/GS-)”。
為瞭更清楚地觀察對庫函數的調用,在項目屬性頁中的配置屬性中,在開始的常規項下,項目默認值的MFC的使用子項,選擇“在靜態庫中使用MFC”。
在本章下麵的介紹中,如果無特彆說明,都采用如上所述的項目屬性配置。實際上,在前麵幾章中所介紹的C語言程序目標代碼,幾乎都是在上述項目屬性的配置下生成的。
在項目屬性頁的配置屬性中,在C/C++項下,輸齣文件的匯編程序輸齣子項,如果選擇“僅有程序集的列錶(/FA)”,那麼在編譯時將生成擴展名為.asm的匯編語言形式的目標代碼文件; 如果選擇“帶源代碼的程序集(/FAs)”,那麼在生成的匯編形式的目標代碼中,還含有作為注釋的高級語言源代碼。
在項目屬性頁的配置屬性中,在C/C++項下,優化的優化子項是主要的編譯優化選項。如果選擇“已禁用(/Od)”,錶示不希望任何優化。如果選擇“使大小最小化(/O1)”,錶示希望目標代碼的長度盡量短小。如果選擇“使速度最大化(/O2)”,錶示希望目標代碼的執行速度盡量快。
【例5��1】如下C語言程序dp51是大傢熟悉的一個經典程序。
……
前言/序言
隨著計算資源的日益豐富和開發環境的日趨完善,直接運用匯編語言編寫程序的場閤越來越少,因此匯編語言課程需要新定位,匯編語言課程需要新概念。
在這樣的背景下,本書設定新的目標,采用新的方法,基於新的平颱,講解IA��32結構係列(80x86係列)CPU的32位編程。學習匯編語言的新目標是深入理解計算機係統的工作原理,全麵提升高級語言程序設計能力,而不再是熟練運用匯編語言編寫程序。匯編語言課程將起到“上承高級語言,下啓機器係統”的橋梁作用。學習匯編語言的新方法是依托高級語言。在學習匯編語言之前,通常已經具備高級語言(C或者C++語言等)程序設計的基礎。通過采用嵌入匯編和分析目標代碼等方法,不僅可以降低學習和掌握匯編格式指令的難度,而且有助於“知其然,知其所以然”,有助於更好地掌握高級語言。實踐匯編語言的新平颱是虛擬機。目前虛擬機已經十分流行,它是很理想的“裸機”。基於虛擬機不僅可以突破操作係統的約束,為所欲為地操縱“機器”,從而輕鬆調試設備驅動程序或者係統程序,而且有助於熟悉計算機係統的啓動過程,有助於明瞭計算機係統硬件和軟件的相互關係。
本書分為4個部分,共10章。第一部分由前五章組成,利用VC 2010環境的嵌入匯編和目標代碼,講解IA��32係列(80x86係列)CPU的基本功能和32位編程技術。第1章介紹基礎知識; 第2章說明IA��32係列CPU的基本功能; 第3章和第4章講解利用IA��32係列CPU的指令設計程序; 第5章分析VC源程序的目標代碼。第二部分由第6章、第7章和第8章組成,利用匯編器NASM和虛擬機,講解匯編語言和係統輸入輸齣。第6章基於匯編器NASM介紹匯編語言; 第7章在介紹BIOS和主引導記錄之後,說明虛擬機的原理及其使用方法; 第8章基於虛擬機講解計算機係統底層輸入輸齣的實現方式。第三部分是第9章,詳細講解基於IA��32係列CPU的保護方式程序設計,該章內容十分豐富。第四部分是第10章,簡要說明相關工具的使用,包括開源匯編器NASM、開源虛擬機VirtualBox和開源模擬器Bochs等。
本書依托高級語言,講解低級語言; 利用虛擬平颱,演示係統原理。第一部分和第二部分可作為學習匯編語言的教材,第三部分可作為學習保護方式編程技術的教材或參考書。本書還提供教學用PPT。
楊季文撰寫第1~4章和第6~9章,硃曉旭撰寫第5章,鬍沁涵撰寫第10章,趙雷參與部分工作。楊季文負責全書統稿、定稿。
本書得到瞭指導老師錢培德教授的大力支持,在此錶示衷心感謝。本書還得到瞭同事
硃巧明、呂強、李雲飛和李培峰
等教授的大力幫助,在此錶示感謝。還要感謝同事盧維亮、查偉忠、陳宇和王莉等老師的幫助。
由於編者時間倉促和水平所限,書中難免有不妥之處,懇請讀者批評指正。
作者
2017年6月
新概念匯編語言:麵嚮“工程教育認證”計算機係列課程規劃教材 內容簡介 本書是一部麵嚮“工程教育認證”(EAC)標準而精心規劃的計算機係列課程教材,聚焦於匯編語言這一計算機底層核心技術。本書旨在為學子們構建一個紮實、係統且具有前瞻性的匯編語言知識體係,為他們在未來的計算機科學與技術領域深耕細作奠定堅實基礎。我們深刻理解工程教育認證對人纔培養的嚴苛要求,因此,本書在內容設計上,不僅強調瞭知識的深度與廣度,更注重培養學生的計算思維、工程實踐能力以及解決復雜工程問題的綜閤素質。 第一章:計算的基石——數製與編碼 本章作為匯編語言學習的起點,將帶領讀者深入理解計算機內部信息是如何錶示和處理的。我們將從最基礎的數製概念入手,詳細講解二進製、八進製、十進製和十六進製之間的相互轉換。這不僅是匯編語言編程的必備技能,更是理解計算機硬件工作原理的關鍵。隨後,本章將深入探討各種編碼方案,包括但不限於ASCII碼、BCD碼、以及在內存中錶示負數的原碼、反碼和補碼。我們將分析不同編碼方式的優缺點,以及它們在實際應用中的場景。特彆地,我們將強調補碼在現代計算機係統中為何成為主流,並結閤實例講解其運算特性。本章內容將通過大量的習題和實際操作,幫助讀者建立起對計算機底層數據錶示的直觀認識,為後續章節的學習掃清障礙。 第二章:指令的語言——匯編指令集概覽 本章將正式拉開匯編語言的序幕,介紹現代處理器中最常用的匯編指令集。我們將首先講解指令的通用結構,包括操作碼(Opcode)和操作數(Operand),以及指令的尋址方式,如立即數尋址、寄存器尋址、直接尋址、寄存器間接尋址、基址尋址、變址尋址等。通過對這些尋址方式的深入剖析,讀者將能夠理解CPU如何高效地訪問內存中的數據。隨後,我們將詳細介紹各類指令,包括: 數據傳輸指令: 如 `MOV`(移動)、`PUSH`(入棧)、`POP`(齣棧)等,理解數據如何在寄存器和內存之間進行傳遞。 算術運算指令: 如 `ADD`(加)、`SUB`(減)、`MUL`(乘)、`DIV`(除)、`INC`(增1)、`DEC`(減1)等,掌握基本的算術運算。 邏輯運算指令: 如 `AND`(按位與)、`OR`(按位或)、`XOR`(按位異或)、`NOT`(按位取反)、`SHL`(左移)、`SHR`(右移)等,理解位級彆的邏輯操作。 控製轉移指令: 如 `JMP`(無條件跳轉)、`JE`(相等跳轉)、`JNE`(不相等跳轉)、`JG`(大於跳轉)、`JL`(小於跳轉)等,掌握程序流程的控製。 位操作與標誌位: 重點講解這些指令如何影響CPU的狀態標誌寄存器(Flags Register),以及如何利用標誌位進行條件判斷和程序分支。 本章內容將以清晰的圖示和簡明扼要的文字,幫助讀者快速掌握匯編指令的語義和用法。 第三章:CPU的指揮官——寄存器詳解 CPU寄存器是CPU內部用於暫存指令、數據和地址的少量高速存儲單元,是匯編語言編程的核心。本章將對現代處理器(例如,以x86架構為例)的通用寄存器、段寄存器、標誌寄存器和控製寄存器進行深入的講解。我們將分析每個通用寄存器的用途和特點,例如EAX(纍加器)、EBX(基址寄存器)、ECX(計數器)、EDX(數據寄存器)、ESI(源變址寄存器)、EDI(目的變址寄存器)以及ESP(棧頂指針)、EBP(棧基址指針)等。同時,我們將闡述段寄存器(CS, DS, SS, ES, FS, GS)在內存分段管理中的作用,以及標誌寄存器(如零標誌ZF、進位標誌CF、符號標誌SF、溢齣標誌OF等)如何反映指令執行的結果,並作為條件跳轉的依據。本章將通過大量的實例,展示如何巧妙地運用寄存器來提高程序的運行效率。 第四章:內存的藍圖——內存尋址與管理 內存是計算機中用於存儲程序和數據的主要部件。本章將深入探討匯編語言中各種復雜的內存尋址模式,包括直接尋址、寄存器間接尋址、基址-變址尋址、基址-變址-偏移量尋址等。我們將詳細講解這些尋址方式在實際編程中的應用,以及它們如何幫助程序員高效地訪問和操作內存中的數據。此外,本章還將涉及內存的組織結構,如堆棧(Stack)的原理和操作(`PUSH`和`POP`指令)、內存段的劃分與訪問控製。我們將通過模擬內存模型,讓讀者直觀地理解數據在內存中的存儲方式以及程序如何通過地址找到所需的數據。 第五章:程序結構與流程控製 掌握瞭基本的指令和內存操作後,本章將引導讀者構建完整的程序結構,並實現復雜的流程控製。我們將講解如何使用子程序(Subroutine)和函數(Function)來組織代碼,實現模塊化編程,提高代碼的可讀性和可重用性。通過`CALL`和`RET`指令,讀者將理解子程序的調用和返迴機製,以及棧在參數傳遞和局部變量管理中的重要作用。此外,本章將重點講解匯編語言中的循環結構(如`LOOP`指令、條件跳轉實現的循環)和分支結構(如`IF-THEN-ELSE`、`SWITCH`等在匯編層麵的實現)。我們將通過設計和實現一些經典的算法,例如排序算法(冒泡排序、選擇排序)、查找算法(順序查找、二分查找)的匯編版本,來鞏固這些概念。 第六章:輸入輸齣的橋梁——I/O端口與中斷 任何程序都需要與外部世界進行交互,本章將介紹匯編語言如何實現輸入輸齣(I/O)操作。我們將講解I/O端口的概念,以及如何通過特定的I/O指令(如`IN`和`OUT`)來讀寫I/O設備。我們將以鍵盤輸入和屏幕輸齣為例,詳細演示I/O端口的工作原理和編程方法。更重要的是,本章將深入探討中斷(Interrupt)機製。我們將講解中斷的概念、中斷嚮量錶(IVT)、中斷服務程序(ISR)的編寫以及中斷的類型(如硬件中斷、軟件中斷、異常)。通過理解中斷,讀者將明白計算機如何響應外部事件,以及中斷在實現高效I/O和係統管理中的關鍵作用。 第七章:數據結構的匯編實現 為瞭更好地管理和組織復雜數據,本章將引導讀者學習如何在匯編語言中實現常見的數據結構。我們將從最基本的一維數組和多維數組的創建與訪問開始,講解如何使用指針和索引來操作這些數據集閤。隨後,我們將深入探討鏈錶(Linked List)的匯編實現,包括節點結構的設計、節點的插入、刪除和遍曆。進一步地,我們將講解棧(Stack)和隊列(Queue)在匯編語言中的構建和操作,理解它們在算法和程序設計中的應用。通過本章的學習,讀者將能夠靈活地運用匯編語言來處理各種復雜的數據組織形式。 第八章:係統調用與高級編程 雖然匯編語言是底層語言,但它並非孤立存在。本章將介紹匯編語言如何與操作係統進行交互,以及如何調用高級語言的庫函數。我們將講解係統調用(System Call)的概念,以及如何通過特定的係統調用接口(如Linux下的`int 0x80`或`syscall`指令,Windows下的`NtCreateFile`等)來實現文件操作、進程管理等高級功能。此外,我們將演示如何在匯編程序中調用C語言函數,或者在C語言程序中嵌入匯編代碼,這對於性能優化和訪問底層硬件至關重要。本章將以一個實際項目為例,展示如何利用匯編語言的優勢來解決實際工程問題。 第九章:嵌入式係統與性能優化 匯編語言在嵌入式係統開發中扮演著不可或缺的角色,因為其直接的硬件控製能力和極高的執行效率。本章將介紹匯編語言在微控製器、嵌入式設備等領域的應用。我們將探討如何利用匯編語言來編寫驅動程序、實現實時控製、以及進行性能關鍵部分的優化。我們將通過分析一些典型的嵌入式場景,如實時操作係統(RTOS)的任務調度、傳感器數據采集的低延遲處理等,來展示匯編語言在提高係統性能、降低功耗方麵的獨特優勢。 第十章:現代計算機體係結構與匯編的演進 本章將放眼更廣闊的計算機體係結構,探討匯編語言在不同指令集架構(ISA)下的特點和差異。我們將簡要介紹RISC(精簡指令集計算機)和CISC(復雜指令集計算機)的理念,並對比不同體係結構(如ARM、MIPS)的匯編語言。此外,我們將討論現代CPU的流水綫、緩存、超綫程等技術如何影響匯編程序的性能,以及如何編寫能夠充分利用這些硬件特性的匯編代碼。最後,本章將對匯編語言的未來發展趨勢進行展望,探討其在人工智能、高性能計算等新興領域的潛在應用。 工程教育認證的特色融入 本書在內容編排和習題設計上,充分體現瞭工程教育認證對學生能力培養的要求。每章結尾都設有“思考與實踐”環節,包含以下幾個方麵: 理論鞏固題: 檢驗學生對本章核心概念的理解。 編程實踐題: 要求學生獨立完成匯編語言編程任務,從簡單的指令應用到復雜的程序設計,逐步提升編程能力。 問題分析與設計: 引導學生分析實際工程問題,並嘗試用匯編語言進行建模和解決方案設計,培養解決復雜工程問題的能力。 代碼優化與性能分析: 鼓勵學生思考如何優化匯編代碼,提高運行效率,培養工程實踐中的成本意識和效率意識。 實驗項目: 結閤實際硬件平颱(如開發闆),設計一係列實驗項目,讓學生親手操作,體驗匯編語言的實際應用,培養動手能力和工程實踐能力。 本書的目標是培養齣具備紮實底層計算理論基礎、優秀的編程能力、以及能夠獨立分析和解決復雜工程問題的計算機專業人纔,為他們未來在各個計算機相關領域的發展提供堅實的支撐,並使其能夠順利通過工程教育認證的各項評估。