最近準備學習彙編,而後在B站上看到叫iOS小賢的做者發的視頻挺不錯,打算跟着學,文章是看視頻的筆記,最後有原視頻連接,想看視頻的能夠看看經過連接查看視頻。sass
**注:**機器指令最終轉換成電信號。安全
咱們的代碼在終端設備上是這樣的過程:bash
**注:**高級語言根據不一樣的平臺編譯成對應的彙編語言,彙編語言在編譯成機器語言,最終執行的是機器語言,ax
和bx
是寄存器,mov ax, bx
是將ax
寄存器的值放入bx
中,mov ax, bx
在CPU底層就是1000100111011000
,在作逆向開發過程當中有個概念叫反彙編,安裝到手機上是加密或者加殼的機器語言,經過工具能夠砸殼,砸殼以後就能獲得機器語言,而後能夠反彙編成彙編語言(由於一條彙編指令和一條機器指令是一一對應的),可是彙編語言不能反編譯成高級語言,由於不一樣平臺下有不一樣的彙編指令,因此同一條C/OC語言會可能生成不一樣的彙編代碼,也有可能會生成一樣的彙編代碼。架構
高級語言是在彙編語言之上的,作了一層包裝,因此咱們看到的彙編語言有不少代碼是用來配置一些環境的,來支持高級語言的一些語法特性,好比面向對象的特性。iphone
- 彙編語言與機器語言一一對應,每一條機器指令都有與之對應的彙編指令
**注:**彙編能夠直接訪問CPU,寄存器屬於CPU的,能夠最大限度發揮硬件的功能,並且不受編譯器的限制。好比用匯編寫一些病毒或者作安全相關的東西,爲何能作這些事情呢?由於用高級語言作一些開發的時候,有不少功能是受限制的,可是因爲彙編是直接訪問CPU的,由於操做系統也是指令集,操做系統能作的事情咱們也能作。「執行速度快」是相對高級語言,一條高級語言代碼生成的彙編語言可能會很是多,由於高級語言要搭一個環境,好比面向對象的語言特性,用不少彙編指令才能支撐,因此直接寫彙編語言「目標代碼簡短,佔用內存少,執行速度快」。再說一下「標代碼簡短,佔用內存少」,咱們所寫的代碼在執行的過程當中須要加載進內存,叫裝載的過程,高級語言可能你寫的代碼不多,但生成的彙編不少,因此佔用的內存就會大。並且高級語言最終轉變的二進制,由於要環境搭建,要繞不少彎,連接不少庫,比方說NSLog
,須要連接不少系統的庫,因此最終生成的二進制有不少二進制的東西,因此最終轉成的機器碼比較大。ide
下面來新建一個項目Assembly001,而後在Debug中把Debug Workflow設置成Always Show Disassembly,這樣打了斷點會顯示反彙編代碼函數
執行程序工具
剛剛看到的是X86彙編,movl %eax, -0x14(%rbp)
在LLDB中輸入memory read 0x10cc7f795
能夠獲得這條指令所在的地址,這些都是16進制的,0x10cc7f798
減去0x10cc7f795
爲4,也就是在內存中佔有4個字節,32位。性能
0x10cc7f795: 89 45 ec e8 e9 02 00 00 8b 7d f8 48 8b 75 f0 48 .E.......}.H.u.H
0x10cc7f7a5: 8b 0d cd 24 00 00 48 8b 15 be 24 00 00 89 7d e8 ...$..H...$...}.
複製代碼
輸入memory read 0x10cc7f795
,48 83 ec 30
這4個字節就是subq $0x30, %rsp
這個指令的意思。學習
0x10cc7f774: 48 83 ec 30 c7 45 fc 00 00 00 00 89 7d f8 48 89 H..0.E......}.H.
0x10cc7f784: 75 f0 bf 01 00 00 00 be 02 00 00 00 e8 bb ff ff u...............
複製代碼
再輸入s挑戰到test
目前討論比較多的彙編語言有
咱們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開始
**注:**手機安裝的App中有不少文件,Mach-O是可執行文件,可執行文件須要裝載進內存。本地圖片,bundle, nib文件不屬於執行文件,屬於數據,也須要加載進內存,只不過在使用的時候才加載,可是執行文件首先加載進內存。加載進內存後,CUP經過地址總線讀指令,讀到對應指令以後會經過控制總線控制終端設備的屏幕每一個像素點是RGBA,每一個值是0到255,255的二進制是1111 1111
,8個二進制位,也就是一個字節,內存中最小單元是一個字節。