天天看點

ARM彙編

彙編語言是一種功能很強的程式設計語言,也是利用計算機所有硬體特性并能直接控制硬體的語言,目前在嵌入式開發、單片機開發、系統軟體設計、某些快速處理、位處理、通路硬體裝置等高效程式的設計方面有很多應用。

ARM處理器是一種16/32位的高性能、低成本、低功耗的嵌入式RISC微處理器,由ARM公司設計,然後授權給各半導體廠商生産,它目前已經成為應用最廣泛的嵌入式處理器,在逆向分析一款應用軟體的時候,了解ARM的架構與ARM程式的彙編指令将能夠有效地幫助我們了解一些底層的邏輯,即實作方式。

ARM晶片

ARM架構屬于RISC指令集,指令集精簡,但指令等長,雖然這樣的設計可以提高處理效率,但在遇到複雜的指令後,就需要更多的簡單指令來堆徹複雜任務,由于第一次智能手機革命中,大部分智能手機運作系統都比較簡單,是以手機廠商和系統公司都選擇了ARM架構的處理器來比對當時的智能手機,這也是google選擇ARM作為Android 系統最早使用晶片的原因,但是,面對不斷更新的Android 系統,單核ARM晶片已經很難支援其流暢的運作,故此,ARM架構的處理器也在不斷的提升自我,最終通過多個指令完成複雜的任務操作。

Android支援處理器概況

支援處理器 概況
ARM 最早支援,支援的最完善,主要用在手機市場,目前積極進軍PC、智能家居等市場
X86 目前已經比價完善,推出了atom+Android的上網本,賣點在于支援atom+Android 和atom+windows7雙系統
mips 目前在移植,完善過程中,主要目标在智能家電、pc領域,龍芯也在支援android
POWERPC 目前在移植、完善過程中

目前來說android 作業系統運作在ARM處理器上的機器數量最多,也是我們平時使用NDK編譯時選擇的主要平台,是以我們主要讨論android 系統在arm處理器的應用,以及在ARM處理器上的彙編指令。

計算機層級層級

層級 名稱 說明
第零層 硬聯邏輯 硬體
第一層 微程式 軟硬體分界
第二層 機器語言
第三層 作業系統 系統軟體
第四層 彙編語言
第五層 進階語言
第六層 應用程式 應用軟體
第七層 使用者

第零級,硬聯邏輯級,這是計算機核心,由門、觸發器等邏輯電路組成,即我們通常在電路闆上看到的電路邏輯。

第一級,微程式級,這級的機器語言是微指令集,程式員用微指令編寫微程式,一般由硬體直接執行的

第二級,傳統機器級,這級的機器語言是該機的指令集,程式用機器指令編寫的程式可以由微程式進行解釋

第三極,作業系統,從作業系統的基本功能來看,一方面它要直接管理傳統機器中的軟硬體資源,另一方面它又是傳統機器的延伸。

第四級,彙編語言級,這級的機器語言是彙編語言,完成彙編語言翻譯的程式叫做彙程式設計式。

第五級,進階語言級,這級的機器語言就是各種進階語言,通常編譯程式來完成進階語言的翻譯工作,進階語言主要是相對于彙編語言而言的,它并不是特指某一種具有語言,而是包括了很多變成語言,如:C#、java、vb、.net、C、C++等

第六級,應用程式級,這一級為了使計算機滿足某種用途而專門設計的,即通常在計算機上所使用到的各種應用軟體。

第七級,使用計算機的使用者。

彙編語言

彙編語言是直接面向處理器的程式設計語言,處理器是在指令的控制下工作的,處理器可以識别的每一條指令稱為機器指令,每一種處理器都有自己可以識别的一整套指令,稱為指令集,處理器執行指令時,根據不同的指令采取不同的動作,完成不同的功能,既可以改變自己的内部工作狀态,也能控制其他外圍電路的工作狀态。

是以,在不同的機器中,這些指令就表現為不同的”0“,”1“串,對應着低電平與高電平,這樣的指令計算機了解與設計起來非常友善,是以人們閱讀了解起來就相對困難了,基本上,彙編語言裡的每一條指令,都對應着處理器的一條機器指令。

彙編語言的基本文法

{标号}{指令或僞指令}{;注釋}

在彙編語言程式設計中,每一條指令的助記符可以全部用大寫或者全部用小寫,但不允許在一條指令中大、小寫混用,同時,如果一條語句太長,可将該語句分為若幹行來書寫,在行末尾用 ”\“ 表示下一行與本行為同一行語句。

語句注釋:注釋以分号 (;) 開頭,注釋的結尾即為一行的結尾,為了程式清晰易讀,注釋也可以單獨占用一行,彙編器在對程式進行彙編時忽略注釋。

從程式設計的角度看,ARM微處理器的工作狀态一般有兩種,并可在兩種狀态之間切換

ARM狀态----此時處理器執行32位的字對齊的ARM指令

Thumb狀态-----此時處理器執行16位的、半字對齊的Thumb指令

當ARM微處理器執行32位的ARM指令集時,工作在ARM狀态,當ARM微處理執行16位的Thumb指令集時,工作在Thumb狀态,在程式執行過程中,微處理器可以随時在兩種狀态之間切換,并且處理器工作狀态的轉變并不影響處理器的工作模式和相應寄存器中的内容。

ARM指令集和Thumb指令集均有切換處理器狀态的指令,并可在兩種狀态之間切換,但ARM微處理器在開始執行代碼時,應該處于ARM狀态。

進入Thumb狀态,當操作數寄存器的狀态位 (位0) 為1時,可以采用執行BX指令的方法,使微處理器從ARM狀态切換到Thumb狀态,此外,當處理器處于Thumb狀态發生異常(如IRQ、FIQ、Undef、SWI等),則異常處理傳回時,自動切換到Thumb狀态。

進入ARM狀态,當操作數及儲存器的狀态為0時,執行BX指令時可以使微處理器從Thumb狀态切換到ARM狀态,此外,在處理器進行異常處理時,把PC指針放入異常模式連結寄存器中,并從異常向量位址開始執行程式,也可以使處理器切換到ARM狀态。

RM體系結構的存儲器格式

ARM體系結構将存儲器看作是從零位址開始的位元組的線型組合,從零位元組到三位元組放置一個存儲的字資料,從第四個位元組到第七個位元組放置第二個存儲的字資料,依次排列,作為32位的微處理器,ARM體系結構所支援的最大尋址空間為4G(232位元組),ARM體系結構可以用兩種方法存儲資料,稱之為大端格式和小端格式,

大端格式:字資料的高位元組存儲在低位址中,而字資料的低位元組則存放在高位址中

小端格式:與大端存儲格式相反,在小端存儲格式中,低位址中存放的是字資料的低位元組,高位址存放的是字資料的高位元組

指令長度及資料類型

ARM微處理器的指令長度可以是32位 (在ARM狀态下) ,也可以是16位 (在Thumb狀态下),ARM微處理器中的支援位元組(8位)、半字(16位)、字(32位)這三種資料類型,其中字需要4位元組對齊(位址的低兩位為0),半字需要2位元組對齊(位址的最低位為0)。

處理器模式 

ARM處理器支援7種運作模式

  • 使用者模式(usr):ARM處理器正常的程式執行狀态
  • 快速中斷模式(fiq):用于高速資料傳輸或通道處理
  • 外部中斷模式(irq):用于通用的中斷處理
  • 管道模式(svc):作業系統使用的保護模式
  • 資料通路終止模式(abt):當資料或指令預取終止時進入該模式,可用于虛拟存儲及存儲保護
  • 系統模式(sys):運作具有特權作業系統任務
  • 未定義指令終止模式(und):當未定義的指令執行時進入該模式,可用于支援硬體協處理器的軟體仿真

ARM位處理器的運作模式可以通過軟體改變,也可通過外部中斷或異常處理改變,大多數的應用程式運作在使用者模式下,當處理器運作在使用者模式下時,某些保護的系統資源是不能被通路的。

除了使用者模式以外,其餘的所有6種模式稱之為非使用者模式,或特權模式,其中除去使用者模式和系統模式以外的5種又稱為異常模式,常用于進行中斷或異常,以及需要通路受保護的系統資源等情況。

ARM狀态下寄存器組織

ARM微處理器共有37個32位寄存器,其中31個為通用寄存器,6個為狀态寄存器,但是這些寄存器不能被同時通路,具體哪些寄存器可是可程式設計通路的,取決于微處理器的工作狀态及具體的運作模式,但在任何時候,通用寄存器R14~R0、程式計數器PC、一個或兩個轉台寄存器都是可通路的。

通用寄存器包括R0~R15,可分為3類

  • 未分組寄存器R0~R7
  • 分組寄存器R8~R14
  • 程式計數器PC(R15)

Thumb狀态下的寄存器組織

thumb狀态下的寄存器集是ARM狀态下寄存器集的一個子集,程式可以直接通路8個通用寄存器(R7~R0)、程式計數器(PC)、堆棧指針(sp)、連接配接寄存器(LR)、CPSR,同時,在每一種特權模式下都有一組SP、LR、SPSR

Thumb狀态下的寄存器組織與ARM狀态下的寄存器組織關系如下:

  • Thumb狀态下和ARM狀态下的R0~R7是相同的
  • Thumb狀态下和ARM狀态下的CPSR和所有的SPSR是相同的
  • Thumb狀态下SP對應于ARM狀态下的R13
  • Thumb狀态下LR對應于ARM狀态下的R14
  • Thumb狀态下的程式計數器對應于ARM狀态下的R15

在Thumb狀态下,高位寄存器R8~R15并不是标準寄存器集的一部分但可使用彙程式設計式受限制地通路這些寄存器,将其用作快速暫存器,使用帶特殊變量的MOV指令,資料可以在低位寄存器和高位寄存器之間進行傳送,高位寄存器的值可以使用CMP和ADD指令進行比較或加上低位寄存器中的值。