ARM架構與ARM彙編指令集

0x00 本文目標

  • 本文內容從《ARM Architecture Reference Manual》中截取翻譯,可以看作是一個重點筆記集。僅記錄博主認爲有意思的部分,並加入一些個人理解。如果發現有不對的地方歡迎留言指正。
  • 現代的智能手機是能進行ARM彙編級別交互的最便捷的設備,因此實例分析的內容基於博主的小米Note+IDA,和某個正在被調試的安卓程序。該程序加載的SO文件使用armeabi架構。

0x01 ARM模型與概念

ARM支持三種數據類型的讀寫:Byte(8 bits),Halfword(16 bits),Word(32 bits)。所有內存指令相關的讀寫操作都會基於這三種數據類型。

ARM使用小端存儲,這意味着例如指令E5 9F 00 90在內存中會反序存儲爲:

0x00a0 90 00 9F E5

在讀取指令後,會被還原爲正序E59F0090。

ARM一共支持7種處理器模式,程序在編譯後所運行的絕大部分時間片中,例如執行了一段MD5加密函數,都處於usr模式。

寄存器示例圖,某個程序正在處於調試暫停中。

ARM處理器一共有37個之多的寄存器。在所有的ARM狀態模式中,有15個可見寄存器(R0~R14),和1~2個狀態寄存器隨時可編程交互。其餘沒有提到的寄存器,用於處理異常、中斷等核心指令,外部不可見也不能自主控制讀寫。

R0~R7作爲不保留寄存器,可以自由編程指定其含義。例如R0~R3最常用於參數傳遞,返回值等保存。

R8~R14是保留寄存器,有自己的特殊含義,在寄存器實例圖中可以看到多半保存和地址相關的值,又或者指向了SP地址或LR地址。

通常R13就是SP(Stack Pointer)寄存器,該值指向當前彙編代碼段可以使用的棧起始地址。R14作爲LR(Link Register)寄存器,保存當前彙編代碼段執行完畢後,需要回溯到的彙編代碼地址。PC程序計數器是一個特殊的寄存器,指向當前正在執行的代碼地址。

PSR標誌寄存器,也就是寄存器實例圖右邊的對usr用戶模式有意義的NZCVQFTMODE標誌位,對程序的分支結構執行,運算的結果產生影響。

N(Negative)標誌位當運算結果爲負數時值爲1。Z(Zero)標誌位當運算結果爲0時值爲1。C標誌位有多個用途,其中當執行CMP等比較指令時,用1和0分別代表真假。

0x01 彙編指令與機器碼

常用的指令集類別有:讀取存儲指令,流程控制指令,運算指令。

ARM標準模式下的指令集的機器碼編碼位結構一共有32位,其中[27:25]位的值用於區分指令類別,下圖實例拆解一條指令:

在對應的位表示中instru[27:25]的值是010,對應指令集編碼結構圖可以定位到這是一條Load/store immediate offset(立即讀取存儲偏移量)指令。在對其他的位進行翻譯後可以得到原始彙編指令:ldr r0, [pc, #0x90]。

 

 

存儲指令可以將寄存器的值保存到內存地址中,讀取指令將內存地址保存到內存中。常見於STR和LDR。例如下圖0x1234地址指令分別將R1和R0的值保存到棧中。隨後又從程序地址中使用LDR指令再次賦值R0,R1寄存器。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章