本書立足于目前使用為廣泛的Intel x8632和x8664系列的CPU、Windows操作系統(tǒng)及Visual Studio 2019開發(fā)平臺,從匯編語言這種直觀和直接的角度,揭示計算機工作的基本原理、C語言語句和函數(shù)的處理過程、程序優(yōu)化的技巧。
全書共分為19章。前5章介紹了匯編語言程序設(shè)計的基本知識,包括CPU、內(nèi)存、尋址方式和常用機器指令;第6章至第11章介紹了x8632位控制臺應(yīng)用程序設(shè)計,包括順序和分支、循環(huán)、子程序設(shè)計、多模塊化程序設(shè)計;第12章為中斷和異常處理;第13章是Win32窗口程序設(shè)計;第14章至第17章介紹了x87 FPU、MMX、SSE、AVX程序設(shè)計;第18章為x8664位匯編程序設(shè)計;第19章為上機操作。
本書內(nèi)容新穎,覆蓋面廣,重點突出,直觀易懂,趣味性強,可供各類高等院校計算機及相關(guān)專業(yè)作為教材,也可供廣大使用匯編語言的工程技術(shù)人員參考。
作者從事“匯編語言程序設(shè)計”課程教學(xué)多年,為國家精品課程“匯編語言程序設(shè)計”的主要建設(shè)者之一。本書理論結(jié)合實踐,符合現(xiàn)代教材編寫思路,書中附大量代碼案例,便于學(xué)生動手驗證、操作。
毋庸置疑,現(xiàn)在的IT界很少使用匯編語言開發(fā)項目。作為一種程序設(shè)計語言,匯編語言似乎銷聲匿跡。這也讓一些人懷疑學(xué)習(xí)匯編語言的必要性。在閱讀本書后,讀者完全可以打消這種疑慮了。不論是對后續(xù)課程學(xué)習(xí)、理解計算機的工作原理,還是編寫高質(zhì)量、高效率的應(yīng)用程序,匯編語言都起著不可或缺的作用。
首先,匯編語言程序設(shè)計是計算機類專業(yè)的重要專業(yè)基礎(chǔ)課,是從事計算機研究與應(yīng)用,特別是軟件研究的基礎(chǔ),是計算機人員必須接受的重要的專業(yè)基礎(chǔ)訓(xùn)練課之一。匯編語言作為機器語言的符號表示,提供了直觀、直接學(xué)習(xí)有關(guān)知識的方式。匯編程序可以看成是編譯器對高級語言程序編譯后的輸出產(chǎn)物,也可以看成是在計算機上能直接加工處理的輸入對象。因此,匯編語言就是連接高級語言程序和計算機硬件設(shè)備的橋梁和樞紐,為深入地理解計算機硬件、操作系統(tǒng)、應(yīng)用程序之間的交互工作奠定基礎(chǔ)。此外,匯編語言對于高級語言程序設(shè)計的學(xué)習(xí)和實踐很有幫助。很多人在學(xué)習(xí)C/C++語言程序設(shè)計時,都會有很多疑問。例如,程序運行中為什么崩潰?程序運行中為什么會出現(xiàn)“莫名其妙”的結(jié)果?函數(shù)之間是如何傳遞參數(shù)和返回結(jié)果的?遞歸程序是如何運轉(zhuǎn)的?為什么不返回局部變量的地址?數(shù)組越界訪問會造成什么后果?指針是如何實現(xiàn)的?地址類型轉(zhuǎn)換和數(shù)據(jù)類型轉(zhuǎn)換的含義是什么?在C++程序設(shè)計中,對象構(gòu)造、對象析構(gòu)、繼承、多態(tài)、成員對象的引用、虛函數(shù)、類模板和函數(shù)模板等是如何實現(xiàn)的?匯編語言是揭開高級程序設(shè)計語言工作機制神秘面紗的強有力武器。本書給出了一些C語言程序的反匯編示例,直觀展現(xiàn)了C語言語句和函數(shù)對應(yīng)的一個執(zhí)行系列,進而分析變量的空間分配方法、地址類型轉(zhuǎn)換、數(shù)據(jù)結(jié)構(gòu)中各組成部分的空間關(guān)系、函數(shù)參數(shù)和結(jié)果的傳遞方法、程序執(zhí)行流程的轉(zhuǎn)移、遞歸函數(shù)的執(zhí)行過程等奧秘。這些知識又助于從本質(zhì)上理解程序執(zhí)行過程。在編程者深刻把握語句的執(zhí)行原理后,編寫程序時就可以少犯錯誤,也可發(fā)編寫出執(zhí)行效率高且形式優(yōu)美的程序。
其次,開發(fā)的軟件運行速度快是一個常規(guī)要求。除了在“大”方面選擇性能高的算法外,還需要在很多“小”方面選擇快速的實現(xiàn)方法。在學(xué)習(xí)匯編語言后,會發(fā)現(xiàn)計算機指令系統(tǒng)提供了一些能提高程序運行性能的指令,如串操作指令、單指令多數(shù)據(jù)流指令。它們比另外一些實現(xiàn)相同功能的指令的速度要快得多。這也就會讓人們在使用高級語言開發(fā)程序時尋找“封裝”后高性能指令的函數(shù)或語句。本書在串操作和數(shù)據(jù)成組運算上給出了示例,并檢測了不同實現(xiàn)方法的運行時間。當然,在實際項目開發(fā)中,有人直接利用匯編語言編寫部分關(guān)鍵代碼以提高系統(tǒng)的性能。匯編語言保持了機器語言的優(yōu)點,具有直接和簡捷的特點,可有效地訪問、控制計算機的各種硬件設(shè)備,如磁盤、存儲器、CPU、I/O端口等,且占用內(nèi)存空間少,執(zhí)行速度快,是高效的程序設(shè)計語言。
后,匯編語言是逆向工程、解密程序、病毒與木馬分析和防治的唯一選擇。在不支持高級語言開發(fā)工具的特定場合下,編寫匯編程序是一種必然選擇。
本書的特色之一是使用Visual Studio 2019作為匯編語言程序的開發(fā)平臺。該平臺操作簡單,與其前輩版本Visual Studio 2010、Visual Studio 2013、Visual Studio 2017等用法相似,可以和C/C++程序開發(fā)無縫銜接,在匯編語言程序中調(diào)用C標準庫函數(shù)、Windows API函數(shù),或者在C程序中調(diào)用匯編語言編寫的函數(shù)。特色之二是根據(jù)構(gòu)建理論,將不同的知識關(guān)聯(lián)起來形成網(wǎng)絡(luò),同步促進多種知識的學(xué)習(xí)。書上給出了一些大家熟悉的有代表性的C程序例子,通過研究這些例子的反匯編代碼,由表及里揭示其內(nèi)在的處理過程、編譯技巧,進而加深對機器指令的運行過程和功能的理解,加深對計算機工作原理的理解。書中也給出了一些既用匯編語言又用C語言實現(xiàn)的例子,在學(xué)習(xí)匯編語言知識后,可以引導(dǎo)編寫更高質(zhì)量的C語言程序。特色之三是內(nèi)容新穎、覆蓋面廣。本書介紹了目前使用為廣泛的Intel x8632和x8664系列CPU支持指令系統(tǒng),包括x8632、x87、MMX、SSE、AVX、x8664指令,以及機器指令的編碼規(guī)則;介紹了Windows操作系統(tǒng)下控制臺程序和窗口應(yīng)用程序的開發(fā);包含了多模塊程序設(shè)計、C和匯編混合、C內(nèi)嵌匯編、中斷及異常處理程序開發(fā)、執(zhí)行文件結(jié)構(gòu)等內(nèi)容。特色之四是趣味性強。在完成某一功能時,采用一題多解的策略,采用不同的尋址方式、不同的指令、不同的算法完成相同的任務(wù),充分展現(xiàn)了編程的靈活性。同時,書上也給出了程序自我修改、機器語言編程、程序轉(zhuǎn)移自主控制等特色例子。特色之五是重點突出。Intel CPU的機器指令是非常多的,可編寫的程序也非常多,本書并不是指令參考書,也不是編程集錦,未糾纏于一一介紹這些指令和過多地給出程序示例,相信讀者對這些知識能夠舉一反三,融匯貫通。建議不要死記硬背那些機器指令,將大腦降檔為一個存儲器。隨著時間的流逝,這些指令內(nèi)容都會遺忘,留在腦海里的是基本原理、基本方法和基本技巧。
在編寫本書的過程中,得到了華中科技大學(xué)計算機科學(xué)與技術(shù)學(xué)院匯編語言程序設(shè)計課程組老師們的熱情幫助和支持。匯編語言程序設(shè)計課程是國家級精品課程。在精品課程建設(shè)中,老師們集思廣益,群策群力,使我收獲頗豐。本書的編寫也得到了華中科技大學(xué)出版社編輯的幫助,在此一并表示感謝
由于作者水平有限,書中錯誤在所難免,懇請廣大讀者批評指正。同時也歡迎使用本書的老師、學(xué)生和其他讀者,共同探討匯編語言的教學(xué)內(nèi)容和教學(xué)方法等問題。
華中科技大學(xué)計算機科學(xué)與技術(shù)學(xué)院副教授。1991年畢業(yè)于華中科技大學(xué)計算機學(xué)院,獲得軟件專業(yè)碩士學(xué)位。從事數(shù)據(jù)庫科研工作多年,對數(shù)據(jù)庫管理系統(tǒng)的總體設(shè)計、并發(fā)控制、查詢優(yōu)化、數(shù)據(jù)庫安全、并行數(shù)據(jù)庫有較深的研究,在國內(nèi)權(quán)威和重要期刊上發(fā)表論文20多篇。從事匯編語言程序設(shè)計、人工智能的教學(xué)工作多年,為國家精品課程“匯編語言程序設(shè)計”的主要建設(shè)者之一。
1.1什么是匯編語言(1)
1.1.1機器語言(1)
1.1.2匯編語言(2)
1.2為什么學(xué)習(xí)匯編語言(4)
1.3如何學(xué)習(xí)匯編語言(7)
1.4匯編語言源程序舉例(9)
1.5計算機中信息編碼的奧秘(12)
1.6使用符號的說明(14)
習(xí)題1(15)
上機實踐1(16)
第2章Intel中央處理器(17)
2.1Intel公司微處理器的發(fā)展史(17)
2.2Intel x86微處理器結(jié)構(gòu)(19)
2.3執(zhí) 行 部 件(20)
2.3.132位CPU中的通用寄存器(21)
2.3.2通用寄存器應(yīng)用示例(22)
2.4標志寄存器(23)
2.4.1條件標志位(24)
2.4.2控制標志位(26)
2.4.3系統(tǒng)標志位(27)
2.5指令預(yù)取部件和指令譯碼部件(27)
2.6分段部件和分頁部件(28)
2.7x86的三種工作方式(30)
2.8Intel公司酷睿微體系結(jié)構(gòu)(31)
習(xí)題2(33)
上機實踐2(34)
第3章主存儲器及數(shù)據(jù)在計算機內(nèi)的表示形式(35)
3.1主存儲器(35)
3.1.1數(shù)據(jù)存儲的基本形式(35)
3.1.2數(shù)據(jù)地址的類型及轉(zhuǎn)換(36)
3.2數(shù)值數(shù)據(jù)在計算機內(nèi)的表示形式(37)
3.2.1有符號數(shù)和無符號數(shù)表示法(37)
3.2.2BCD碼(38)
3.3字符數(shù)據(jù)在計算機內(nèi)的表示形式(39)
3.4數(shù)據(jù)段定義(39)
3.4.1數(shù)據(jù)定義偽指令(40)
3.4.2表達式(40)
3.4.3匯編地址計數(shù)器(42)
3.4.4數(shù)據(jù)段定義示例(43)
3.5主存儲器分段管理(44)
3.6主存儲器物理地址的形成(45)
3.6.18086和x8632實方式下物理地址的形成(45)
3.6.2保護方式下物理地址的形成(47)
習(xí)題3(50)
上機實踐3(51)
第4章尋址方式(53)
4.1尋址方式概述(53)
4.2立即尋址(54)
4.3寄存器尋址(56)
4.4直接尋址(57)
4.4.1直接尋址的基本概念(57)
4.4.2直接尋址的用法示例(58)
4.5寄存器間接尋址(60)
4.5.1寄存器間接尋址的基本用法(60)
4.5.2寄存器間接尋址與C語言指針的比較(62)
4.6變址尋址(63)
4.7基址加變址尋址(64)
4.8尋址方式綜合舉例(66)
4.9x86機器指令編碼規(guī)則(68)
4.108086/80386的尋址方式(73)
習(xí)題4(74)
上機實踐4(77)
第5章常用機器指令(79)
5.1通用機器指令概述(79)
5.2數(shù)據(jù)傳送指令(80)
5.2.1一般數(shù)據(jù)傳送指令(80)
5.2.2帶條件的數(shù)據(jù)傳送指令(82)
5.2.3堆棧操作指令(83)
5.2.4標志寄存器傳送指令(86)
5.2.5地址傳送指令(88)
5.3算術(shù)運算指令(89)
5.3.1加法指令(90)
5.3.2減法指令(91)
5.3.3乘法指令(92)
5.3.4除法指令(94)
5.3.5符號擴展指令(95)
5.4邏輯運算指令(95)
5.5移位指令(97)
5.7位操作和字節(jié)操作指令(99)
5.8標志位控制指令和雜項指令(100)
5.9I/O指令(100)
習(xí)題5(102)
上機實踐5(103)
第6章順序和分支程序設(shè)計(105)
6.1概述(105)
6.2程序中的偽指令(107)
6.2.1處理器選擇偽指令(107)
6.2.2存儲模型說明偽指令(108)
6.2.3段定義及程序結(jié)束偽指令(109)
6.3轉(zhuǎn)移指令(110)
6.3.1轉(zhuǎn)移指令概述(110)
6.3.2簡單條件轉(zhuǎn)移指令(110)
6.3.3無符號條件轉(zhuǎn)移指令(111)
6.3.4有符號條件轉(zhuǎn)移指令(113)
6.3.5無條件轉(zhuǎn)移指令(114)
6.4簡單分支程序設(shè)計(115)
6.4.1C語言的if語句與匯編語句的對應(yīng)關(guān)系(115)
6.4.2分支程序設(shè)計示例(117)
6.4.3分支程序設(shè)計注意事項(120)
6.5多分支程序設(shè)計(121)
6.5.1多分支向無分支的轉(zhuǎn)化(121)
6.5.2switch語句的編譯(123)
6.6條件控制流偽指令(125)
習(xí)題6(128)
上機實踐6(129)
第7章循環(huán)程序設(shè)計(131)
7.1循環(huán)程序(131)
7.1.1循環(huán)程序的結(jié)構(gòu)(131)
7.1.2循環(huán)控制方法(132)
7.1.3循環(huán)控制指令(134)
7.2單重循環(huán)程序設(shè)計(137)
7.3多重循環(huán)程序設(shè)計(139)
7.4循環(huán)程序中的細節(jié)分析(141)
7.5與C循環(huán)程序反匯編的比較(145)
7.6循環(huán)控制偽指令(148)
習(xí)題7(150)
上機實踐7(151)
第8章子程序設(shè)計(152)
8.1子程序的概念(152)
8.2子程序的基本用法(153)
8.2.1子程序的定義(153)
8.2.2子程序的調(diào)用和返回(154)
8.2.3在主程序與子程序之間傳遞參數(shù)(155)
8.2.4子程序調(diào)用現(xiàn)場的保護(157)
8.2.5子程序設(shè)計應(yīng)注意的問題(158)
8.3子程序應(yīng)用示例(159)
8.3.1字符串的比較(159)
8.3.2數(shù)串轉(zhuǎn)換(161)
8.3.3串數(shù)轉(zhuǎn)換(163)
8.3.4自我修改返回地址的子程序(165)
8.3.5自我修改的子程序(168)
8.4C語言程序中函數(shù)的運行機理(169)
8.5匯編語言中子程序的高級用法(172)
8.5.1局部變量的定義和使用(173)
8.5.2子程序的原型說明、定義和調(diào)用(174)
8.5.3子程序的高級用法舉例(176)
8.6遞歸子程序的設(shè)計(177)
習(xí)題8(180)
上機實踐8(181)
第9章串處理程序設(shè)計(183)
9.1串操作指令簡介(183)
9.2串傳送指令(185)
9.3串比較指令(187)
9.4串搜索指令(189)
9.5向目的串中存數(shù)指令(190)
9.6從源串中取數(shù)指令(191)
習(xí)題9(192)
上機實踐9(192)
第10章復(fù)合數(shù)據(jù)類型的定義和使用(194)
10.1結(jié)構(gòu)體(194)
10.1.1結(jié)構(gòu)體的定義(194)
10.1.2結(jié)構(gòu)變量的定義(195)
10.1.3結(jié)構(gòu)變量的訪問(196)
10.1.4結(jié)構(gòu)信息的自動計算(198)
10.2結(jié)構(gòu)變量的數(shù)據(jù)存儲(200)
10.2.1匯編語言中結(jié)構(gòu)變量的存儲(200)
10.2.2與C語言結(jié)構(gòu)變量存儲的差異(201)
10.3聯(lián)合體(202)
習(xí)題10(203)
上機實踐10(203)
第11章程序設(shè)計的其他方法(205)
11.1匯編語言多模塊化程序設(shè)計(205)
11.2C語言程序和匯編語言程序的混合(209)
11.2.1函數(shù)的申明和調(diào)用(209)
11.2.2變量的申明和調(diào)用(210)
11.3內(nèi)嵌匯編(211)
11.4模塊程序設(shè)計中的注意事項(213)
11.5宏功能程序設(shè)計(214)
11.5.1宏定義(214)
11.5.2宏調(diào)用(215)
11.5.3宏指令與子程序的比較(216)
11.6可執(zhí)行文件的格式(217)
習(xí)題11(223)
上機實踐11(224)
第12章中斷和異常處理(225)
12.1中斷與異常的基礎(chǔ)知識(225)
12.1.1中斷和異常的概念(225)
12.1.2中斷描述符表(227)
12.1.3中斷和異常的響應(yīng)過程(229)
12.1.4軟中斷指令(230)
12.2Windows中的結(jié)構(gòu)化異常處理(231)
12.2.1編寫異常處理函數(shù)(231)
12.2.2異常處理程序的注冊(232)
12.2.3全局異常處理程序的注冊(234)
12.3C語言異常處理程序反匯編分析(236)
習(xí)題12(239)
上機實踐12(239)
第13章Win32窗口程序設(shè)計(242)
13.1Win32窗口程序設(shè)計基礎(chǔ) (242)
13.1.1窗口程序運行的基本過程(242)
13.1.2Windows消息(245)
13.1.3Win32窗口程序的開發(fā)環(huán)境(247)
13.2Win32窗口應(yīng)用程序的結(jié)構(gòu)(248)
13.2.1主程序(248)
13.2.2窗口主程序(248)
13.2.3窗口消息處理程序(249)
13.3窗口應(yīng)用程序開發(fā)實例(250)
13.3.1不含資源的窗口程序(250)
13.3.2包含菜單和對話框的窗口程序(253)
13.4與C語言開發(fā)的窗口程序比較(260)
習(xí)題13(264)
上機實踐13(264)
第14章x87 FPU程序設(shè)計(265)
14.1浮點數(shù)據(jù)(265)
14.1.1浮點數(shù)據(jù)在機內(nèi)的表示形式(265)
14.1.2浮點類型變量的定義(267)
14.2x87 FPU的寄存器(268)
14.2.1x87 FPU數(shù)據(jù)寄存器(268)
14.2.2x87 FPU其他寄存器(269)
14.3x87 FPU指令(271)
14.4浮點數(shù)處理程序示例(274)
習(xí)題14(277)
上機實踐14(277)
第15章MMX程序設(shè)計(278)
15.1MMX技術(shù)簡介(278)
15.2MMX指令簡介(280)
15.3MMX編程示例(282)
15.4使用C語言編寫MMX應(yīng)用程序(285)
習(xí)題15(286)
上機實踐15(287)
第16章SSE程序設(shè)計(288)
16.1SSE技術(shù)簡介(288)
16.2SSE指令簡介(289)
16.2.1組合和標量單精度浮點指令(290)
16.2.2SSE 64位SIMD整數(shù)指令(292)
16.2.3MXCSR狀態(tài)管理指令(293)
16.2.4緩存控制指令(293)
16.3SSE2及后續(xù)版本的指令簡介(293)
16.3.1組合雙精度浮點數(shù)和標量雙精度浮點數(shù)指令(294)
16.3.264位和128位整數(shù)指令(295)
16.4SSE編程示例(296)
16.5使用C語言編寫SSE應(yīng)用程序(297)
習(xí)題16(299)
上機實踐16(300)
第17章AVX程序設(shè)計(301)
17.1AVX技術(shù)簡介(301)
17.2AVX指令簡介(302)
17.2.1新指令(302)
17.2.2功能擴展指令(303)
17.3AVX編程示例(304)
習(xí)題17(306)
上機實踐17(306)
第18章x8664位匯編程序設(shè)計(307)
18.1x8664的運行環(huán)境(307)
18.1.1寄存器(307)
18.1.2尋址方式(308)
18.1.3指令系統(tǒng)(309)
18.264位的程序設(shè)計(309)
18.2.164位平臺下與32位平臺下的區(qū)別(309)
18.2.2顯示一個消息框(312)
18.2.3浮點數(shù)運算(312)
18.2.4程序自我修改(313)
18.3x8664機器指令編碼規(guī)則(314)
習(xí)題18(317)
上機實踐18(317)
第19章上機操作(318)
19.1創(chuàng)建工程和生成可執(zhí)行程序(318)
19.2程序的調(diào)試(319)
19.3編譯鏈接器的配置(322)
19.4其他操作(324)
附錄ASCII字符表(326)
參考文獻(327)