匯編語言的發展
機器語言
- 由0和1組成的機器指令
- 如:0101 0001 1101 0110
匯編語言(assembly language)
- 使用符號代替難編寫和很難閱讀機器語言,也成為符號語言。
- 如:mov,ax,bx,call
高級語言
- C/C++/OC/Java/Swift,更讓人易讀和編寫的語言(更接近人類的自然語言)
- 如:int a = b;
那我們為什么要學匯編?
- 首先,我們來看下高級語言的代碼在終端設備上是這樣的過程:
高級語言運行的過程
- 匯編語言與機器語言一一對應, 每一條機器指令都有與之對應的匯編指令
- 匯編語言可以通過編譯得到機器語言,機器語言可以通過反匯編得到匯編語言
- 高級語言可以通過編譯得到匯編語言/機器語言,但匯編語言/機器語言幾乎不可能還原成高級語言
匯編語言的特點
- 可直接訪問、控制各種硬件設備。比如存儲器、CPU等,能最大限度地發揮硬件的功能
- 能夠不受編譯器的限制,對生成的二進制代碼進行完全的控制
- 目標代碼簡短,占用內存少,執行速度快
- 匯編指令是機器指令的助記符,同機器指令一一對應。每種CPU都有自己的機器指令集/匯編指令集,所以匯編語言不具備可移植性
- 匯編語言知識點過多,開發者需要對CPU等硬件結構有所了解,不宜于編寫、調試、維護
- 不區分大小寫,比如mov和MOV是一樣的
匯編能用來干什么?
- 編寫驅動程序、操作系統(比如Linux內核的某些關鍵部分)
- 對性能要求極高的程序或者代碼片段,可與高級語言混合使用(內嵌匯編)
- 軟件安全
- 病毒分析和防治
- 逆向\加殼\脫殼\破解\外掛\免殺\加密解密\漏洞\黑客
- 理解整個計算機系統的最佳起點和最有效途徑
- 為編寫高效代碼打下基礎
- 弄清楚代碼的本質
- 函數的本質是什么?
- sizeof
- ++a + ++a + ++a 底層如何執行的?
- 編譯器到底幫我們干了什么?
- DEBUG模式和RELEASE模式有什么關鍵的地方被我們忽略
最后引用句裝逼的話
越底層越單純!真正的程序員都需要了解的一門非常重要的語言,匯編!
匯編的種類
- 目前討論比較多的匯編語言
- 8086匯編(8086處理器是16bit的CPU)
- Win32匯編
- Win64匯編
- ARM匯編(嵌入式、Mac、iOS)
- 我們iPhone里面的用到的是ARM匯編,但是不同的設備也有差異。因為CPU的架構不同
架構 | 設備 |
---|---|
armv6 | iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch |
armv7 | iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4 |
armv7s | iPhone5, iPhone5C, iPad4(iPad with Retina Display) |
arm64 | iPhone6s , iphone6s plus,iPhone6, iPhone6 plus,iPhone5S ,iPad Air, iPad mini2 |
- 因為學習要從簡單到難所以建議先從最為經典的8086匯編開始
- 結構簡潔,容易理解
- 指令簡單,便于記憶
- 原理相通
幾個計算機必要的常識
- 要想學好匯編,首先需要了解CPU等硬件結構
-
APP/程序的執行過程
簡易執行過程 - 硬件相關最為重要是CPU/內存
- 在匯編中,大部分指令都是和CPU與內存相關的