具体描述
本书从应用编程的角度解释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汇编语言编程的软件开发者使用。
作者简介
丹尼尔·卡斯沃姆(Daniel Kusswurm)在软件开发和计算机科学领域拥有超过30年的专业经验。在几十年的职业生涯中,他曾为各种医疗设备、科学仪器和图像处理应用编写了大量创新性的代码。在这些项目中,他有很多使用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
· · · · · · (收起)
读后感
用户评价
我不得不说,这本书的排版和图示设计是顶尖水平的。汇编语言的学习难度很大一部分来自于概念的抽象性,而这本书通过大量精美的流程图和内存布局示意图,将那些原本难以想象的底层操作可视化了。比如,当讲解I/O端口操作和特权级别切换时,那些清晰的图表瞬间让复杂的流程变得一目了然。此外,随书配套的代码库维护得非常好,所有的例子都能在主流的Linux/Windows环境中无缝编译运行,这大大减少了读者调试环境的时间,可以将精力完全集中在理解代码逻辑上。对我个人而言,最大的收获是它对调试技巧的侧重。书中花了相当篇幅介绍如何利用调试器观察寄存器和内存的变化,这才是真正掌握汇编的“临门一脚”。这本书的完成度极高,无论是对自学者还是有一定基础的工程师,都是一本值得反复研读的经典之作。
这本书简直是汇编学习者的一盏明灯!我之前接触过一些其他的汇编资料,但总觉得晦涩难懂,尤其是在深入理解底层原理和现代处理器架构方面。这本书的行文风格非常接地气,作者似乎非常了解初学者在学习过程中会遇到的痛点,所以讲解的时候总能恰到好处地穿插一些形象的比喻和实际案例。比如说,它对寄存器和内存寻址方式的阐述,不仅仅是简单地罗列指令,而是深入剖析了为什么需要这些机制,以及它们在现代操作系统和应用程序中的实际应用场景。我特别欣赏它对不同寻常的指令集扩展的介绍,这让我对X86架构的深度有了更全面的认识,不再局限于基础的MOV、ADD这些指令。读完之后,我感觉自己对CPU的工作方式的理解提升了一个台阶,不再是被动地接受知识,而是能主动思考如何用汇编来优化性能瓶颈。对于那些想从高级语言转向底层,或者想从事系统编程、逆向工程的读者来说,这本书绝对是必不可少的工具书,它为深入探索硬件和软件的交界地带铺平了道路。
作为一名长期从事软件优化的工程师,我一直在寻找一本能够连接理论与实践的汇编书籍。这本书在这方面做得非常出色。它不仅仅停留在对指令集语法的讲解,更重要的是,它展现了如何利用汇编语言的精髓去解决现实世界中的性能问题。书中对数据结构在内存中的对齐、函数调用的堆栈管理、以及SIMD指令集(如SSE和AVX)的实际应用场景都有非常详尽的分析。我印象最深的是关于编译器优化是如何将高级语言代码转化为汇编指令的章节,这让我能够更清楚地看到我们代码中的某些“优化陷阱”是如何产生的。通过书中提供的实例,我尝试重写了一些关键路径的代码,性能提升是立竿见影的。这种实战性的指导,远比那些只停留在“什么是寄存器”的教材有价值得多。这本书更像是一本高级武功秘籍,它教你如何调动CPU的全部潜能,而不是仅仅学会几招花架子。
坦率地说,我一开始对“现代X86”这个标题持怀疑态度的,因为很多汇编书籍都停留在老旧的DOS时代,与今天的主流操作系统和多核处理器格格不入。然而,这本书完全颠覆了我的预期。它非常关注64位模式(x86-64)下的特性,比如新的通用寄存器、函数调用约定(ABI)的细节,以及如何处理大型内存模型。作者在讲解这些新特性时,并没有忽略历史的演进,而是巧妙地将16/32位与64位环境的差异点拎出来对比,这极大地帮助我理解了整个架构的演变脉络。书中的代码示例都是针对现代操作系统的环境编写的,这对于我进行内核模块开发和驱动程序调试非常有帮助。它让你明白,汇编不是一个“过时”的语言,而是理解现代计算基石的关键。我非常赞赏作者对新技术的敏感度和深度挖掘,这让这本书保持了极高的时效性和实用价值。
这本书的叙事逻辑非常严谨,它采用了螺旋上升的学习路径。一开始从最基础的概念入手,但很快就会引入复杂的主题,比如中断处理、异常机制,以及与操作系统内核的交互。这种结构的好处在于,它迫使读者必须时刻保持专注,不能轻易跳过任何一个细节,因为后面的章节往往会用到前面章节埋下的伏笔。我特别喜欢它对体系结构(Architecture)和微架构(Microarchitecture)区别的讨论,这让我明白了为什么即使是相同的X86指令,在不同的CPU上执行效率也会大相径庭。书中对流水线、缓存层次的解释,虽然是以汇编为载体,但实际上是在教授计算机系统设计的基础知识。对于那些目标是成为全栈底层架构师的人来说,这本书提供的底层视野是任何高级语言教程都无法比拟的,它建立起了一套坚实的理论框架。
入门挺好的
推荐,不仅讲解了x86的汇编,还讲解了sse,avx等技术,对x64介绍的也很清晰。适合学习了8086汇编仍感到迷茫的同学。张银奎老师翻译的也很棒。
推荐,不仅讲解了x86的汇编,还讲解了sse,avx等技术,对x64介绍的也很清晰。适合学习了8086汇编仍感到迷茫的同学。张银奎老师翻译的也很棒。
看了x86-32和64还有浮点运算和mmx,其余的我感觉暂时用不到。
汇编进阶用很赞