做爲一個程序員在咱們的開發和學習過程當中,或多或少都接觸過彙編
,那咱們想沒想過彙編
是什麼,掌握彙編咱們能幹什麼呢?
簡單一點說就是把彙編語言
翻譯成計算機能夠讀懂的機器語言
的過程,咱們稱之爲彙編
。學會彙編能夠玩工程的逆向,還能夠了解計算機的原理。在作逆向分析過程當中一個很重要的環節叫靜態分析
,一個APP能夠手機上執行,是由於手機上安裝了可執行文件,它本質上是一個二進制文件,手機本質上執行的是二進制,而靜態分析
是創建在二進制上面。要想分析二進制就須要瞭解彙編
。程序員
機器語言
呢? 它實際上是由0和1組成的機器指令
。加
:0100 0000,減
:0100 1000,乘
:1111 0111 1110 0000,除
:1111 0111 1111 0000。彙編語言
(assembly language),它是使用助記符代替機器語言。加
:INC EAX 經過編譯器 0100 0000,減
:DEC EAX 經過編譯器0100 1000,乘
:MUL EAX 經過編譯器1111 0111 1110 0000,除
:DIV EAX 經過編譯器1111 0111 1111 0000。咱們平常開發的代碼在終端設備上是怎樣轉化的呢? 經過上圖能夠很直觀的看到代碼的轉化過程。咱們也應該認識到彙編語言與機器語言一一對應,每一條機器指令都有與之對應的
彙編指令
。彙編語言能夠經過編譯獲得機器語言
,機器語言
能夠經過反彙編獲得彙編語言
。高級語言能夠經過編譯獲得彙編語言機器語言,但彙編語言\機器語言幾乎不可能還原成高級語言。markdown
能夠直接訪問、控制各類硬件設備,好比存儲器
、CPU
等,能最大限度地發揮硬件的功能。目標代碼簡短,佔用內存少,執行速度快。彙編指令是機器指令的助記符,同機器指令一一對應。每一種CPU
都有本身的機器指令集\彙編指令集,因此彙編語言不具有可移植性。不區分大小寫,好比mov和MOV是同樣的。 目前比較常見的彙編語言有:8086彙編
、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
: iPhone5S 之後 iPhoneX , iPad Air, iPad mini2之後 彙編會生成不一樣的指令,不一樣CPU架構
會對應不一樣的指令集。應用在手機或電腦中執行過程是怎麼樣的呢? 經過上圖咱們基本能夠摸清楚程序的執行過程。硬件相關最爲重要的是
CPU
。在彙編中大部分的指令都是CPU
與內存
之間關聯。一般咱們所說的32位
和64位
系統,區別在於在數據吞吐量上的差別,跟數據總線相關。CPU工做原理就是對外放電,32位系統CPU一次放電吞吐量位4字節
,64位系統CPU一次放電吞吐量位8字節
。那什麼是數據總線
呢? 總線
是一根根導線的集合。每個CPU芯片都有許多管腳
,這些管腳
和總線相連,CPU經過總線跟外部器件進行交互。總線又分爲三大類: 地址總線
、數據總線
、控制總線
。
地址總線
有多根決定總線的寬度
,寬度
決定了尋址的能力
。在程序執行過程當中,咱們常提到一個名詞鏡像文件(image())。它實際上是可執行文件從磁盤加載內存中的一種表現形式。8086
的地址總線寬度是20
,因此尋址能力是1M
。8080
的地址總線寬度是16
,因此尋址能力是64K
。 好了這一期的彙編咱們先探索到這裏,下一期咱們繼續研究。架構