?
收到王军老师发来的英文电子版时,我的内心是忐忑的。汇编语言是一门低级语言,晦涩难懂,学习门槛高。目前市面上的汇编语言书籍大多是32位的,64位汇编语言的书籍凤毛麟角,可供查证的资料十分有限。我于2020年3月开始正式创业;作为上海碳泽信息科技有限公司的创始人,我平时工作较忙,只能利用周末和晚上的时间进行翻译,翻译这样的书籍是很有挑战的。我尽量把书中的示例代码都亲自跑了一遍,以进行验证。本书的作者有非常丰富的从业经验,全书内容深入浅出,循序渐进,通俗易懂;本书的技术审稿人在英特尔公司工作了26年,对英特尔CPU的架构非常熟悉,对本书的质量进行了严格把关。 汇编语言是逆向工程的基础,扎实的汇编语言基础对于抵御恶意软件攻击非常有用,是保护IT基础设施的重要技能。在学习本书前,最好先学一门高级语言(如C语言),这对于你学习和掌握本书的内容非常重要。本书很少涉及深奥的理论知识,将理论内容控制在最低范围。书中的代码都是完整的,便于读者进行测试和修改。 掌握汇编语言对于漏洞挖掘也非常重要,尤其是底层漏洞,如Windows、Linux操作系统的漏洞挖掘。另外,如果读者喜欢打CTF比赛,那么任何一个优秀战队都需要一名优秀的二进制队员;要想成为那个不可或缺的队员,非常有必要学好汇编语言。 目前国内的安全人才(尤其是二进制方面的人才)非常短缺。希望本书能帮助读者快速掌握64位汇编语言,迅速.上手,为精通64位汇编语言打下坚实基础,为国家信息技术的发展和网络安全事业奉献力量。 最后感谢清华大学出版社,感谢王军等编辑付出的艰苦努力,感谢上海碳泽信息科技有限公司的所有同事和股东的支持,谢谢你们。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?贾玉彬. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2021年7月于北京
学习汇编语言可能会令人沮丧,不仅仅是因为它是一种“无情”的语言。 在任何可能的情况下,计算机都会对你“发飙”。你可能只是在不知不觉中引入了一个隐藏的错误,该错误会在以后的程序中或执行时让你发狂。除此之外,学习曲线陡峭,语言晦涩难懂,英特尔官方文档铺天盖地,并且可用的开发工具各有其古怪之处。 在《x64汇编语言:从新手到AVX专家》中,你将从简单的程序开始学习,直到高级矢量扩展(AVX)编程。 到本书结尾,你将能编写和阅读汇编代码,将汇编语言与更高级的语言混合在一起使用,并对AVX 有初步的了解。本书的目的是向你展示如何使用汇编语言指令。本书不是关于编程风格或代码性能优化的。 在掌握汇编的基本知识之后,你可以继续学习如何优化代码。 本书不应该是你学习编程的第一本书。如果你 没有任何编程经验,请将本书搁置一段时间,先学习更高级语言(如C)的一些编程基础知识。
可扫描封底二维码下载本书的所有源代码。本书使用的代码都尽可能地简单,这意味着没有图形用户界面、繁杂的程序或错误检查,因为添加所有这些特性会使我们的注意力偏离学习汇编语言的目的。 理论知识被严格限制在最低限度:关于二进制数的一点知识、逻辑运算符的简短介绍以及一些有限的线性代数。我们将远离浮点转换。如果你需要转换二进制或十六进制数,请找一个可以为你执行此类操作的网站。不要浪费时间执行手工计算。坚持目标:学习汇编。 汇编代码以完整的程序呈现,这样你就可以在计算机上测试它们、操作它们、更改它们、破坏它们。 还将展示可以使用哪些工具、如何使用它们以及这些工具的潜在问题。拥有正确工具对于克服陡峭学习曲线至关重要。有时会指出可能有用或提供更多详细信息的书籍、白皮书和网站。
我们无意为你提供所有汇编指令的综合课程。 内容太多了,仅用一本书讲述是不可能的(请看英特尔手册的大小)。我们将介绍主要的指令,以便你对汇编语言有所了解。如果通读本书,你将获得学习汇编的必要知识,你还可以自行详细研究某些感兴趣的领域。读完本书后,你将可以进一步学习英特尔手册,并尝试理解其内容。
《x64汇编语言:从新手到AVX专家》的大部分内容专门针对Linux 上的汇编,因为它是学习汇编语言的最简单平台。最后,我们提供了一些章节以帮助你了解如何在Windows 上进行汇编。 你将看到,一旦掌握了Linux 汇编,进行Windows 汇编会更容易。
有许多可与英特尔处理器一起使用的汇编器,例如FASM、MASM、GAS、NASM 和YASM。我们将在本书中使用NASM,因为它是多平台的,在Linux、Windows 和macOS 上都可用,具有较大的用户群。但不必担心,一旦你熟悉一种汇编器,学习另一种汇编“方言”就很容易。 我们已经仔细编写并测试了本书使用的代码。但是,如果文本中有错别字或程序中有错误,我们将不承担任何责任。我们将错误归咎于两只猫,它们喜欢在我们打字的时候走过我们的键盘。 我们在本书中提出的想法和观点仅代表我们自己,并不代表IBM 的立场、战略或观点。
节选自《x64汇编语言:从新手到AVX专家》一书
?
█ █ █ 目 ? ?录 ? 第1章 ?你的第一个程序 ? 1 1.1 ?编辑、汇编、链接和运行(或调试) ? 2 1.2 ?汇编程序的结构 ? 6 1.2.1 ?.data段 ? 6 1.2.2 ?.bss段 ? 7 1.2.3 ?.txt段 ? 8 1.3 ?小结 ? 10 第2章 ?二进制数、十六进制数和寄存器 ? 11 2.1 ?二进制简短课程 ? 11 2.1.1 ?整数 ? 12 2.1.2 ?浮点数 ? 13 2.2 ?寄存器简短课程 ? 13 2.2.1 ?通用寄存器 ? 14 2.2.2 ?指令指针寄存器(rip) ? 15 2.2.3 ?标志寄存器(Flag Register) ? 15 2.2.4 ?xmm和ymm寄存器 ? 16 2.3 ?小结 ? 16 第3章 ?用调试器进行程序分析: GDB ? 17 3.1 ?开始调试 ? 17 3.2 ?继续进步 ? 22 3.3 ?其他GDB命令 ? 24 3.4 ?稍加改进的hello, world程序 ? 25 3.5 ?小结 ? 27 第4章 ?你的下一个程序: Alive and Kicking ? 29 4.1 ?alive程序分析 ? 30 4.2 ?打印 ? 34 4.3 ?小结 ? 37 第5章 ?汇编是基于逻辑的 ? 39 5.1 ?NOT ? 39 5.2 ?OR ? 39 5.3 ?XOR ? 40 5.4 ?AND ? 41 5.5 ?小结 ? 42 第6章 ?数据显示调试器 ? 43 6.1 ?使用DDD ? 43 6.2 ?小结 ? 46 第7章 ?跳转和循环 ? 47 7.1 ?安装SimpleASM ? 47 7.2 ?使用SASM ? 47 7.3 ?小结 ? 54
第8章 ?内存 ? 55 8.1 ?探索内存 ? 55 8.2 ?小结 ? 62 第9章 ?整数运算 ? 63 9.1 ?从整数算术开始 ? 63 9.2 ?分析算术指令 ? 67 9.3 ?小结 ? 69 第10章 ?堆栈 ? 71 10.1 ?理解堆栈 ? 71 10.2 ?跟踪堆栈 ? 74 10.3 ?小结 ? 76 第11章 ?浮点运算 ? 77 11.1 ?单精度与双精度 ? 77 11.2 ?浮点数编程 ? 78 11.3 ?小结 ? 81 第12章 ?函数 ? 83 12.1 ?编写一个简单的函数 ? 83 12.2 ?更多函数 ? 85 12.3 ?小结 ? 87 第13章 ?栈对齐和栈帧 ? 89 13.1 ?栈对齐 ? 89 13.2 ?有关栈帧的更多信息 ? 91 13.3 ?小结 ? 92 第14章 ?外部函数 ? 93 14.1 ?编译并链接函数 ? 93 14.2 ?扩展makefile ? 97 14.3 ?小结 ? 98 第15章 ?调用约定 ? 99 15.1 ?函数参数 ? 100 15.2 ?栈布局 ? 103 15.3 ?保留寄存器 ? 106 15.4 ?小结 ? 107
第16章 ?位运算 ? 109 16.1 ?基础 ? 109 16.2 ?算术 ? 115 16.3 ?小结 ? 119 第17章 ?位操作 ? 121 17.1 ?修改位的其他方法 ? 121 17.2 ?位标志变量 ? 124 17.3 ?小结 ? 125 第18章 ?宏 ? 127 18.1 ?编写宏 ? 127 18.2 ?使用objdump ? 129 18.3 ?小结 ? 130 第19章 ?控制台I/O ? 131 19.1 ?使用I/O ? 131 19.2 ?处理溢出 ? 133 19.3 ?小结 ? 137 第20章 ?文件I/O ? 139 20.1 ?使用syscall ? 139 20.2 ?文件处理 ? 140 20.3 ?条件汇编 ? 149 20.4 ?文件操作指令 ? 149 20.5 ?小结 ? 151 第21章 ?命令行 ? 153 21.1 ?访问命令行参数 ? 153 21.2 ?调试命令行 ? 154 21.3 ?小结 ? 156 第22章 ?从C到汇编 ? 157 22.1 ?编写C源文件 ? 157 22.2 ?编写汇编代码 ? 159 22.3 ?小结 ? 164 第23章 ?内联汇编 ? 165 23.1 ?基本内联汇编 ? 165 23.2 ?扩展内联汇编 ? 167 23.3 ?小结 ? 170 第24章 ?字符串 ? 171 24.1 ?移动字符串 ? 171 24.2 ?比较和扫描字符串 ? 176 24.3 ?小结 ? 181 第25章 ?cpuid ? 183 25.1 ?使用cpuid ? 183 25.2 ?使用test指令 ? 186 25.3 ?小结 ? 188 第26章 ?SIMD ? 189 26.1 ?标量数据和打包数据 ? 189 26.2 ?数据对齐与不对齐 ? 191 26.3 ?小结 ? 192 第27章 ?小心mxcsr ? 193 27.1 ?操作mxcsr的位 ? 194 27.2 ?分析程序 ? 201 27.3 ?小结 ? 202 第28章 ?SSE对齐 ? 203 28.1 ?未对齐示例 ? 203 28.2 ?对齐示例 ? 206 28.3 ?小结 ? 210 第29章 ?SSE打包整数 ? 211 29.1 ?适用于整数的SSE指令 ? 211 29.2 ?分析代码 ? 213 29.3 ?小结 ? 214 第30章 ?SSE字符串操作 ? 215 30.1 ?imm8控制字节 ? 216 30.2 ?使用imm8控制字节 ? 217 30.2.1 ?位0和1 ? 217 30.2.2 ?位2和3 ? 217 30.2.3 ?位4和5 ? 218 30.2.4 ?位6 ? 218 30.2.5 ?位7 ? 219 30.2.6 ?标志 ? 219 30.3 ?小结 ? 220 第31章 ?搜索字符 ? 221 31.1 ?确定字符串的长度 ? 221 31.2 ?在字符串中搜索 ? 224 31.3 ?小结 ? 228 第32章 ?比较字符串 ? 229 32.1 ?隐式长度 ? 229 32.2 ?显式长度 ? 232 32.3 ?小结 ? 236 第33章 ?重排 ? 237 33.1 ?重排初探 ? 237 33.2 ?重排广播 ? 243 33.3 ?重排反转 ? 244 33.4 ?重排旋转 ? 245 33.5 ?重排字节 ? 245 33.6 ?小结 ? 246 第34章 ?SSE字符串掩码 ? 247 34.1 ?搜索字符 ? 247 34.2 ?搜索某个范围内的字符 ? 253 34.3 ?搜索子字符串 ? 258 34.4 ?小结 ? 262 第35章 ?AVX ? 263 35.1 ?测试是否支持AVX ? 263 35.2 ?AVX程序示例 ? 265 35.3 ?小结 ? 270 第36章 ?AVX矩阵运算 ? 271 36.1 ?矩阵代码示例 ? 271 36.2 ?矩阵打印:printm4x4 ? 281 36.3 ?矩阵乘法:multi4x4 ? 281 36.4 ?矩阵求逆:Inverse4x4 ? 284 36.4.1 ?Cayley-Hamilton定理 ? 284 36.4.2 ?Leverrier算法 ? 285 36.4.3 ?代码 ? 286 36.5 ?小结 ? 289 第37章 ?矩阵转置 ? 291 37.1 ?转置代码示例 ? 291 37.2 ?解包版本 ? 295 37.3 ?重排版本 ? 299 37.4 ?小结 ? 301 第38章 ?性能调优 ? 303 38.1 ?转置计算性能 ? 303 38.2 ?迹计算性能 ? 310 38.3 ?小结 ? 317 第39章 ?你好,Windows的世界 ? 319 39.1 ?入门 ? 319 39.2 ?编写一些代码 ? 321 39.3 ?调试 ? 323 39.4 ?syscall ? 323 39.5 ?小结 ? 323 第40章 ?使用Windows API ? 325 40.1 ?控制台输出 ? 325 40.2 ?编译Windows程序 ? 328 40.3 ?小结 ? 330 第41章 ?Windows中的函数 ? 331 41.1 ?使用四个以上的参数 ? 331 41.2 ?使用浮点数 ? 337 41.3 ?小结 ? 339 第42章 ?可变参数函数 ? 341 42.1 ?Windows中的可变参数函数 ? 341 42.2 ?混合值 ? 343 42.3 ?小结 ? 345 第43章 ?Windows文件 ? 347 43.1 ?小结 ? 350 后记 ? 351
?
?
|