【对汇编语言又爱又恨?那是没找对方法或者合适的书】

 

收到王军老师发来的英文电子版时,我的内心是忐忑的。汇编语言是一门低级语言,晦涩难懂,学习门槛高。目前市面上的汇编语言书籍大多是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


 


 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值