【对汇编语言又爱又恨?那是没找对方法或者合适的书】
?
收到王軍老師發來的英文電子版時,我的內心是忐忑的。匯編語言是一門低級語言,晦澀難懂,學習門檻高。目前市面上的匯編語言書籍大多是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
?
?
總結
以上是生活随笔為你收集整理的【对汇编语言又爱又恨?那是没找对方法或者合适的书】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片合成gif动画如何在线操作?怎样在线
- 下一篇: LVS资料