内容简介
本书从应用编程的角度解释x86处理器的内部架构和执行环境,全面介绍如何用x86汇编语言编写可被高级语言调用的函数。主要内容包括:x86-32核心架构(第1章和第2章),x87浮点单元(第3章和第4章),MMX技术(第5章和第6章),流式SIMD扩展(第7章至第11章),高级向量扩展(第12章至第16章),x86-64核心架构(第17章和第18章),x86-64SSE和AVX(第19章和第20章),高级主题(第21章和第22章)。书中包含了大量的示例代码,以帮助读者快速理解x86汇编语言编程和x86平台的计算资源。本书可作为高等院校计算机及相关专业学生的教材,也可供想要学习x86汇编语言编程的软件开发者使用。
目录
出版者的话
译者序
前言
关于技术审校者
第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
前言/序言
从个人电脑发明那一天起,很多软件开发者就使用汇编语言编程,以解决各种各样的难题。在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运算的示例。
现代X86汇编语言程序设计 电子书 下载 mobi epub pdf txt