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