出版時(shí)間:2013-1 出版社:電子工業(yè)出版社 作者:李忠 頁數(shù):360 字?jǐn)?shù):620000
Tag標(biāo)簽:無
內(nèi)容概要
每一種處理器都有它自己的機(jī)器指令集,而匯編語言的發(fā)明則是為了方便這些機(jī)器指令的記憶和書寫。盡管匯編語言已經(jīng)較少用于大型軟件程序的開發(fā),但從學(xué)習(xí)者的角度來看,要想真正理解計(jì)算機(jī)的工作原理,掌握它內(nèi)部的運(yùn)行機(jī)制,學(xué)習(xí)匯編語言是必不可少的。
本書采用開源的NASM匯編語言編譯器和VirtualBox虛擬機(jī)軟件,以個(gè)人計(jì)算機(jī)廣泛采用的Intel處理器為基礎(chǔ),詳細(xì)講解了Intel處理器的指令系統(tǒng)和工作模式,以大量的代碼演示了16/32/64位軟件的開發(fā)方法,介紹了處理器的16位實(shí)模式和32位保護(hù)模式,以及基本的指令系統(tǒng)。
這是一本有趣的書,它沒有把篇幅花在計(jì)算一些枯燥的數(shù)學(xué)題上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、Windows、Linux或者任何其他軟件支持的情況下來顯示字符、讀取硬盤數(shù)據(jù)、控制其他硬件等。本書可作為大專院校相關(guān)專業(yè)學(xué)生和計(jì)算機(jī)編程愛好者的教程。
書籍目錄
目 錄
第1部分 預(yù)備知識
第1章 十六進(jìn)制計(jì)數(shù)法 3
1.1 二進(jìn)制計(jì)數(shù)法回顧 3
1.1.1 關(guān)于二進(jìn)制計(jì)數(shù)法 3
1.1.2 二進(jìn)制到十進(jìn)制的轉(zhuǎn)換 3
1.1.3 十進(jìn)制到二進(jìn)制的轉(zhuǎn)換 4
1.2 十六進(jìn)制計(jì)數(shù)法 4
1.2.1 十六進(jìn)制計(jì)數(shù)法的原理 4
1.2.2 十六進(jìn)制到十進(jìn)制的轉(zhuǎn)換 5
1.2.3 十進(jìn)制到十六進(jìn)制的轉(zhuǎn)換 6
1.3 為什么需要十六進(jìn)制 6
本章習(xí)題 7
第2章 處理器、內(nèi)存和指令 8
2.1 最早的處理器 8
2.2 寄存器和算術(shù)邏輯部件 8
2.3 內(nèi)存儲(chǔ)器 10
2.4 指令和指令集 11
2.5 古老的Intel 8086處理器 13
2.5.1 8086的通用寄存器 13
2.5.2 程序的重定位難題 14
2.5.3 內(nèi)存分段機(jī)制 17
2.5.4 8086的內(nèi)存分段機(jī)制 18
本章習(xí)題 21
第3章 匯編語言和匯編軟件 22
3.1 匯編語言簡介 22
3.2 NASM編譯器 24
3.2.1 從網(wǎng)上下載NASM安裝程序 24
3.2.2 安裝NASM編譯器 25
3.2.3 下載配書源碼和工具 26
3.2.4 用Nasmide體驗(yàn)代碼的書寫和編譯過程 28
3.2.5 用HexView觀察編譯后的機(jī)器代碼 29
本章習(xí)題 30
第4章 虛擬機(jī)的安裝和使用 31
4.1 計(jì)算機(jī)的啟動(dòng)過程 31
4.1.1 如何將編譯好的程序提交給處理器 31
4.1.2 計(jì)算機(jī)的加電和復(fù)位 31
4.1.3 基本輸入輸出系統(tǒng) 32
4.1.4 硬盤及其工作原理 33
4.1.5 一切從主引導(dǎo)扇區(qū)開始 35
4.2 創(chuàng)建和使用虛擬機(jī) 35
4.2.1 別害怕,虛擬機(jī)是軟件 35
4.2.2 下載Oracle VM VirtualBox 36
4.2.3 安裝Oracle VM VirtualBox 36
4.2.4 創(chuàng)建一臺(tái)虛擬PC 37
4.2.5 虛擬硬盤簡介 42
4.2.6 練習(xí)使用FixVhdWr工具向虛擬硬盤寫數(shù)據(jù) 43
第2部分 16位處理器下的實(shí)模式
第5章 編寫主引導(dǎo)扇區(qū)代碼 49
5.1 歡迎來到主引導(dǎo)扇區(qū) 49
5.2 注釋 49
5.3 在屏幕上顯示文字 50
5.3.1 顯卡和顯存 50
5.3.2 初始化段寄存器 52
5.3.3 顯存的訪問和ASCII代碼 53
5.3.4 顯示字符 55
5.4 顯示標(biāo)號的匯編地址 56
5.4.1 標(biāo)號 56
5.4.2 如何顯示十進(jìn)制數(shù)字 60
5.4.3 在程序中聲明并初始化數(shù)據(jù) 61
5.4.4 分解數(shù)的各個(gè)數(shù)位 61
5.4.5 顯示分解出來的各個(gè)數(shù)位 65
5.5 使程序進(jìn)入無限循環(huán)狀態(tài) 66
5.6 完成并編譯主引導(dǎo)扇區(qū)代碼 67
5.6.1 主引導(dǎo)扇區(qū)有效標(biāo)志 67
5.6.2 代碼的保存和編譯 68
5.7 加載和運(yùn)行主引導(dǎo)扇區(qū)代碼 68
5.7.1 把編譯后的指令寫入主引導(dǎo)扇區(qū) 68
5.7.2 啟動(dòng)虛擬機(jī)觀察運(yùn)行結(jié)果 70
5.7.3 程序的調(diào)試 70
本章習(xí)題 71
第6章 相同的功能,不同的代碼 72
6.1 代碼清單6-1 72
6.2 跳過非指令的數(shù)據(jù)區(qū) 72
6.3 在數(shù)據(jù)聲明中使用字面值 72
6.4 段地址的初始化 73
6.5 段之間的批量數(shù)據(jù)傳送 74
6.6 使用循環(huán)分解數(shù)位 75
6.7 計(jì)算機(jī)中的負(fù)數(shù) 77
6.7.1 無符號數(shù)和有符號數(shù) 77
6.7.2 處理器視角中的數(shù)據(jù)類型 80
6.8 數(shù)位的顯示 82
6.9 其他標(biāo)志位和條件轉(zhuǎn)移指令 83
6.9.1 奇偶標(biāo)志位PF 83
6.9.2 進(jìn)位標(biāo)志CF 83
6.9.3 溢出標(biāo)志OF 84
6.9.4 現(xiàn)有指令對標(biāo)志位的影響 84
6.9.5 條件轉(zhuǎn)移指令 85
6.10 NASM編譯器的$和$$標(biāo)記 87
6.11 觀察運(yùn)行結(jié)果 87
本章習(xí)題 88
第7章 比高斯更快的計(jì)算 89
7.1 從1加到100的故事 89
7.2 代碼清單7-1 89
7.3 顯示字符串 89
7.4 計(jì)算1到100的累加和 90
7.5 累加和各個(gè)數(shù)位的分解與顯示 90
7.5.1 堆棧和堆棧段的初始化 90
7.5.2 分解各個(gè)數(shù)位并壓棧 92
7.5.3 出棧并顯示各個(gè)數(shù)位 94
7.5.4 進(jìn)一步認(rèn)識堆棧 95
7.6 程序的編譯和運(yùn)行 96
7.7 8086處理器的尋址方式 96
7.7.1 寄存器尋址 96
7.7.2 立即尋址 97
7.7.3 內(nèi)存尋址 97
本章習(xí)題 101
第8章 硬盤和顯卡的訪問與控制 102
8.1 本章代碼清單 102
8.1.1 本章意圖 102
8.1.2 代碼清單8-1 103
8.2 用戶程序的結(jié)構(gòu) 103
8.2.1 分段、段的匯編地址和段內(nèi)匯編地址 103
8.2.2 用戶程序頭部 106
8.3 加載程序(器)的工作流程 109
8.3.1 初始化和決定加載位置 109
8.3.2 準(zhǔn)備加載用戶程序 110
8.3.3 外圍設(shè)備及其接口 111
8.3.4 I/O端口和端口訪問 112
8.3.5 通過硬盤控制器端口讀扇區(qū)數(shù)據(jù) 114
8.3.6 過程調(diào)用 116
8.3.7 加載用戶程序 121
8.3.8 用戶程序重定位 122
8.3.9 將控制權(quán)交給用戶程序 126
8.3.10 8086處理器的無條件轉(zhuǎn)移指令 126
8.4 用戶程序的工作流程 128
8.4.1 初始化段寄存器和堆棧切換 128
8.4.2 調(diào)用字符串顯示例程 129
8.4.3 過程的嵌套 130
8.4.4 屏幕光標(biāo)控制 131
8.4.5 取當(dāng)前光標(biāo)位置 131
8.4.6 處理回車和換行字符 132
8.4.7 顯示可打印字符 133
8.4.8 滾動(dòng)屏幕內(nèi)容 134
8.4.9 重置光標(biāo) 134
8.4.10 切換到另一個(gè)代碼段中執(zhí)行 135
8.4.11 訪問另一個(gè)數(shù)據(jù)段 135
8.5 編譯和運(yùn)行程序并觀察結(jié)果 135
本章習(xí)題 136
第9章 中斷和動(dòng)態(tài)時(shí)鐘顯示 137
9.1 外部硬件中斷 137
9.1.1 非屏蔽中斷 138
9.1.2 可屏蔽中斷 138
9.1.3 實(shí)模式下的中斷向量表 140
9.1.4 實(shí)時(shí)時(shí)鐘、CMOS RAM和BCD編碼 141
9.1.5 代碼清單9-1 145
9.1.6 初始化8259、RTC和中斷向量表 145
9.1.7 使處理器進(jìn)入低功耗狀態(tài) 147
9.1.8 實(shí)時(shí)時(shí)鐘中斷的處理過程 148
9.1.9 代碼清單9-1的編譯和運(yùn)行 150
9.2 內(nèi)部中斷 150
9.3 軟中斷 151
9.3.1 常用的BIOS中斷 151
9.3.2 代碼清單9-2 155
9.3.3 從鍵盤讀字符并顯示 155
9.3.4 代碼清單9-2的編譯和運(yùn)行 155
本章習(xí)題 156
第3部分 32位保護(hù)模式
第10章 32位Intel微處理器編程架構(gòu) 159
10.1 IA-32架構(gòu)的基本執(zhí)行環(huán)境 164
10.1.1 寄存器的擴(kuò)展 162
10.1.2 基本的工作模式 162
10.1.3 線性地址 163
10.2 現(xiàn)代處理器的結(jié)構(gòu)和特點(diǎn) 164
10.2.1 流水線 164
10.2.2 高速緩存 165
10.2.3 亂序執(zhí)行 165
10.2.4 寄存器重命名 166
10.2.5 分支目標(biāo)預(yù)測 167
10.3 32位模式的指令系統(tǒng) 168
10.3.1 32位處理器的尋址方式 168
10.3.2 操作數(shù)大小的指令前綴 169
10.3.3 一般指令的擴(kuò)展 171
本章習(xí)題 174
第11章 進(jìn)入保護(hù)模式 175
11.1 代碼清單11-1 175
11.2 全局描述符表 175
11.3 存儲(chǔ)器的段描述符 177
11.4 安裝存儲(chǔ)器的段描述符并加載GDTR 180
11.5 關(guān)于第21條地址線A20的問題 182
11.6 保護(hù)模式下的內(nèi)存訪問 184
11.7 清空流水線并串行化處理器 188
11.8 保護(hù)模式下的堆棧 189
11.8.1 關(guān)于堆棧段描述符中的界限值 189
11.8.2 檢驗(yàn)32位下的堆棧操作 190
11.9 程序的編譯和運(yùn)行 191
本章習(xí)題 191
第12章 存儲(chǔ)器的保護(hù) 192
12.1 代碼清單12-1 192
12.2 進(jìn)入32位保護(hù)模式 192
12.2.1 話說mov ds,ax和mov ds,eax 192
12.2.2 創(chuàng)建GDT并安裝段描述符 193
12.3 修改段寄存器時(shí)的保護(hù) 195
12.4 地址變換時(shí)的保護(hù) 197
12.4.1 代碼段執(zhí)行時(shí)的保護(hù) 197
12.4.2 堆棧操作時(shí)的保護(hù) 198
12.4.3 數(shù)據(jù)訪問時(shí)的保護(hù) 200
12.5 使用別名訪問代碼段對字符排序 201
12.6 程序的編譯和運(yùn)行 203
本章習(xí)題 203
第13章 程序的動(dòng)態(tài)加載和執(zhí)行 204
13.1 本章代碼清單 204
13.2 內(nèi)核的結(jié)構(gòu)、功能和加載 205
13.2.1 內(nèi)核的結(jié)構(gòu) 205
13.2.2 內(nèi)核的加載 206
13.2.3 安裝內(nèi)核的段描述符 208
13.3 在內(nèi)核中執(zhí)行 211
13.4 用戶程序的加載和重定位 213
13.4.1 用戶程序的結(jié)構(gòu) 213
13.4.2 計(jì)算用戶程序占用的扇區(qū)數(shù) 215
13.4.3 簡單的動(dòng)態(tài)內(nèi)存分配 216
13.4.4 段的重定位和描述符的創(chuàng)建 217
1
章節(jié)摘錄
版權(quán)頁: 插圖: 第13章 程序的動(dòng)態(tài)加載和執(zhí)行 像我一樣,很多人在了解了保護(hù)模式的基本工作原理之后,會(huì)產(chǎn)生一個(gè)疑問。那就是,所有的段在使用之前,都必須以描述符的形式在描述符表中進(jìn)行定義,那么,像操作系統(tǒng)這樣的軟件,又怎么能夠加載和執(zhí)行其他各種用戶程序呢?畢竟,你并不知道這些程序都定義了哪些段,每個(gè)段是什么類型,有多長。 未必所有人都會(huì)產(chǎn)生這樣的疑惑,但我確實(shí)算一個(gè),可能我還不夠聰明。事實(shí)上,這僅僅是一層窗戶紙,一旦捅破了,才發(fā)現(xiàn)原來竟是那么簡單。從某種意義上來說,保護(hù)模式的工作機(jī)制對用戶程序的加載和執(zhí)行非但沒有增加困難,反而帶來了很大的便利。 一套能夠充分說明問題的例子需要很大的代碼量,也許把本書的漢字都去掉,全部換成代碼也不夠。不過,只要能說明問題,也不一定非得完善周全、面面俱到。因此,本章中用于加載和處理用戶程序的做法,不一定,甚至根本就不是操作系統(tǒng)采用的方法。這一點(diǎn),務(wù)必明了。 計(jì)算機(jī)硬件之上是軟件。軟件分兩個(gè)層次,一是操作系統(tǒng),二是應(yīng)用(用戶)程序。通常,用戶程序只關(guān)心問題的解,就是采用各種算法來解決實(shí)際問題。至于軟件是怎么加載到內(nèi)存的,怎么定位的,不是它所操心的事。但是,它有義務(wù)提供一些必要的信息,來幫助操作系統(tǒng)將自己加載到內(nèi)存中。 相反,操作系統(tǒng)則必須考慮采用什么方法來加載用戶程序,并在適當(dāng)?shù)臅r(shí)候?qū)⑻幚砥鞯膱?zhí)行流轉(zhuǎn)移到用戶代碼中去。同時(shí),為了減輕用戶程序的工作量,操作系統(tǒng)還應(yīng)當(dāng)管理硬件,并提供大量的例程供用戶程序使用。比如,顯示一個(gè)字符串,就不要讓用戶自己來寫代碼了,直接調(diào)用操作系統(tǒng)的代碼即可。但操作系統(tǒng)和用戶程序應(yīng)當(dāng)協(xié)商一種機(jī)制,讓用戶程序能夠在使用這些例程時(shí),不必考慮和關(guān)心它們的位置。 本章提供了一個(gè)小小的“操作系統(tǒng)”,因?yàn)楫?dāng)不起這么大的名稱,所以叫“內(nèi)核”或者“核心”。即使是這樣,它依然當(dāng)不起,因?yàn)樗鼘?shí)在是太簡單了。不過,也沒有辦法,就這么湊合著叫吧。 內(nèi)核不能放到主引導(dǎo)扇區(qū)里,畢竟它都很大。所以,計(jì)算機(jī)首先從主引導(dǎo)程序開始執(zhí)行,主引導(dǎo)程序負(fù)責(zé)加載內(nèi)核,并轉(zhuǎn)交控制權(quán)。然后,內(nèi)核負(fù)責(zé)加載用戶程序,并提供各種例程給用戶程序調(diào)用。提供給用戶程序調(diào)用的例程也叫應(yīng)用程序接口(Application Programming Interface,API),本章用簡單的方法來允許用戶程序使用API工作。 本章學(xué)習(xí)目標(biāo): 1.了解保護(hù)模式是為操作系統(tǒng)提供的技術(shù),并沒有給普通應(yīng)用程序的編程帶來負(fù)擔(dān)(這從本章的程序?qū)嵗芯涂梢钥闯鰜恚?2.學(xué)習(xí)操作系統(tǒng)在保護(hù)模式下加載和重定位應(yīng)用程序的一般原理,學(xué)習(xí)簡單的內(nèi)存動(dòng)態(tài)分配,了解應(yīng)用程序接口API的簡單原理,學(xué)習(xí)字符串的比較算法。 3.學(xué)習(xí)若干x86處理器的新指令,包括bswap、cpuid、cmovcc、sgdt、movzx、movsx、cmpsb、cmpsw、cmpsd和xlat等。
編輯推薦
《x86匯編語言:從實(shí)模式到保護(hù)模式》主要講述INTEL x86處理器的16位實(shí)模式、32位保護(hù)模式,至于虛擬8086模式,則是為了兼容傳統(tǒng)的8086程序,現(xiàn)在看來已經(jīng)完全過時(shí),不再進(jìn)行講述?!秞86匯編語言:從實(shí)模式到保護(hù)模式》的特色之一是提供了大量典型的源代碼,這些代碼以及相配套的工具程序可以到書中指定的網(wǎng)站,或者電子工業(yè)出版社華信教育資源網(wǎng)搜索下載。
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載