-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

x86匯編語言:從實模式到保護模式

( 簡體 字)
作者:李忠,王曉波,余潔類別:1. -> 程式設計 -> 組合語言/編譯原理 -> 組合語言程式設計
譯者:
出版社:電子工業出版社x86匯編語言:從實模式到保護模式 3dWoo書號: 34506
詢問書籍請說出此書號!

缺書
不接受訂購

出版日:1/1/2013
頁數:360
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
不接受訂購
ISBN:9787121187995-1
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

盡管匯編語言也是一種計算機語言,但卻是與眾不同的,與它的同類們格格不入。一方面,處理器的工作是執行指令,用它所做的一切都是執行指令并獲得結果;另一方面,匯編語言為每一種指令提供了簡單好記、易于書寫的符號化表示形式。
一直以來,人們對于匯編語言的認識和評價可以分為兩種,一種是覺得它非常簡單,另一種是覺得它學習起來非常困難。
你認為我會贊同哪一種?說匯編語言難學,這沒有道理。學習任何一門計算機語言,都需要一些數制和數制轉換的知識,也需要大體上懂得計算機是怎么運作的。在這個前提下,匯編語言是最貼近硬件實體的,也是最自然和最樸素的。最樸素的東西反而最難掌握,這實在說不過去。因此,原因很可能出在我們的教科書上,那些一上來就搞一大堆尋址方式的書,往往以最快的速度打敗了本來激情高昂的初學者。
但是,說匯編語言好學,也同樣有些荒謬。據我的觀察,很多人掌握了若干計算機指令,會編寫一個從鍵盤輸入數據,然后進行加減乘除或者歸類排序的程序后,就認為自己掌握了匯編語言。還有,直到現在,我還經常在網上看到學生們使用DOS中斷編寫程序,他們討論的也大多是實模式,而非32位或者64位保護模式。他們知道如何編譯源程序,也知道在命令行輸入文件名,程序就能運行了,使用一個中斷,就能顯示字符。至于這期間發生了什么,程序是如何加載到內存中的,又是怎么重定位的,似乎從來不關匯編語言的事。這樣做的結果,就是讓人以為匯編語言不過如此,沒有大用,而且非常枯燥。
很難說我已經掌握了匯編語言的要義。但至少我知道,盡管匯編語言不適合用來編寫大型程序,但它對于理解計算機原理很有幫助,特別是處理器的工作原理和運行機制。就算是為了這個目的,也應該讓匯編語言回歸它的本位,那就是訪問和控制硬件(包括處理器),而不僅僅是編寫程序,輸入幾個數字,找出正數有幾個、負數有幾個,大于30的有幾個。
事實上,匯編語言對學習和理解高級語言,比如C語言,也有極大的幫助。老教授琢磨了好幾天,終于想到一個好的比喻來幫助學生理解什么是指針,實際上,這對于懂得匯編語言的學生來說,根本就不算個事兒,并因此能夠使老教授省下時間來喝茶。
對于一個國家來說,不能沒有人來研究基礎學科,盡管它們不能直接產生效益;而對于一個人來說,也不能沒有常識。盡管常識不能直接掙錢吃飯,但它影響談吐,影響你的判斷力和決斷力,決定著你接受新事物和新知識的程度。相應地,匯編語言就是計算機語言里的常識和基礎。
這是繼《穿越計算機的迷霧》之后,我寫的第二本書。這本書與上本書有兩點不同,第一,上一本花了4年才完成,而這本只用了一年,速度之快,令我自己咂舌;第二,上本書屬于科普性質,漫談計算機原理,這本書就相對專業了。那些還想把我的書當小說看的人,這回要失望了。
很多人可能會問我,為什么要寫這樣一本書。我只能說,我第一次學匯編的經歷實在是太深刻了。我第一次學匯編語言是在1993年,手中的教材不能說不好,但學習起來實在很吃力。要知道,在那個年代,沒有網絡,要買到好書,還得到大武漢。就這樣,我抱著兩本書,反反復復地看,直到半年之后才懂得匯編語言是個什么東西。后來,雖然有心寫一本匯編語言的書,一本不一樣的匯編語言書,但始終沒有時間和精力。
時間過得真快,轉眼20年過去了。猛回頭,我發現同學們依然在走我的老路,他們所用的教材,都還是我那個年代的,至少區別不大,都還在講8086處理器的實模式。保護模式是從哪個處理器開始引入的?當然是80286。它是哪個年代的產品?1982年!可是,直到現在,市面上也找不到太多能夠把保護模式講得比較清楚的圖書。
也許我應該做點什么。不,事實上,我已經做了,那就是你手中的這本圖書。王曉波和湖北經濟學院的余潔共同參與了本書的創作。
在計劃寫這本書的時候,我就給自己畫了幾條線。首先不能走老路,一上來就講指令、尋址方式,采用任務驅動方式來寫,每一章都要做點事情,最好是比較有趣,足夠引起讀者的事情。在解決問題的過程中,引入一個個的指令,并進行講解。一句話,我希望是潤物細無聲式的。
其次,匯編語言和硬件并舉,完全拋棄BIOS中斷和DOS中斷,直接訪問硬件,發揮匯編語言的長處。這樣,讀者才會深刻體會到匯編的妙處。
這套圖書主要講述16位實模式、32位保護模式和Intel-64架構。引入虛擬8086模式是為了兼容傳統的8086程序,現在看來已經完全過時,不再進行講述。至于增強的32位模式IA-32e,讀者可以在讀完這本書之后自學,也予以省略。
書中配套的程序清單和源代碼以及可能用到的程序軟件,感興趣的讀者可到電子工業出版社華信教育資源網下載(待定)。
本書原來有18章,后來,考慮到實模式的內容過多,而去掉了一章。這一章的標題是《聆聽數字的聲音》,講述如何通過直接訪問和控制Sound Blaster 16聲卡來播放聲音,對此感興趣的朋友可以在配書光盤中找到它。
特別感謝長春電視臺的王志強臺長和臺長助理周武軍,上本書《穿越計算機的迷霧》出版后,臺長王志強親自過問出版情況,并給予我特別的獎勵,希望大家同樣能從這本書中讀到他們對我的關懷和鼓勵;同時也要感謝我的母親、我愛人和我的女兒,她們是我的精神支柱。好友王南洋、桑國偉、劉維釗、蔣勝友、邱海龍、萬利等負責了本書的一部分校對工作;好友周衛平幫我驗證配書代碼是否能夠在他的機器上正常工作;如果想調試本書中的程序,可以使用bochs軟件,它的視頻教程是由王南洋制作的,在這里向他們表示感謝。在閱讀本書的過程中,如果有任何問題,可以按以下電子郵件地址給我寫信:leechung@126.com;或者進入我的博客參與討論。

二?一二年八月
內容簡介:

每一種處理器都有它自己的機器指令集,而匯編語言的發明則是為了方便這些機器指令的記憶和書寫。盡管匯編語言已經較少用于大型軟件程序的開發,但從學習者的角度來看,要想真正理解計算機的工作原理,掌握它內部的運行機制,學習匯編語言是必不可少的。
本書采用開源的NASM匯編語言編譯器和VirtualBox虛擬機軟件,以個人計算機廣泛采用的Intel處理器為基礎,詳細講解了Intel處理器的指令系統和工作模式,以大量的代碼演示了16/32/64位軟件的開發方法,介紹了處理器的16位實模式和32位保護模式,以及基本的指令系統。
這是一本有趣的書,它沒有把篇幅花在計算一些枯燥的數學題上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、Windows、Linux或者任何其他軟件支持的情況下來顯示字符、讀取硬盤數據、控制其他硬件等。本書可作為大專院校相關專業學生和計算機編程愛好者的教程。

目錄:

第1部分 預備知識
第1章 十六進制計數法 3
1.1 二進制計數法回顧 3
1.1.1 關于二進制計數法 3
1.1.2 二進制到十進制的轉換 3
1.1.3 十進制到二進制的轉換 4
1.2 十六進制計數法 4
1.2.1 十六進制計數法的原理 4
1.2.2 十六進制到十進制的轉換 5
1.2.3 十進制到十六進制的轉換 6
1.3 為什么需要十六進制 6
本章習題 7
第2章 處理器、內存和指令 8
2.1 最早的處理器 8
2.2 寄存器和算術邏輯部件 8
2.3 內存儲器 10
2.4 指令和指令集 11
2.5 古老的Intel 8086處理器 13
2.5.1 8086的通用寄存器 13
2.5.2 程序的重定位難題 14
2.5.3 內存分段機制 17
2.5.4 8086的內存分段機制 18
本章習題 21
第3章 匯編語言和匯編軟件 22
3.1 匯編語言簡介 22
3.2 NASM編譯器 24
3.2.1 從網上下載NASM安裝程序 24
3.2.2 安裝NASM編譯器 25
3.2.3 下載配書源碼和工具 26
3.2.4 用Nasmide體驗代碼的書寫和編譯過程 28
3.2.5 用HexView觀察編譯后的機器代碼 29
本章習題 30

第4章 虛擬機的安裝和使用 31
4.1 計算機的啟動過程 31
4.1.1 如何將編譯好的程序提交給處理器 31
4.1.2 計算機的加電和復位 31
4.1.3 基本輸入輸出系統 32
4.1.4 硬盤及其工作原理 33
4.1.5 一切從主引導扇區開始 35
4.2 創建和使用虛擬機 35
4.2.1 別害怕,虛擬機是軟件 35
4.2.2 下載Oracle VM VirtualBox 36
4.2.3 安裝Oracle VM VirtualBox 36
4.2.4 創建一臺虛擬PC 37
4.2.5 虛擬硬盤簡介 42
4.2.6 練習使用FixVhdWr工具向虛擬硬盤寫數據 43
第2部分 16位處理器下的實模式
第5章 編寫主引導扇區代碼 49
5.1 歡迎來到主引導扇區 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 顯示標號的匯編地址 56
5.4.1 標號 56
5.4.2 如何顯示十進制數字 60
5.4.3 在程序中聲明并初始化數據 61
5.4.4 分解數的各個數位 61
5.4.5 顯示分解出來的各個數位 65
5.5 使程序進入無限循環狀態 66
5.6 完成并編譯主引導扇區代碼 67
5.6.1 主引導扇區有效標志 67
5.6.2 代碼的保存和編譯 68
5.7 加載和運行主引導扇區代碼 68
5.7.1 把編譯后的指令寫入主引導扇區 68
5.7.2 啟動虛擬機觀察運行結果 70
5.7.3 程序的調試 70
本章習題 71
第6章 相同的功能,不同的代碼 72
6.1 代碼清單6-1 72
6.2 跳過非指令的數據區 72
6.3 在數據聲明中使用字面值 72
6.4 段地址的初始化 73
6.5 段之間的批量數據傳送 74
6.6 使用循環分解數位 75
6.7 計算機中的負數 77
6.7.1 無符號數和有符號數 77
6.7.2 處理器視角中的數據類型 80
6.8 數位的顯示 82
6.9 其他標志位和條件轉移指令 83
6.9.1 奇偶標志位PF 83
6.9.2 進位標志CF 83
6.9.3 溢出標志OF 84
6.9.4 現有指令對標志位的影響 84
6.9.5 條件轉移指令 85
6.10 NASM編譯器的$和$$標記 87
6.11 觀察運行結果 87
本章習題 88
第7章 比高斯更快的計算 89
7.1 從1加到100的故事 89
7.2 代碼清單7-1 89
7.3 顯示字符串 89
7.4 計算1到100的累加和 90
7.5 累加和各個數位的分解與顯示 90
7.5.1 堆棧和堆棧段的初始化 90
7.5.2 分解各個數位并壓棧 92
7.5.3 出棧并顯示各個數位 94
7.5.4 進一步認識堆棧 95
7.6 程序的編譯和運行 96
7.7 8086處理器的尋址方式 96
7.7.1 寄存器尋址 96
7.7.2 立即尋址 97
7.7.3 內存尋址 97
本章習題 101
第8章 硬盤和顯卡的訪問與控制 102
8.1 本章代碼清單 102
8.1.1 本章意圖 102
8.1.2 代碼清單8-1 103
8.2 用戶程序的結構 103
8.2.1 分段、段的匯編地址和段內匯編地址 103
8.2.2 用戶程序頭部 106
8.3 加載程序(器)的工作流程 109
8.3.1 初始化和決定加載位置 109
8.3.2 準備加載用戶程序 110
8.3.3 外圍設備及其接口 111
8.3.4 I/O端口和端口訪問 112
8.3.5 通過硬盤控制器端口讀扇區數據 114
8.3.6 過程調用 116
8.3.7 加載用戶程序 121
8.3.8 用戶程序重定位 122
8.3.9 將控制權交給用戶程序 126
8.3.10 8086處理器的無條件轉移指令 126
8.4 用戶程序的工作流程 128
8.4.1 初始化段寄存器和堆棧切換 128
8.4.2 調用字符串顯示例程 129
8.4.3 過程的嵌套 130
8.4.4 屏幕光標控制 131
8.4.5 取當前光標位置 131
8.4.6 處理回車和換行字符 132
8.4.7 顯示可打印字符 133
8.4.8 滾動屏幕內容 134
8.4.9 重置光標 134
8.4.10 切換到另一個代碼段中執行 135
8.4.11 訪問另一個數據段 135
8.5 編譯和運行程序并觀察結果 135
本章習題 136
第9章 中斷和動態時鐘顯示 137
9.1 外部硬件中斷 137
9.1.1 非屏蔽中斷 138
9.1.2 可屏蔽中斷 138
9.1.3 實模式下的中斷向量表 140
9.1.4 實時時鐘、CMOS RAM和BCD編碼 141
9.1.5 代碼清單9-1 145
9.1.6 初始化8259、RTC和中斷向量表 145
9.1.7 使處理器進入低功耗狀態 147
9.1.8 實時時鐘中斷的處理過程 148
9.1.9 代碼清單9-1的編譯和運行 150
9.2 內部中斷 150
9.3 軟中斷 151
9.3.1 常用的BIOS中斷 151
9.3.2 代碼清單9-2 155
9.3.3 從鍵盤讀字符并顯示 155
9.3.4 代碼清單9-2的編譯和運行 155
本章習題 156
第3部分 32位保護模式
第10章 32位Intel微處理器編程架構 159
10.1 IA-32架構的基本執行環境 164
10.1.1 寄存器的擴展 162
10.1.2 基本的工作模式 162
10.1.3 線性地址 163
10.2 現代處理器的結構和特點 164
10.2.1 流水線 164
10.2.2 高速緩存 165
10.2.3 亂序執行 165
10.2.4 寄存器重命名 166
10.2.5 分支目標預測 167
10.3 32位模式的指令系統 168
10.3.1 32位處理器的尋址方式 168
10.3.2 操作數大小的指令前綴 169
10.3.3 一般指令的擴展 171
本章習題 174
第11章 進入保護模式 175
11.1 代碼清單11-1 175
11.2 全局描述符表 175
11.3 存儲器的段描述符 177
11.4 安裝存儲器的段描述符并加載GDTR 180
11.5 關于第21條地址線A20的問題 182
11.6 保護模式下的內存訪問 184
11.7 清空流水線并串行化處理器 188
11.8 保護模式下的堆棧 189
11.8.1 關于堆棧段描述符中的界限值 189
11.8.2 檢驗32位下的堆棧操作 190
11.9 程序的編譯和運行 191
本章習題 191

第12章 存儲器的保護 192
12.1 代碼清單12-1 192
12.2 進入32位保護模式 192
12.2.1 話說mov ds,ax和mov ds,eax 192
12.2.2 創建GDT并安裝段描述符 193
12.3 修改段寄存器時的保護 195
12.4 地址變換時的保護 197
12.4.1 代碼段執行時的保護 197
12.4.2 堆棧操作時的保護 198
12.4.3 數據訪問時的保護 200
12.5 使用別名訪問代碼段對字符排序 201
12.6 程序的編譯和運行 203
本章習題 203
第13章 程序的動態加載和執行 204
13.1 本章代碼清單 204
13.2 內核的結構、功能和加載 205
13.2.1 內核的結構 205
13.2.2 內核的加載 206
13.2.3 安裝內核的段描述符 208
13.3 在內核中執行 211
13.4 用戶程序的加載和重定位 213
13.4.1 用戶程序的結構 213
13.4.2 計算用戶程序占用的扇區數 215
13.4.3 簡單的動態內存分配 216
13.4.4 段的重定位和描述符的創建 217
13.4.5 重定位用戶程序內的符號地址 220
13.5 執行用戶程序 224
13.6 代碼的編譯、運行和調試 226
本章習題 227
第14章 任務和特權級保護 228
14.1 任務的隔離和特權級保護 228
14.1.1 任務、任務的LDT和TSS 228
14.1.2 全局空間和局部空間 231
14.1.3 特權級保護概述 232
14.2 代碼清單14-1 239
14.3 內核程序的初始化 239
14.3.1 調用門 240
14.3.2 調用門的安裝和測試 243
14.4 加載用戶程序并創建任務 246
14.4.1 任務控制塊和TCB鏈 246
14.4.2 使用堆棧傳遞過程參數 248
14.4.3 加載用戶程序 250
14.4.4 創建局部描述符表 250
14.4.5 重定位U-SALT表 252
14.4.6 創建0、1和2特權級的堆棧 252
14.4.7 安裝LDT描述符到GDT中 253
14.4.8 任務狀態段TSS的格式 254
14.4.9 創建任務狀態段TSS 258
14.4.10 安裝TSS描述符到GDT中 258
14.4.11 帶參數的過程返回指令 259
14.5 用戶程序的執行 260
14.5.1 通過調用門轉移控制的完整過程 260
14.5.2 進入3特權級的用戶程序的執行 263
14.5.3 檢查調用者的請求特權級RPL 266
本章習題 267
第15章 任 務 切 換 268
15.1 本章代碼清單 268
15.2 任務切換前的設置 268
15.3 任務切換的方法 270
15.4 用call/jmp/iret指令發起任務切換的實例 273
15.5 處理器在實施任務切換時的操作 277
15.6 程序的編譯和運行 279
本章習題 280
第16章 分頁機制和動態頁面分配 281
16.1 分頁機制概述 281
16.1.1 簡單的分頁模型 281
16.1.2 頁目錄、頁表和頁 286
16.1.3 地址變換的具體過程 288
16.2 本章代碼清單 289
16.3 使內核在分頁機制下工作 289
16.3.1 創建內核的頁目錄和頁表 289
16.3.2 任務全局空間和局部空間的頁面映射 294
16.4 創建內核任務 300
16.4.1 內核的虛擬內存分配 300
16.4.2 頁面位映射串和空閑頁的查找 301
16.4.3 創建頁表并登記分配的頁 304
16.4.4 創建內核任務的TSS 305
16.5 用戶任務的創建和切換 305
16.5.1 多段模型和段頁式內存管理 305
16.5.2 平坦模型和用戶程序的結構 307
16.5.3 用戶任務的虛擬地址空間分配 308
16.5.4 用戶程序的加載 309
16.5.5 段描述符的創建(平坦模型) 312
16.5.6 重定位U-SALT并復制頁目錄表 314
16.5.7 切換到用戶任務執行 316
16.6 程序的編譯和執行 317
本章習題 317
第17章 中斷和異常的處理 318
17.1 中斷和異常 318
17.1.1 中斷和異常概述 318
17.1.2 中斷描述符表、中斷門和陷阱門 321
17.1.3 中斷和異常處理程序的保護 323
17.1.4 中斷任務 324
17.1.5 錯誤代碼 325
17.2 本章代碼清單 326
17.3 內核的加載和初始化 327
17.3.1 徹底終結多段模型 327
17.3.2 創建中斷描述符表 330
17.3.3 用定時中斷實施任務切換 331
17.3.4 8259A芯片的初始化 337
17.3.5 平坦模型下的字符串顯示例程 339
17.4 內核任務的創建 340
17.4.1 創建內核任務的TCB 340
17.4.2 宏匯編技術 341
17.5 用戶任務的創建 343
17.5.1 準備加載用戶程序 343
17.5.2 轉換后援緩沖器的刷新 344
17.5.3 用戶任務的創建和初始化 346
17.6 程序的編譯和執行 348
本章習題 348
序: