本書設(shè)定新目標(biāo),采用新方法,基于新平臺,講解IA32結(jié)構(gòu)系列(80x86系列)CPU的32位編程。本書分為4個部分: *部分利用VC 2010環(huán)境的嵌入?yún)R編和目標(biāo)代碼,介紹IA32系列(80x86系列)CPU的基本功能和32位編程技術(shù); 第二部分利用開源匯編器NASM、開源虛擬機VirtualBox和模擬器Bochs,介紹匯編語言和計算機系統(tǒng)底層輸入輸出的實現(xiàn)方式; 第三部分詳細(xì)講解保護(hù)方式編程技術(shù),生動展示保護(hù)方式編程細(xì)節(jié); 第四部分簡要說明相關(guān)軟件工具的使用。
本書依托高級語言,講解低級語言;利用虛擬平臺,演示系統(tǒng)原理。*部分和第二部分可作為高校計算機及電子信息類專業(yè)學(xué)生學(xué)習(xí)匯編語言的教材,第三部分可作為編程愛好者學(xué)習(xí)保護(hù)方式編程技術(shù)的教材或參考書。
全面講解IA-32結(jié)構(gòu)系列(80x86系列)處理器的32位編程。新目標(biāo):理解系統(tǒng)原理,提升編程技能。新方法:依托高級語言,講解低級語言。新平臺:利用虛擬機器,運行示例代碼。
前言
隨著計算資源的日益豐富和開發(fā)環(huán)境的日趨完善,直接運用匯編語言編寫程序的場合越來越少,因此匯編語言課程需要新定位,匯編語言課程需要新概念。
在這樣的背景下,本書設(shè)定新的目標(biāo),采用新的方法,基于新的平臺,講解IA32結(jié)構(gòu)系列(80x86系列)CPU的32位編程。學(xué)習(xí)匯編語言的新目標(biāo)是深入理解計算機系統(tǒng)的工作原理,全面提升高級語言程序設(shè)計能力,而不再是熟練運用匯編語言編寫程序。匯編語言課程將起到上承高級語言,下啟機器系統(tǒng)的橋梁作用。學(xué)習(xí)匯編語言的新方法是依托高級語言。在學(xué)習(xí)匯編語言之前,通常已經(jīng)具備高級語言(C或者C 語言等)程序設(shè)計的基礎(chǔ)。通過采用嵌入?yún)R編和分析目標(biāo)代碼等方法,不僅可以降低學(xué)習(xí)和掌握匯編格式指令的難度,而且有助于知其然,知其所以然,有助于更好地掌握高級語言。實踐匯編語言的新平臺是虛擬機。目前虛擬機已經(jīng)十分流行,它是很理想的裸機。基于虛擬機不僅可以突破操作系統(tǒng)的約束,為所欲為地操縱機器,從而輕松調(diào)試設(shè)備驅(qū)動程序或者系統(tǒng)程序,而且有助于熟悉計算機系統(tǒng)的啟動過程,有助于明了計算機系統(tǒng)硬件和軟件的相互關(guān)系。
本書分為4個部分,共10章。第一部分由前五章組成,利用VC 2010環(huán)境的嵌入?yún)R編和目標(biāo)代碼,講解IA32系列(80x86系列)CPU的基本功能和32位編程技術(shù)。第1章介紹基礎(chǔ)知識;
第2章說明IA32系列CPU的基本功能;
第3章和第4章講解利用IA32系列CPU的指令設(shè)計程序;
第5章分析VC源程序的目標(biāo)代碼。第二部分由第6章、第7章和第8章組成,利用匯編器NASM和虛擬機,講解匯編語言和系統(tǒng)輸入輸出。第6章基于匯編器NASM介紹匯編語言;
第7章在介紹BIOS和主引導(dǎo)記錄之后,說明虛擬機的原理及其使用方法;
第8章基于虛擬機講解計算機系統(tǒng)底層輸入輸出的實現(xiàn)方式。第三部分是第9章,詳細(xì)講解基于IA32系列CPU的保護(hù)方式程序設(shè)計,該章內(nèi)容十分豐富。第四部分是第10章,簡要說明相關(guān)工具的使用,包括開源匯編器NASM、開源虛擬機VirtualBox和開源模擬器Bochs等。
本書依托高級語言,講解低級語言;
利用虛擬平臺,演示系統(tǒng)原理。第一部分和第二部分可作為學(xué)習(xí)匯編語言的教材,第三部分可作為學(xué)習(xí)保護(hù)方式編程技術(shù)的教材或參考書。本書還提供教學(xué)用PPT。
楊季文撰寫第1~4章和第6~9章,朱曉旭撰寫第5章,胡沁涵撰寫第10章,趙雷參與部分工作。楊季文負(fù)責(zé)全書統(tǒng)稿、定稿。
本書得到了指導(dǎo)老師錢培德教授的大力支持,在此表示衷心感謝。本書還得到了同事
朱巧明、呂強、李云飛和李培峰
等教授的大力幫助,在此表示感謝。還要感謝同事盧維亮、查偉忠、陳宇和王莉等老師的幫助。
由于編者時間倉促和水平所限,書中難免有不妥之處,懇請讀者批評指正。
作者
2017年6月
目錄
第1章基礎(chǔ)知識
1.1CPU簡介
1.1.1目標(biāo)代碼
1.1.2基本功能
1.2匯編語言概念
1.2.1機器指令
1.2.2匯編格式指令
1.2.3匯編語言及其優(yōu)缺點
1.3數(shù)據(jù)的表示和存儲
1.3.1數(shù)值數(shù)據(jù)的表示
1.3.2非數(shù)值數(shù)據(jù)的表示
1.3.3基本數(shù)據(jù)類型
1.3.4數(shù)據(jù)的存儲
習(xí)題
第2章IA32處理器基本功能
2.1IA32處理器簡介
2.1.1IA32系列處理器
2.1.2保護(hù)方式和實地址方式
2.2通用寄存器及使用
2.2.1通用寄存器
2.2.2簡單傳送指令
2.2.3簡單加減指令
2.2.4VC嵌入?yún)R編和實驗
2.3標(biāo)志寄存器及使用
2.3.1標(biāo)志寄存器
2.3.2狀態(tài)標(biāo)志
2.3.3狀態(tài)標(biāo)志操作指令
2.3.4帶進(jìn)位加減指令
2.4段寄存器及使用
2.4.1存儲器分段
2.4.2邏輯地址
2.4.3段寄存器
2.5尋址方式
2.5.1立即尋址方式和寄存器尋址方式
2.5.232位的存儲器尋址方式
2.5.3取有效地址指令
2.6指令指針寄存器和簡單控制轉(zhuǎn)移
2.6.1指令指針寄存器
2.6.2常用條件轉(zhuǎn)移指令
2.6.3比較指令和數(shù)值大小比較
2.6.4簡單的無條件轉(zhuǎn)移指令
2.7堆棧和堆棧操作
2.7.1堆棧
2.7.2堆棧操作指令
習(xí)題
第3章程序設(shè)計初步
3.1堆棧的作用
3.1.1過程調(diào)用和返回指令
3.1.2參數(shù)傳遞
3.1.3局部變量
3.2算術(shù)邏輯運算指令
3.2.1乘除運算指令
3.2.2邏輯運算指令
3.2.3移位指令
3.3分支程序設(shè)計
3.3.1分支程序設(shè)計示例
3.3.2無條件和條件轉(zhuǎn)移指令
3.3.3多路分支的實現(xiàn)
3.4循環(huán)程序設(shè)計
3.4.1循環(huán)程序設(shè)計示例
3.4.2循環(huán)指令
3.4.3多重循環(huán)設(shè)計舉例
3.5子程序設(shè)計
3.5.1子程序設(shè)計要點
3.5.2子程序設(shè)計舉例
3.5.3子程序調(diào)用方法
習(xí)題
第4章字符串操作和位操作
4.1字符串操作
4.1.1字符串操作指令
4.1.2重復(fù)操作前綴
4.1.3應(yīng)用舉例
4.2位操作
4.2.1位操作指令
4.2.2應(yīng)用舉例
4.3條件設(shè)置字節(jié)指令
4.3.1條件設(shè)置字節(jié)指令概述
4.3.2應(yīng)用舉例
習(xí)題
第5章VC目標(biāo)代碼的閱讀理解
5.1匯編語言形式的目標(biāo)代碼
5.1.1基本樣式
5.1.2符號化表示
5.2C語言部分編譯的解析
5.2.1類型的轉(zhuǎn)換
5.2.2表達(dá)式求值
5.2.3指針的本質(zhì)
5.2.4結(jié)構(gòu)體變量
5.3C 部分功能實現(xiàn)細(xì)節(jié)
5.3.1引用
5.3.2通過引用傳遞參數(shù)
5.3.3函數(shù)重載
5.3.4虛函數(shù)
5.4目標(biāo)程序的優(yōu)化
5.4.1關(guān)于程序優(yōu)化
5.4.2使大小最小化
5.4.3使速度最大化
5.4.4內(nèi)存地址對齊
5.5C庫函數(shù)分析
5.5.1函數(shù)strlen
5.5.2函數(shù)strpbrk
5.5.3函數(shù)memset
5.6C程序的目標(biāo)代碼
5.6.1Base64編碼操作
5.6.2源程序
5.6.3目標(biāo)程序
習(xí)題
第6章匯編語言
6.1實方式執(zhí)行環(huán)境
6.1.1寄存器和指令集
6.1.2存儲器分段管理
6.1.316位的存儲器尋址方式
6.2源程序和語句
6.2.1匯編語言源程序
6.2.2語句及其格式
6.3操作數(shù)表示
6.3.1常數(shù)
6.3.2數(shù)值表達(dá)式
6.3.3有效地址
6.3.4數(shù)據(jù)類型說明
6.4偽指令語句和變量
6.4.1數(shù)據(jù)定義語句
6.4.2存儲單元定義語句
6.4.3常數(shù)符號聲明語句
6.4.4演示舉例
6.5段聲明和段間轉(zhuǎn)移
6.5.1段聲明語句
6.5.2無條件段間轉(zhuǎn)移指令
6.5.3段間過程調(diào)用和返回指令
6.6目標(biāo)文件和段模式
6.6.1目標(biāo)文件
6.6.2段模式聲明語句
6.7宏
6.7.1宏指令的聲明和使用
6.7.2單行宏的聲明和使用
6.7.3宏相關(guān)方法
習(xí)題
第7章BIOS和虛擬機
7.1BIOS及其調(diào)用
7.1.1BIOS簡介
7.1.2鍵盤輸入和顯示輸出
7.1.3應(yīng)用舉例
7.2磁盤及其讀寫
7.2.1磁盤簡介
7.2.2磁盤讀寫
7.2.3主引導(dǎo)記錄分析
7.3虛擬機
7.3.1虛擬機工作原理
7.3.2虛擬硬盤文件
7.3.3直接寫屏顯示方式
7.4一個簡易的加載器
7.4.1加載方法
7.4.2程序加載器
7.4.3工作程序示例
習(xí)題
第8章輸入輸出和中斷
8.1輸入輸出的基本概念
8.1.1I/O端口地址
8.1.2I/O指令
8.1.3數(shù)據(jù)傳送方式
8.1.4實時時鐘的存取
8.2查詢傳送方式
8.2.1查詢傳送流程
8.2.2實時時鐘的穩(wěn)妥存取
8.3中斷概述
8.3.1中斷的概念
8.3.2中斷向量表
8.3.3中斷響應(yīng)過程
8.3.4內(nèi)部中斷
8.3.5外部中斷
8.3.6中斷優(yōu)先級和中斷嵌套
8.4中斷處理程序設(shè)計
8.4.1鍵盤中斷處理程序
8.4.2除法出錯中斷處理程序
8.4.3擴(kuò)展顯示I/O程序
8.4.4時鐘顯示程序
習(xí)題
第9章保護(hù)方式程序設(shè)計
9.1概述
9.1.1存儲器管理
9.1.2特權(quán)級設(shè)置
9.2分段存儲管理機制
9.2.1存儲段
9.2.2存儲段描述符
9.2.3全局和局部描述符表
9.2.4段選擇子
9.2.5邏輯地址到線性地址的轉(zhuǎn)換
9.3存儲管理寄存器和控制寄存器
9.3.1存儲管理寄存器
9.3.2控制寄存器
9.3.3相關(guān)存取指令
9.4實方式與保護(hù)方式切換示例
9.4.1實方式和保護(hù)方式切換的演示(示例一)
9.4.2不同模式代碼段切換的演示(示例二)
9.4.3局部描述符表使用的演示(示例三)
9.5分頁存儲管理機制
9.5.1存儲分頁
9.5.2線性地址到物理地址的轉(zhuǎn)換
9.5.3頁級保護(hù)和虛擬存儲器支持
9.5.4分頁存儲管理機制的演示(示例四)
9.6任務(wù)狀態(tài)段和控制門
9.6.1系統(tǒng)段描述符
9.6.2門描述符
9.6.3任務(wù)狀態(tài)段
9.7控制轉(zhuǎn)移
9.7.1任務(wù)內(nèi)相同特權(quán)級的轉(zhuǎn)移
9.7.2相同特權(quán)級轉(zhuǎn)移的演示(示例五)
9.7.3任務(wù)內(nèi)不同特權(quán)級的變換
9.7.4特權(quán)級變換的演示(示例六)
9.7.5任務(wù)切換
9.7.6任務(wù)切換的演示(示例七)
9.8中斷和異常的處理
9.8.1異常概念
9.8.2異常類型
9.8.3中斷和異常的處理
9.8.4中斷處理的演示(示例八)
9.8.5異常處理的演示(示例九)
9.9保護(hù)機制小結(jié)
9.9.1轉(zhuǎn)移途徑小結(jié)
9.9.2特權(quán)指令
習(xí)題
第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關(guān)于硬件加速
10.3模擬器Bochs的使用
10.3.1Bochs簡介
10.3.2Bochs的配置與運行
10.3.3控制臺調(diào)試
10.3.4圖形化界面調(diào)試
10.4VHDWriter的使用
參考文獻(xiàn)