現(xiàn)代x86匯編語言程序設計(原書第2版)
定 價:¥129
中 教 價:¥129.00 (10.00折)
庫 存 數(shù): 0
叢 書 名:計算機科學叢書
本書全面更新至x86-64,主要面向軟件開發(fā)人員,旨在通過實用的案例幫助讀者快速理解x86-64匯編語言程序設計的概念并掌握編程方法。書中首先介紹x86-64平臺,包括Core體系結(jié)構(gòu)、數(shù)據(jù)類型、寄存器、內(nèi)存尋址模式和基本指令集等;然后討論AVX、AVX2和AVX-512,包括寄存器集、指令集和增強功能等,并利用這些指令集編寫性能增強函數(shù)和算法;zui后討論提高程序性能的編碼策略及技巧。此外,書中包含大量可免費下載的源代碼,便于讀者實踐。
在高級語言廣泛應用的今天,匯編語言對于程序的關鍵性能部分依然至關重要。現(xiàn)代x86處理器的SIMD體系結(jié)構(gòu)提供了強大的資源,為大數(shù)據(jù)時代的計算密集型問題提供了有效的解決方案,可應用在圖像處理、音視頻編碼和數(shù)據(jù)挖掘等領域。本書由上一版的x86-32全面更新至x86-64,主要面向軟件開發(fā)人員,旨在通過實用的案例幫助讀者快速理解x86-64匯編語言程序設計的概念,使用x86-64匯編語言以及AVX、AVX2和AVX-512指令集編寫性能增強函數(shù)和算法,并利用不同的編程策略和技巧實現(xiàn)性能的化。書中包含大量可免費下載的源代碼,便于讀者實踐。通過本書,你將:全面了解x86-64平臺,包括Core體系結(jié)構(gòu)、數(shù)據(jù)類型、寄存器、內(nèi)存尋址模式和基本指令集,利用x86-64指令集編寫可被C 等高級語言調(diào)用的函數(shù)。深入理解AVX和AVX2,包括寄存器集、數(shù)據(jù)類型和指令集,以及數(shù)據(jù)廣播、數(shù)據(jù)收集和數(shù)據(jù)排列等增強功能,學習針對打包浮點數(shù)和打包整數(shù)操作數(shù)的編程方法。深入理解AVX-512,包括寄存器集和數(shù)據(jù)類型,以及條件執(zhí)行和合并、嵌入式廣播操作、指令級舍入等增強功能,學習利用這些功能進行算法優(yōu)化。
自從個人計算機發(fā)明以來,軟件開發(fā)人員使用x86匯編語言為各種各樣的算法挑戰(zhàn)提供了創(chuàng)新的解決方案。在PC時代的早期,軟件開發(fā)人員常常會使用x86匯編語言編寫程序的大部分代碼甚至完整的應用程序。考慮到21世紀流行的高級語言(例如C 、C#、Java和Python),我們可能會驚訝地發(fā)現(xiàn),許多軟件開發(fā)人員仍然使用匯編語言來對程序的關鍵性能部分進行編碼。盡管編譯器多年以來有了顯著的改進,能夠生成空間效率和時間效率都很高的機器代碼,但仍然存在這樣的場景:軟件開發(fā)人員有必要利用匯編語言編程的優(yōu)越特點。現(xiàn)代x86處理器的單指令多數(shù)據(jù)(Single-Instruction Multiple-Data,SIMD)體系結(jié)構(gòu)從另一個方面解釋了人們?yōu)楹螌R編語言程序有著經(jīng)久不衰的興趣。支持SIMD的處理器提供了計算資源,有助于使用多個數(shù)據(jù)值同時進行計算,對于那些必須提供實時響應的應用程序而言,可以顯著提高性能。SIMD體系結(jié)構(gòu)也非常適合計算密集型問題領域,例如圖像處理、音頻和視頻編碼、計算機輔助設計、計算機圖形學和數(shù)據(jù)挖掘。遺憾的是,許多高級語言和開發(fā)工具仍然無法完全或者部分地利用現(xiàn)代x86處理器的SIMD功能。相反,匯編語言則使軟件開發(fā)人員能夠充分利用處理器的SIMD計算資源。現(xiàn)代x86匯編語言程序設計本書是一本關于x86 64位(x86-64)匯編語言程序設計的教科書。本書的內(nèi)容和組織旨在幫助讀者快速理解x86-64匯編語言程序設計以及高級向量擴展(Advanced Vector Extension,AVX)的計算資源。本書還包含大量的源代碼,這些源代碼有助于讀者學習和理解基本的x86-64匯編語言結(jié)構(gòu)和SIMD編程概念。通過閱讀本書,讀者將能夠使用x86-64匯編語言以及AVX、AVX2和AVX-512指令集編寫性能增強的函數(shù)和算法。在繼續(xù)學習之前,應該明確指出,本書不包括x86-32匯編語言程序設計。本書也不討論傳統(tǒng)的x86技術,例如x87浮點單元、MMX和數(shù)據(jù)流SIMD擴展指令集。如果讀者對這些主題感興趣,可以參考本書第1版中的相關內(nèi)容。本書沒有解釋操作系統(tǒng)中使用的x86體系結(jié)構(gòu)特性或者特權(quán)指令。但是,讀者需要完全理解本書中介紹的內(nèi)容,才能開發(fā)用于操作系統(tǒng)的x86匯編語言代碼。雖然理論上我們可以使用匯編語言編寫整個應用程序,但現(xiàn)代軟件開發(fā)的苛刻要求使得這種方法不切實際,而且也不明智。作為替代,本書重點介紹如何編寫x86-64匯編語言函數(shù),這些函數(shù)可以被C 程序調(diào)用。本書使用微軟的Visual Studio C 和微軟宏匯編程序(MASM)編寫所有的源代碼示例程序。目標讀者本書的目標讀者是軟件開發(fā)人員,包括:正在為基于Windows的平臺開發(fā)應用程序并希望學習如何使用x86-64匯編語言編寫性能增強算法和函數(shù)的軟件開發(fā)人員。為非Windows環(huán)境開發(fā)應用程序并希望學習x86-64匯編語言編程的軟件開發(fā)人員。希望學習如何使用AVX、AVX2和AVX-512指令集創(chuàng)建SIMD計算函數(shù)的軟件開發(fā)人員。希望或者需要更好地了解x86-64平臺及其SIMD體系結(jié)構(gòu)的軟件開發(fā)人員和計算機科學專業(yè)的學生。本書的主要目標讀者是Windows軟件開發(fā)人員,因為源代碼示例是使用Visual Studio C 和MASM開發(fā)的。由于本書大部分內(nèi)容是獨立于特定操作系統(tǒng)而組織和呈現(xiàn)的,因此非Windows平臺的軟件開發(fā)人員也可以從本書中受益。我們假設本書的讀者已經(jīng)具備其他高級語言的編程經(jīng)驗,并且對C 有基本的了解,但不需要熟悉Visual Studio或者Windows編程。內(nèi)容概述本書的主要目的是幫助讀者學習x86 64位匯編語言程序設計,以及AVX、AVX2和AVX-512指令集。本書的架構(gòu)和內(nèi)容都是為實現(xiàn)這一目標而設計的。下面將簡單概述各章的學習內(nèi)容。第1章介紹x86-64平臺的Core(核心)體系結(jié)構(gòu),包括對平臺的基本數(shù)據(jù)類型、內(nèi)部體系結(jié)構(gòu)、寄存器集、指令操作數(shù)和內(nèi)存尋址模式的討論,該章還描述了Core x86-64指令集。第2章和第3章解釋使用Core指令集和常見編程結(jié)構(gòu)(包括數(shù)組和結(jié)構(gòu))進行x86-64匯編語言編程的基本原理。這兩章(以及后續(xù)章節(jié))中提供的源代碼示例被打包為可運行的程序,這意味著讀者可以運行、修改或者以其他方式嘗試運行代碼,從而增強學習體驗。第4章重點討論AVX的體系結(jié)構(gòu)資源,包括寄存器集、數(shù)據(jù)類型和指令集。第5章闡述如何利用AVX指令集使用單精度值和雙精度值執(zhí)行標量浮點運算。第6章和第7章闡述使用打包浮點數(shù)(packed floating-point)和打包整數(shù)(packed integer)操作數(shù)的AVX SIMD程序設計。第8章介紹AVX2,并探討了其增強功能,包括數(shù)據(jù)廣播、數(shù)據(jù)收集和數(shù)據(jù)排列。第8章還將闡述乘法加法融合(Fused-Multiply-Add,F(xiàn)MA)操作。第9章和第10章包含源代碼示例,舉例說明了使用AVX2的針對打包浮點數(shù)和打包整數(shù)操作數(shù)的各種算法。第11章包括演示FMA編程的源代碼示例,該章還將介紹使用通用寄存器解釋x86平臺擴展的示例。第12章深入研究AVX-512體系結(jié)構(gòu)的細節(jié),介紹AVX-512的寄存器集和數(shù)據(jù)類型。該章還將闡述關鍵的AVX-512增強功能,包括條件執(zhí)行和合并、嵌入式廣播操作、指令級舍入。第13章和第14章包含許多源代碼示例,用以演示如何利用這些高級功能。第15章概述現(xiàn)代x86多核處理器及其底層微體系結(jié)構(gòu)。該章還將概述可用于提高x86匯編語言代碼性能的特定編碼策略和技術。第16章討論一些源代碼示例,這些示例說明了高級x86匯編語言編程技術,包括處理器特性檢測、加速內(nèi)存訪問和多線程計算。附錄A描述了如何使用Visual Studio和MASM執(zhí)行源代碼示例。附錄A還給出了一個引用和資源列表,讀者可以參閱這些資源,以獲得有關x86匯編語言編程的更多信息。源代碼讀者可以在Apress的官網(wǎng)(https://www.apress.com/us/book/9781484240625)上找到本書源代碼的下載信息。每一章的源代碼都對應一個壓縮文件,其中包含C 源代碼文件和匯編語言源代碼文件以及Visual Studio項目文件。壓縮文件中沒有提供可執(zhí)行的安裝程序。讀者只需將每一章源代碼壓縮文件的內(nèi)容解壓到自己選擇的文件夾中。注意事項 源代碼的目的是闡明與本書中所討論的主題直接相關的編程示例。源代碼很少涉及基本的軟件工程問題,例如魯棒錯誤處理、安全風險、數(shù)值穩(wěn)定性、舍入誤差、錯誤條件函數(shù)。如果讀者決定在自己的程序中使用本書的源代碼,那么需要處理這些問題。源代碼示例是在運行Windows 10 Pro 64位的PC上使用Visual Studio Professional 2017(版本15.7.1)創(chuàng)建的。Visual Studio官網(wǎng)(https://visualstudio.microsoft.com)包含有關此版本和Visual Studio其他版本的詳細信息。有關Visual Studio安裝、配置和應用程序開發(fā)的詳細技術信息,請訪問https://docs.microsoft.com/en-us/visualstudio/?view=vs-2017。如果要運行源代碼示例,那么推薦的硬件平臺是一臺基于x86的PC,裝有Windows 10 64位操作系統(tǒng),包含一個支持AVX的處理器。如果要運行使用AVX2或者AVX-512指令集的源代碼示例,則需要一個與AVX2或者AVX-512兼容的處理器。讀者可以使用附錄A中列出的免費實用程序,以確定自己的PC支持哪些x86-AVX指令集擴展。其他資源AMD和英特爾都提供了一系列包羅廣泛的與x86相關的編程文檔。附錄A列出了一些重要的資源,無論是新手還是經(jīng)驗豐富的x86匯編語言程序員,都會發(fā)現(xiàn)這些資源非常有用。在附錄A列出的所有資源中,有價值的參考資料是Intel 64 and IA-32 Architectures Software Developers Manual-Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4中的第2卷(https://www.intel.com/content/www/us/en/processors/architectures-softwaredeveloper-manuals.html)。該手冊包含每個x86處理器指令的編程信息大全,包括詳細的操作說明、有效操作數(shù)的列表、受影響的狀態(tài)標志和潛在異常。強烈建議讀者在開發(fā)自己的x86匯編語言代碼來驗證正確的指令用法時,充分利用這個不可或缺的參考資源。致謝書籍的出版和電影的制作有些類似。電影預告片頌揚主角的演技,而書籍封面宣揚作者的名氣。演員和作者的努力終獲得了公眾的贊譽。然而,如果沒有專業(yè)幕后團隊的奉獻精神、專業(yè)知識和創(chuàng)造能力,就不可能成功創(chuàng)作一部電影或者出版一本書籍。本書也不例外。首先感謝Apress才華橫溢的編輯團隊所做的努力,特別感謝Steve Anglin、Mark Powers和Matthew Moodie。Paul Cohen一絲不茍的技術評審和切實可行的建議也非常值得稱贊。還要稱贊和肯定的是校對編輯Ed Kusswurm的辛勤工作和建設性的反饋。本書中的任何疏漏和不足完全由我本人負責。我還要感謝Nirmal Selvaraj、Dulcy Nirmala、Kezia Endsley、Dhaneesh Kumar以及Apress所有制作人員所做的貢獻。感謝各位同事的支持和鼓勵。后,感謝我的父母Armin(RIP)和Mary以及兄弟姐妹Mary、Tom、Ed和John,感謝他們在本書寫作過程中的鼓勵和支持。
丹尼爾·卡斯沃姆(Daniel Kusswurm) 擁有超過30年專業(yè)經(jīng)驗的軟件工程師和計算機科學家,曾為各類醫(yī)療設備、科學儀器和圖像處理應用開發(fā)了大量創(chuàng)新軟件,成功利用x86匯編語言提高了計算密集型算法的性能。他擁有德保羅大學計算機科學博士學位。
出版者的話譯者序前言關于作者關于技術評審專家第1章 x86-64 Core體系結(jié)構(gòu) 11.1 歷史回顧 11.2 數(shù)據(jù)類型 31.2.1 基本數(shù)據(jù)類型 31.2.2 數(shù)值數(shù)據(jù)類型 31.2.3 SIMD數(shù)據(jù)類型 41.2.4 其他數(shù)據(jù)類型 51.3 內(nèi)部體系結(jié)構(gòu) 51.3.1 通用寄存器 61.3.2 RFLAGS寄存器 71.3.3 指令指針 81.3.4 指令操作數(shù) 91.3.5 內(nèi)存尋址 101.4 x86-64與x86-32編程的區(qū)別 111.4.1 無效指令 121.4.2 不推薦的指令 131.5 指令集概述 131.6 本章小結(jié) 15第2章 x86-64 Core程序設計:第1部分 172.1 簡單的整數(shù)算術運算 172.1.1 加法和減法 182.1.2 邏輯運算 202.1.3 移位運算 222.2 高級整數(shù)算術運算 252.2.1 乘法和除法 252.2.2 使用混合類型的運算 282.3 內(nèi)存尋址和條件代碼 332.3.1 內(nèi)存尋址模式 332.3.2 條件代碼 372.4 本章小結(jié) 40第3章 x86-64 Core程序設計:第2部分 423.1 數(shù)組 423.1.1 一維數(shù)組 423.1.2 二維數(shù)組 483.2 結(jié)構(gòu) 563.3 字符串 583.3.1 字符計數(shù) 583.3.2 字符串拼接 613.3.3 比較數(shù)組 653.3.4 數(shù)組反轉(zhuǎn) 683.4 本章小結(jié) 71第4章 AVX指令集 724.1 AVX概述 724.2 SIMD編程概念 734.3 環(huán)繞與飽和算術運算 744.4 AVX執(zhí)行環(huán)境 754.4.1 寄存器集 754.4.2 數(shù)據(jù)類型 764.4.3 指令語法 764.5 AVX標量浮點數(shù) 774.5.1 浮點數(shù)編程概念 784.5.2 標量浮點寄存器集 804.5.3 控制狀態(tài)寄存器 804.5.4 指令集概述 814.6 AVX打包浮點值 824.7 AVX打包整數(shù) 854.8 x86-AVX和x86-SSE之間的區(qū)別 874.9 本章小結(jié) 88第5章 AVX程序設計:標量浮點數(shù) 905.1 標量浮點算術運算 905.1.1 單精度浮點數(shù)運算 905.1.2 雙精度浮點數(shù)運算 935.2 標量浮點值的比較和轉(zhuǎn)換 975.2.1 浮點值比較 975.2.2 浮點值轉(zhuǎn)換 1065.3 標量浮點數(shù)組和矩陣 1115.3.1 浮點數(shù)組 1115.3.2 浮點矩陣 1145.4 調(diào)用約定 1185.4.1 基本堆棧幀 1185.4.2 使用非易失性通用寄存器 1225.4.3 使用非易失性XMM寄存器 1265.4.4 函數(shù)序言和函數(shù)結(jié)語的宏 1315.5 本章小結(jié) 136第6章 AVX程序設計:打包浮點數(shù) 1376.1 打包浮點算術運算 1376.2 打包浮點值比較 1426.3 打包浮點值轉(zhuǎn)換 1466.4 打包浮點數(shù)組 1506.4.1 打包浮點平方根 1506.4.2 打包浮點數(shù)組的小值和值 1546.4.3 打包浮點小二乘法 1586.5 打包浮點矩陣 1636.5.1 矩陣轉(zhuǎn)置 1636.5.2 矩陣乘法 1706.6 本章小結(jié) 175第7章 AVX程序設計:打包整數(shù) 1767.1 打包整數(shù)加法和減法運算 1767.2 打包整數(shù)移位 1817.3 打包整數(shù)乘法 1847.4 打包整數(shù)圖像處理 1897.4.1 像素的小值和值 1897.4.2 像素平均強度 1967.4.3 像素轉(zhuǎn)換 2007.4.4 圖像直方圖 2067.4.5 圖像閾值化 2137.5 本章小結(jié) 223第8章 AVX2 2248.1 AVX2執(zhí)行環(huán)境 2248.2 AVX2打包浮點數(shù) 2248.3 AVX2打包整數(shù) 2268.4 x86指令集擴展 2268.4.1 半精度浮點數(shù) 2278.4.2 乘法加法融合 2278.4.3 通用寄存器指令集擴展 2288.5 本章小結(jié) 229第9章 AVX2程序設計:打包浮點數(shù) 2309.1 打包浮點算術運算 2309.2 打包浮點數(shù)組 2369.2.1 簡單計算 2369.2.2 列均值 2419.2.3 相關系數(shù) 2469.3 矩陣乘法和轉(zhuǎn)置 2529.4 矩陣求逆 2589.5 混合和排列指令 2699.6 數(shù)據(jù)收集指令 2739.7 本章小結(jié) 279第10章 AVX2程序設計:打包整數(shù) 28010.1 打包整數(shù)基礎 28010.1.1 基本算術運算 28010.1.2 打包和解包 28410.1.3 大小提升 28910.2 打包整數(shù)圖像處理 29310.2.1 像素剪裁 29310.2.2 RGB像素的小值和值 29810.2.3 RGB圖像到灰度圖像的轉(zhuǎn)換 30410.3 本章小結(jié) 310第11章 AVX2程序設計:擴展指令集 31211.1 FMA程序設計 31211.1.1 卷積 31211.1.2 標量FMA 31411.1.3 打包FMA 32211.2 通用寄存器指令 32911.2.1 不影響標志位的乘法和移位 32911.2.2 增強型位操作 33311.3 半精度浮點轉(zhuǎn)換 33611.4 本章小結(jié) 339第12章 AVX-512 34012.1 AVX-512概述 34012.2 AVX-512執(zhí)行環(huán)境 34112.2.1 寄存器集 34112.2.2 數(shù)據(jù)類型 3