现代x86汇编语言程序设计
作者 : [美] 丹尼尔·卡斯沃姆(Daniel Kusswurm) 著
译者 : 张银奎 罗冰 宋维 张佩 等译
丛书名 : 计算机科学丛书
出版日期 : 2016-10-27
ISBN : 978-7-111-54278-0
定价 : 79.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 491
开本 : 16
原书名 : Modern X86 Assembly Language Programming:32-bit, 64-bit, SSE, and AVX
原出版社:
属性分类: 教材
包含CD :
绝版 :
图书简介

本书从应用编程的角度解释x86处理器的内部架构和执行环境,全面介绍如何用x86汇编语言编写可被高级语言调用的函数。主要内容包括:x86-32核心架构(第1章和第2章),x87浮点单元(第3章和第4章),MMX技术(第5章和第6章),流式SIMD扩展(第7章至第11章),高级向量扩展(第12章至第16章),x86-64核心架构(第17章和第18章),x86-64 SSE和AVX(第19章和第20章),高级主题(第21章和第22章)。书中包含了大量的示例代码,以帮助读者快速理解x86汇编语言编程和x86平台的计算资源。
本书可作为高等院校计算机及相关专业学生的教材,也可供想要学习x86汇编语言编程的软件开发者使用。

图书特色

本书讲述x86汇编语言编程的基础知识,重点关注与应用软件开发相关的x86指令集。作者从应用程序编程的角度来解释x86处理器的内部架构,并且提供大量示例代码,帮助读者快速理解x86汇编语言编程和x86平台的计算资源。
本书既适用于想要学习如何使用x86汇编语言编写性能增强算法和函数的软件开发者,也适用于对x86汇编语言编程有基本了解并且想学习x86的SSE和AVX指令集的软件开发者。

通过阅读本书,你将学到
如何使用x86-32和x86-64指令集构建可被高级语言C++调用的性能增强函数。
如何使用x86汇编语言操纵常见的编程结构体,包括整数、浮点值、字符串、数组和结构。
如何使用SSE和AVX扩展改进计算密集型算法的性能,如图像处理、计算机图形学、数学和统计学等领域。
如何使用不同的编码策略和技巧优化x86的微架构,以最大化性能。

作者简介
丹尼尔·卡斯沃姆(Daniel Kusswurm) 在软件开发和计算机科学领域拥有超过30年的专业经验。在几十年的职业生涯中,他曾为各种医疗设备、科学仪器和图像处理应用编写了大量创新性的代码。在这些项目中,他有很多使用x86汇编语言的成功经验,有些是显著提高计算密集型算法的性能,有些是巧妙解决技术难题。丹尼尔拥有北伊利诺伊大学电子工程技术硕士学位和德保罗大学计算机科学博士学位。

图书前言

从个人电脑发明那一天起,很多软件开发者就使用汇编语言编程,以解决各种各样的难题。在PC时代的早期,用x86汇编语言编写大段的程序或整个应用是很普遍的。即便是在C、C++和C#等高级语言越来越流行的今天,许多软件开发者也仍然使用汇编语言来编写性能攸关的代码。虽然近些年编译器进步很快,编译出来的机器码变得更短、更快,但在某些情况下,软件开发者还是需要努力发挥汇编语言编程的优势。
现代x86处理器包含单指令多数据(SIMD)架构,这给我们提供了另一个持续关注汇编语言编程的原因。SIMD架构的处理器可以同时计算多个数据,这可以显著提高那些需要实时响应的应用软件的性能。SIMD架构也非常适合那些计算密集型的领域,比如图像处理、音视频编码、计算机辅助设计、计算机图形学和数据挖掘等。遗憾的是许多高级语言和开发工具不能完全发挥现代x86处理器的SIMD能力。而汇编语言恰恰可以让软件开发者充分利用处理器的全部计算资源。
现代x86汇编语言编程
本书是专门针对x86汇编语言编程的一本启发性教材,其主要目的是教你如何用x86汇编语言编写可被高级语言调用的函数。本书从应用程序编程的角度来解释x86处理器的内部架构。书中包含了非常多的示例代码,帮助你快速理解x86汇编语言编程和x86平台的计算资源。这本书的主要议题包括:
x86-32核心架构、数据类型、内部寄存器、内存寻址模式和基本指令集。
x87核心架构、寄存器栈、特殊寄存器、浮点编码和指令集。
MMX技术和对组合整数进行计算。
流式SIMD扩展(SSE)和高级向量扩展(AVX),包括内部寄存器、组合整型和浮点运算以及相关指令集。
x86-64核心架构、数据类型、内部寄存器、内存寻址模式和基本指令集。
SSE和AVX技术的64位扩展。
x86微架构和汇编语言优化技术。
在讨论其他内容之前,我想特别声明一下本书没有覆盖到的内容。本书没有介绍x86汇编语言的传统内容,比如16位实模式应用和分段内存模型。除了几处历史性的回顾和比较外,所有其他讨论和示例代码都是假定处于x86保护模式和平坦线性内存模型下。本书没有讨论x86的特权指令和用以支持开发操作系统内核的CPU功能,也没有介绍如何用x86汇编语言去开发操作系统或者设备驱动程序。不过,如果你真的想用x86汇编语言去开发那些系统软件,那么需要先充分理解这本书的内容。
虽然理论上仍然可以完全用汇编语言开发一个应用程序,但是现实中的各种需求使得这种方法很难实行。所以本书重点关注如何创建可被C++调用的x86汇编语言模块和函数。本书中的所有示例代码和示例程序都是用微软的Visual C++工具编写并使用微软的宏汇编器编译的。这两个工具都包含在微软的Visual Studio开发工具集里面。
目标读者
本书是针对下面几类软件开发者而编写的:
在Windows平台下开发应用程序并想用x86汇编语言提高程序性能的软件开发者。
在非Windows环境下开发应用程序并想要学习x86汇编语言编程的软件开发者。
对x86汇编语言编程有基本了解,想要学习x86的SSE和AVX指令集的软件开发者。
想要或需要更好理解x86平台(包括其内部架构和指令集)的软件开发者和计算机学院的学生。
本书主要是针对Windows平台上的软件开发者编写的,因为示例代码采用了Visual C++和微软宏汇编编译器。但是,本书并不是一本介绍如何使用微软开发工具的书,非Windows平台开发者也可以从本书获益,因为大多数内容的编写和介绍并不依赖任何特别的操作系统。具有C和C++编程经验有助于读懂本书的内容和示例代码,但是并不需要读者事先具有Visual Studio使用经验,也不需要先学习Windows API。
内容概要
本书的主要目的是帮助你学习x86汇编语言编程。为了达到这个目的,你需要全面理解x86处理器的内部架构和执行环境。本书的章节和内容是按照这样的思路规划的。下面简要介绍一下本书的主要议题和各章节的内容。
x86-32核心架构——第1章涵盖了x86-32平台的核心架构,讨论了这个平台的基本数据类型、内部架构、指令操作数和内存寻址模式。这一章也简要介绍了x86-32的核心指令集。第2章讲解了利用x86-32核心指令集和常用编程结构编写x86-32汇编语言程序的基础知识。第2章及其后章节讨论的示例代码都是可以独立运行的程序,这意味着你可以运行、修改或者用这些代码做一些实验来提高学习效果。
x87浮点单元——第3章探讨x87浮点单元(FPU)的架构,描述了x87 FPU的寄存器栈、控制字寄存器、状态字寄存器和指令集。这一章还深入探讨了用于表达浮点数和某些特殊值的二进制编码方案。第4章包含了一些示例,用以演示如何用x87 FPU指令集进行浮点运算。对于那些需要维护x87 FPU代码或者要在不具有x86-SSE和x86-AVX的处理器(比如Intel的Quark)上工作的读者来说,本章的内容是最适用的。
MMX技术——第5章描述了x86的第一个SIMD扩展,即MMX技术。它分析了MMX技术的架构,包括它的寄存器组、操作数类型和指令集。这一章也讨论了一些相关课题,包括SIMD处理概念和组合整型运算。第6章包含了用以演示基本MMX运算的示例代码,包括组合整型运算(回绕方式和饱和方式)、整数矩阵处理和如何正确地在MMX和x87 FPU代码之间切换。
流式SIMD扩展——第7章的焦点是流式SIMD扩展(SSE)。x86-SSE为x86平台新增了一组128位的寄存器,并增加了一系列指令,用以支持不同的数据类型,包括组合整型、组合浮点数(单双精度)和字符串类型的数据。第7章还讨论了x86-SSE的标量浮点运算功能,对于那些需要进行标量浮点计算的应用程序来说,这个功能可以大大简化算法并提高性能。第8章到第11章包含了一系列使用x86-SSE指令集的示例代码。比如用x86-SSE的组合整型去进行图像处理,例如直方图构建和像素阈值化。这些章节也包含了示例代码来演示如何用x86-SSE对组合浮点数、标量浮点数和字符串进行计算和处理。
高级向量扩展——第12章探讨x86最新的SIMD扩展——高级向量扩展(AVX)。该章解释了x86-AVX执行环境、数据类型和寄存器组以及最新的三目指令格式。同时也讨论了x86-AVX的数据广播、收集、排列(permute)功能以及与x86-AVX一起引入的扩展,包括融合乘加(fused-multiply-add,FMA)、半精度浮点和新的通用寄存器指令。第13章到第16章包含了一系列示例代码来演示如何使用x86-AVX的各种计算资源,包括对组合整型、组合浮点和标量浮点操作数进行计算的x86-AVX指令。这些章节还包含了例子来演示数据广播、收集、排列和FMA指令的用法。
x86-64核心架构——第17章探讨的是x86-64平台,包括这个平台的核心架构、所支持的数据类型、通用寄存器和状态标志,也解释了为支持64位操作数和内存寻址而对x86-32平台所做的扩展。这一章最后讨论了x86-64指令集,包括那些不再支持的指令。第18章用很多示例代码演示了x86-64汇编语言编程的基本知识。示例代码包括如何用不同大小的操作数进行整型运算、内存寻址模式、标量浮点运算以及常用的编程结构。第18章还介绍了C++调用x86-64汇编语言函数的调用约定。
x86-64 SSE和AVX——第19章描述了如何在x86-64平台上使用增强的x86-SSE和x86-AVX,讨论了各自的执行环境和扩展的数据寄存器组。第20章包含了在x86-64核心架构中使用x86-SSE和x86-AVX指令集的示例代码。
高级主题——本书最后两章讨论的是与x86汇编语言编程相关的高级内容和优化技术。第21章讨论了x86处理器微架构的关键点,包括它的前端流水线、乱序执行模型和内部执行单元。这一章还讨论了一些编程技术,让你的x86汇编语言程序在时间和空间上都很高效。第22章包含了几个展现高级汇编语言技术的示例代码。
附录——本书包括三个附录(可从下面的Apress网站或华章网站www.hzbook.com下载)。附录A介绍了使用微软的Visual C++和宏汇编器的简要教程。附录B总结了x86-32和x86-64的调用约定,使用汇编语言编写的函数必须遵守这些约定才可以被Visual C++函数所调用。附录C列出了关于x86汇编语言编程的参考文献和更多资源。
示例代码要求
可以从Apress网站http://www.apress.com/9781484200650下载本书的示例代码。编译和运行示例代码的软硬件要求如下:
一台包含新近微架构x86处理器的个人电脑。所有x86-32、x87 FPU、MMX和x86-SSE示例代码都可以运行在Nehalem或其以后的微架构处理器上。很多示例程序也可以在更老的微架构处理器上执行。AVX和AXV2示例代码分别要求Sandy Bridge和Haswell微架构处理器。
微软Windows 8.x或者Windows 7(Service Pack 1)。x86-64示例代码需要运行在64位Windows操作系统上。
Visual Studio Professional 2013或者Visual Studio Express 2013 for Windows Desktop。Express版本可以从微软的网站http://msdn.microsoft.com/en-us/vstudio上免费下载。推荐使用Update 3版本。
警告 本书所有示例代码的主要目的是解释这本书中的议题和技术,很少考虑软件工程中的一些重要问题,比如鲁棒的错误处理、安全性、稳定性、舍入误差等。若你决定把这些示例代码用在自己的程序里,则应该考虑上述问题。
术语和惯例
这里给本书中使用的术语下个定义。函数、子程序或者过程是一段独立的可执行代码,接受0个或更多参数,完成一个操作,并且可以选择性地返回一个值。通常函数被处理器的调用指令所调用。线程是可以被操作系统管理和调度的最小执行单元。任务或者进程包含一个或多个共享同一逻辑内存空间的线程。应用或程序是包含至少一个任务的一个完整软件包。
术语x86-32和x86-64分别用来描述x86处理器的32位和64位特征、资源以及处理能力。x86用以代表32位和64位架构的共有特征。x86-32模式和x86-64模式表示处理器的特定执行环境,它们之间的主要不同是,x86-64模式支持64位寄存器、操作数和内存寻址。x86-SSE表示流式SIMD扩展,x86-AVX表示高级向量扩展。当讨论特定SIMD增强指令时,会使用SSE、SSE2、SSE3、SSSE3、SSE4、AVX和AVX2这样的英文简称。
其他资源
Intel和AMD提供了大量与x86有关的文档。附录C列出了许多对初学者和有经验的x86汇编语言程序员有用的资源。其中《Intel 64 and IA-32 Architectures Software Developer’s Manual-Combined Volumes: 1, 2A, 2B 2C, 3A, 3B and 3C (Order Number: 325462)》的第二卷最为重要。这一卷中对每一条处理器指令都给出了非常全面的信息,包括详细的操作过程、使用的所有操作数、会影响到的状态标志和可能导致的异常。当你开发自己的x86汇编语言函数的时候,强烈建议你查阅这个文档来核对指令的用法。
致谢
出版一本书和拍一部电影有很多相似之处。电影的预告片赞美主角的出色表演,书的封面要“鼓吹”一下作者。不论是演员还是作者,他们的努力最终都要接受大众的检阅。而且,无论是出品一部电影还是出版一本书,都离不开执着的精神、高超的技能和富有创造力的专业幕后团队。本书也不例外。
首先我要感谢Patrick Hauke,在本书的孕育阶段,他便积极支持这个项目并给我非常有价值的建议。还要感谢Steve Weiss,他的丰富编辑经验指引我们克服了出版中的各种难题。我非常感谢Melissa Maldonado的努力,让我和其他每个人专注于本书的编写。我要感谢Paul Cohen细致的技术审查和很多切实可行的建议。文字编辑Kezia Endsley和校对Ed Kusswurm的辛勤工作和富有建设性的反馈都值得鼓掌和表扬。剩下的任何不完美之处我愿意负全责。
我还要感谢Dhaneesh Kumar和整个Apress出版社团队的奉献;感谢Vyacheslav Klochkov和Mitch Bodart指导我如何高效使用FMA指令,也要感谢我单位同事的支持和关注。最后,我要感谢我的父母Armin和Mary以及我的兄弟姐妹Mary、Tom、Ed和John,感谢他们在我写这本书的时候给我很多鼓励。

上架指导

计算机\程序设计

封底文字

本书讲述x86汇编语言编程的基础知识,重点关注与应用软件开发相关的x86指令集。作者从应用程序编程的角度来解释x86处理器的内部架构,并且提供大量示例代码,帮助读者快速理解x86汇编语言编程和x86平台的计算资源。
本书既适用于想要学习如何使用x86汇编语言编写性能增强算法和函数的软件开发者,也适用于对x86汇编语言编程有基本了解,想要学习x86的SSE和AVX指令集的软件开发者。
通过阅读本书,你将学到:
 如何使用x86-32和x86-64指令集构建可被高级语言C++调用的性能增强函数。
 如何使用x86汇编语言操纵常见的编程结构体,包括整数、浮点值、字符串、数组和结构。
 如何使用SSE和AVX扩展改进计算密集型算法的性能,如图像处理、计算机图形学、数学和统计学等领域。
 如何使用不同的编码策略和技巧优化x86的微架构,以最大化性能。

作者简介

[美] 丹尼尔·卡斯沃姆(Daniel Kusswurm) 著:丹尼尔·卡斯沃姆(Daniel Kusswurm) 在软件开发和计算机科学领域拥有超过30年的专业经验。在几十年的职业生涯中,他曾为各种医疗设备、科学仪器和图像处理应用编写了大量创新性的代码。在这些项目中,他有很多使用x86汇编语言的成功经验,有些是显著提高计算密集型算法的性能,有些是巧妙解决技术难题。丹尼尔拥有北伊利诺伊大学电子工程技术硕士学位和德保罗大学计算机科学博士学位。


加作者照片

译者简介

张银奎 罗冰 宋维 张佩 等译:暂无简介

译者序

尼采曾经说过:“没有可怕的深度,就没有美丽的水面。”这句话或许可以解释我们为什么要翻译这本书。
这本书确实是讨论汇编语言编程的。在这样一个各种脚本语言大行其道的“速成”时代,是否还有必要学习汇编语言呢?对于这个问题,简单回答是或否都可能失于片面。
不妨先讲个小故事。我曾经编写过一个C++程序,以多线程的方式计算Mercator级数。调试版本工作正常之后测试发布版本时发现了一个大问题:负责具体计算任务的工作线程纷纷完成计算并退出后,负责汇总结果的主线程却迟迟不给出结果,而且占用CPU很高,上调试器一看,CPU在以下while语句不停地循环。
while (pBoss->m_dwThreadCount != pBoss->m_dwCalcThreads)
{
  ///Sleep(1);
}  // busy wait until all threads are done with computation of partial sums
观察while语句中的两个变量,它们显然已经相等了:
+0x048 m_dwThreadCount : 0xa
+0x04c m_dwCalcThreads : 0xa
尝试单步跟踪,CPU始终不离开这行语句,仿佛被黏在这里一样。观察程序指针对应的汇编指令,我不禁愕然:
004012f0 ebfe      jmp   MulThrds!CBoxBoss::MasterThreadProc+0x40 (004012f0)
这是一条无条件跳转语句,跳转的目标地址居然就是同一条指令的地址。看来CPU在原地打转,根本没有判断两个变量是否相等。但这样说其实不准确,观察当前指令前面的指令,CPU曾经做过比较和判断:
004012e6 8b4e4c     mov   ecx,dword ptr [esi+4Ch]
004012e9 8b4648     mov   eax,dword ptr [esi+48h]
004012ec 3bc1      cmp   eax,ecx
004012ee 7402      je   MulThrds!CBoxBoss::MasterThreadProc+0x42 (004012f2)
问题的关键是while循环内部没有改变要判断的两个变量,而且定义这两个变量时又忘记使用volatile关键字来修饰,于是编译器在编译发布版本、做自动优化时,为了避免反复读取内存(内存在CPU外部,相对于读寄存器来说访问内存是比较大的开销),便只读取变量一次,也只比较一次,之后便只做跳转而不读取和比较了。增加volatile关键字后这个问题就解决了。
这个小故事说明了两个道理。
第一,汇编是CPU的语言,学会汇编可以为我们打开一扇窗,透过这扇窗我们可以穿越层层阻隔,探视深邃微妙的底层世界,理解CPU的行为,看它是在那个世界里欢快地奔跑还是遭遇陷阱停滞不前。
第二,编译器所做的自动优化有时是出乎我们预料的,可能让我们惊喜,也可能让我们沮丧。要理解编译器的优化行为,懂得汇编语言常常是必需的。
学会汇编语言的另一个好处是当我们对编译器自动优化所达到的效果不满意时,可以直接使用汇编语言编写代码,把性能提高到极致。一个典型的例子就是使用强大的SIMD指令(SSE和AVX)来优化各种图形图像应用的性能,比如视频编解码和各种机器学习算法。这本书很全面地介绍了x86 CPU的各种浮点计算技术,包括经典的x87指令,以及最近一些年流行的SSE指令和AVX指令。单凭这些内容,这本书便不愧“摩登”(Modern)之名。
尼采还说过一句我不愿意接受的话:“书的时代结束了,演员的时代开启了。”在眼下这样一个不是书的时代里,无论是写一本书还是翻译一本书都很艰难。太多干扰让我们无法安静地思考和遣词造句。我的多位格友(格物之友,搜索“格友”公众号可以了解更多)与我一起翻译了这本书,为了能有大块的时间专注于翻译并相互切磋,我们曾两度集结到苏州。第一次住在灵岩山下的木渎古镇。白天在灵岩山下的一个茶馆里挥汗如雨,晚上继续在宾馆里挑灯夜战。中午登上灵岩山,到灵岩寺里吃素面。虽然辛苦,但很充实和快乐。“无图无真相”,贴一张当时的照片吧!

照片中从左至右依次为:罗冰、高异明、宋维、张银奎、崔燚、王卫汉、王科平、张佩。以上格友承担了本书的主要翻译任务,此外,何旻、黎水芬和王建荣也参与了本书的少量翻译和校对工作,在此表示感谢。由于我们的水平有限,难免有翻译不当之处,希望各位读者批评指正。
x86架构的第一代产品8086是从1976年开始研发的,距今已有40个年头。这40年中,基于x86 CPU开发的各种产品难以计数,这些产品让这个经典架构传遍了整个世界。学习x86汇编语言是了解这一经典架构的最好方式,当我们把一条条指令交给x86 CPU执行时,其实就是在和这个经典架构直接“交谈”。在这个交谈过程中,我们可以体会到其中所蕴藏着的智慧,感受到“软件的大美”!

张银奎
2016年8月16日于格蠹轩

图书目录

出版者的话
译者序
前言
关于技术审校者
第1章 x86-32核心架构 1
1.1 简史 1
1.2 数据类型 3
1.2.1 基本数据类型 3
1.2.2 数值数据类型 4
1.2.3 组合数据类型 5
1.2.4 其他数据类型 6
1.3 内部架构 6
1.3.1 段寄存器 7
1.3.2 通用寄存器 7
1.3.3 EFLAGS寄存器 8
1.3.4 指令指针 9
1.3.5 指令操作数 9
1.3.6 内存寻址模式 10
1.4 指令集浏览 11
1.4.1 数据传输 13
1.4.2 二进制算术 13
1.4.3 数据比较 14
1.4.4 数据转换 14
1.4.5 逻辑运算 14
1.4.6 旋转和移位 15
1.4.7 字节设置和二进制位串 15
1.4.8 串 16
1.4.9 标志操纵 16
1.4.10 控制转移 17
1.4.11 其他指令 17
1.5 总结 17
第2章 x86-32核心编程 18
2.1 开始 18
2.1.1 第一个汇编语言函数 19
2.1.2 整数乘法和除法 22
2.2 x86-32编程基础 24
2.2.1 调用约定 25
2.2.2 内存寻址模式 28
2.2.3 整数加法 31
2.2.4 条件码 34
2.3 数组 38
2.3.1 一维数组 39
2.3.2 二维数组 42
2.4 结构体 47
2.4.1 简单结构体 47
2.4.2 动态结构体创建 50
2.5 字符串 52
2.5.1 字符计数 52
2.5.2 字符串拼接 54
2.5.3 比较数组 57
2.5.4 反转数组 60
2.6 总结 62
第3章 x87浮点单元 63
3.1 x87 FPU核心架构 63
3.1.1 数据寄存器 63
3.1.2 x87 FPU专用寄存器 64
3.1.3 x87 FPU操作数和编码 65
3.2 x87 FPU指令集 68
3.2.1 数据传输 68
3.2.2 基本运算 69
3.2.3 数据比较 70
3.2.4 超越函数 71
3.2.5 常量 71
3.2.6 控制 72
3.3 总结 72
第4章 x87 FPU编程 73
4.1 x87 FPU编程基础 73
4.1.1 简单计算 73
4.1.2 浮点比较 76
4.2 x87 FPU高级编程 79
4.2.1 浮点数组 79
4.2.2 超越指令(超越函数指令) 84
4.2.3 栈的高级应用 87
4.3 总结 92
第5章 MMX技术 93
5.1 SIMD处理概念 93
5.2 回绕和饱和运算 94
5.3 MMX执行环境 95
5.4 MMX指令集 96
5.4.1 数据传输 97
5.4.2 算术运算 97
5.4.3 比较 98
5.4.4 转换 99
5.4.5 逻辑和位移 99
5.4.6 解组和重排 99
5.4.7 插入和提取 100
5.4.8 状态和缓存控制 100
5.5 总结 100
第6章 MMX技术编程 101
6.1 MMX编程基础 101
6.1.1 组合整型加法 102
6.1.2 组合整型移位 108
6.1.3 组合整型乘法 111
6.2 MMX高级编程 113
6.2.1 整数数组处理 114
6.2.2 使用MMX和x87 FPU 120
6.3 总结 125
第7章 流式SIMD扩展 126
7.1 x86-SSE概览 126
7.2 x86-SSE执行环境 127
7.2.1 x86-SSE寄存器组 127
7.2.2 x86-SSE数据类型 128
7.2.3 x86-SSE的控制-状态寄存器 128
7.3 x86-SSE处理技术 129
7.4 x86-SSE指令集概览 132
7.4.1 标量浮点数据传输 133
7.4.2 标量浮点算术运算 133
7.4.3 标量浮点比较 134
7.4.4 标量浮点转换 134
7.4.5 组合浮点数据传输 135
7.4.6 组合浮点算术运算 135
7.4.7 组合浮点比较 136
7.4.8 组合浮点转换 136
7.4.9 组合浮点重排和解组 137
7.4.10 组合浮点插入和提取 137
7.4.11 组合浮点混合 137
7.4.12 组合浮点逻辑 138
7.4.13 组合整数扩展 138
7.4.14 组合整数数据传输 138
7.4.15 组合整数算术运算 139
7.4.16 组合整数比较 139
7.4.17 组合整数转换 139
7.4.18 组合整数重排和解组 140
7.4.19 组合整数插入和提取 140
7.4.20 组合整数混合 141
7.4.21 组合整数移位 141
7.4.22 文本字符串处理 141
7.4.23 非临时数据传输和缓存控制 142
7.4.24 其他 142
7.5 总结 143
第8章 x86-SSE编程——标量浮点 144
8.1 标量浮点运算基础 144
8.1.1 标量浮点算术运算 144
8.1.2 标量浮点数的比较 148
8.1.3 标量浮点数的类型转换 151
8.2 高级标量浮点编程 157
8.2.1 用标量浮点指令计算球体表面积和体积 157
8.2.2 用标量浮点指令计算平行四边形面积和对角线长度 159
8.3 总结 165
第9章 x86-SSE编程——组合浮点 166
9.1 组合浮点运算基础 166
9.1.1 组合浮点算术运算 167
9.1.2 组合浮点数的比较 171
9.1.3 组合浮点数的类型转换 175
9.2 高级组合浮点编程 178
9.2.1 组合浮点数最小二乘法 178
9.2.2 用组合浮点数进行4×4矩阵的计算 183
9.3 总结 192
第10章 x86-SSE编程——组合 整数 193
10.1 组合整数基础 193
10.2 高级组合整数编程 197
10.2.1 组合整数直方图 197
10.2.2 组合整数阈值分割 203
10.3 总结 214
第11章 x86-SSE编程——字符串 215
11.1 字符串基础知识 215
11.2 字符串编程 221
11.2.1 计算字符串长度 221
11.2.2 字符替换 224
11.3 总结 231
第12章 AVX——高级向量扩展 232
12.1 x86-AVX概述 232
12.2 x86-AVX执行环境 233
12.2.1 x86-AVX寄存器组 233
12.2.2 x86-AVX数据类型 233
12.2.3 x86-AVX指令语法 234
12.3 x86-AVX功能扩展 235
12.4 x86-AVX指令集概述 236
12.4.1 升级版的x86-SSE指令 236
12.4.2 新指令 239
12.4.3 功能扩展指令 242
12.5 总结 245
第13章 x86-AVX标量浮点编程 246
13.1 编程基础 246
13.1.1 标量浮点运算 246
13.1.2 标量浮点比较 248
13.2 高级编程 253
13.2.1 一元二次方程的根 253
13.2.2 球坐标系 258
13.3 总结 263
第14章 x86-AVX组合浮点编程 264
14.1 编程基础 264
14.1.1 组合浮点运算 265
14.1.2 组合浮点比较 269
14.2 高级编程 272
14.2.1 相关系数 272
14.2.2 矩阵列均值 278
14.3 总结 283
第15章 x86-AVX组合整型编程 284
15.1 组合整型基础 284
15.1.1 组合整型运算 284
15.1.2 组合整数解组操作 288
15.2 高级编程 292
15.2.1 图像像素裁剪 293
15.2.2 图像阈值二分法 299
15.3 总结 307
第16章 x86-AVX编程——新指令 308
16.1 检测处理器特性(CPUID) 308
16.2 数据操作指令 314
16.2.1 数据广播 314
16.2.2 数据混合 317
16.2.3 数据排列 322
16.2.4 数据收集 326
16.3 融合乘加编程 331
16.4 通用寄存器指令 339
16.4.1 不影响标志位的乘法和移位操作 339
16.4.2 增强的位操作 342
16.5 总结 345
第17章 x86-64核心架构 346
17.1 内部架构 346
17.1.1 通用寄存器 347
17.1.2 RFLAGS寄存器 348
17.1.3 指令指针寄存器 348
17.1.4 指令操作数 348
17.1.5 内存寻址模式 349
17.2 x86-64和x86-32的区别 350
17.3 指令集概览 351
17.3.1 基本指令使用 351
17.3.2 无效指令 352
17.3.3 新指令 352
17.3.4 不鼓励使用的资源 353
17.4 总结 353
第18章 x86-64核心编程 354
18.1 x86-64编程基础 354
18.1.1 整数算术运算 355
18.1.2 内存寻址 359
18.1.3 整型操作数 362
18.1.4 浮点数运算 365
18.2 x86-64调用约定 369
18.2.1 基本栈帧 369
18.2.2 使用非易变寄存器 372
18.2.3 使用非易变类型XMM寄存器 376
18.2.4 简化序言和结语的宏 381
18.3 x86-64数组和字符串 386
18.3.1 二维数组 386
18.3.2 字符串 390
18.4 总结 393
第19章 x86-64单指令多数据流架构 394
19.1 x86-SSE-64执行环境 394
19.1.1 x86-SSE-64寄存器组 394
19.1.2 x86-SSE-64数据类型 394
19.1.3 x86-SSE-64指令集概述 395
19.2 x86-AVX执行环境 395
19.2.1 x86-AVX-64寄存器组 395
19.2.2 x86-AVX-64数据类型 396
19.2.3 x86-AVX-64指令集概述 396
19.3 总结 396
第20章 x86-64单指令多数据流编程 397
20.1 x86-SSE-64编程 397
20.1.1 直方图绘制 397
20.1.2 图像转换 402
20.1.3 向量数组 410
20.2 x86-AVX-64编程 417
20.2.1 椭圆体计算 417
20.2.2 RGB图像处理 421
20.2.3 矩阵求逆 426
20.2.4 其他指令 437
20.3 总结 441
第21章 高级主题和优化技巧 442
21.1 处理器微架构 442
21.1.1 多核处理器概述 442
21.1.2 微架构流水线功能 443
21.1.3 执行引擎 445
21.2 优化汇编语言代码 446
21.2.1 基本优化 446
21.2.2 浮点算术 447
21.2.3 程序分支 447
21.2.4 数据对齐 448
21.2.5 SIMD技巧 449
21.3 总结 449
第22章 高级主题编程 450
22.1 无时态内存存储 450
22.2 数据预取 455
22.3 总结 463
索引 464

教学资源推荐
作者: [美]杰瑞 R. 汉丽(Jeri R. Hanly)埃利奥特 B. 考夫曼(Elliot B. Koffman) 著
作者: 王珊珊 臧洌 张志航
作者: 郝玉洁
参考读物推荐
作者: 章为忠 编著
作者: (美)弗里茨·安德森(Fritz Anderson) 著
作者: [美]马克·米凯利斯(Mark Michaelis) 著