- Android與ARM處理器
- ARM處理器架構概述
- ARM處理器家族
- Android支援的處理器架構
- ARM
- x86
- MIPS
- 原生程式與ARM彙編語言
- 逆向初步
- 原生程式的生成過程
- 預處理 gcc -E hello.c hello.i
- 編譯 gcc -S hello.i -o hello.s
- 彙編 gcc -c hello.s -o hello.o
- 連結 gcc hello.o -o hello
- ARM知識
- ARM有31個通用寄存器和6個狀态寄存器
- ARM的運作模式
模式 簡寫 作用 使用者模式 usr ARM處理器正常的執行狀态 快速中斷模式 fiq 高速資料傳輸或通道處理 外部中斷模式 irq 通用中斷處理 管理模式 svc ARM作業系統使用的保護模式 資料通路終止模式 abt 資料或指令預取終止, 用于虛拟存儲和存儲保護 系統模式 sys 運作具有特權的作業系統任務 未定義指令中止模式 und 執行未定義指令時進入
- ARM彙編語言程式結構
- 完整的ARM彙程式設計式
- 處理器架構定義
- .arch 處理器架構
- .fpu 協處理器類型
- .eabi_attribute 接口屬性
- 段定義
- .section
- .rodata
- .text
-
注釋與标号
@
- 彙編器指令
指令 說明 .file 源檔案名 .align 代碼對齊方式 .ascii 聲明字元串 .global 聲明全局符号 .type 指定符号的類型 .size 指定符号的大小 .ident 無實際用途 -
子程式和參數傳遞
.global 函數名
.type 函數名, %function
函數名:
<函數體>
- ARM處理器尋址方式
尋址方式 說明 舉例 立即數尋址 多用于賦初值, 立即數以#作為字首 MOV R0, #1234 寄存器尋址 操作數的值在寄存器中 MOV R0, R1 執行後R0=R1 寄存器移位尋址 操作前對源寄存器進行移位 MOV R0, R1, LSL #2 移位尋址RRX 帶擴充的循環右移 操作數右移一位, 高位用C标志值填充 寄存器間接尋址 寄存器值是操作數的位址指針 LDR R0, [R1] 基址尋址 将位址碼給出的基址寄存器與偏移量相加形成操作數的位址 LDR R0, [R1, #-8] 多寄存器尋址 一條指令最多可以完成16個通用寄存器值的傳送 LDMIA R0, {R1, R2, R3, R4} 堆棧尋址 STMFD SP!, {R1-R7, LR} 将R1-R7 LR入棧, 用于保護現場 塊拷貝尋址 連續位址資料從存儲器某一位置拷貝到另一個位置 LDMIA R0!, {R1-R3}從R0寄存器指向的存儲單元開始取三個字到R1-R3 相對尋址 以PC目前值為基址, 指令中的位址标号作為偏移量, 相加得到操作數位址 - ARM與Thumb指令集
-
指令格式
opcode{cond}{S}{.W|.N} Rd, Rn{, operand2}
opcode為助記符
cond為執行條件
條件碼助記符 标志 含義 EQ Z=1 相等 NE Z=0 不相等 CS/HS C=1 無符号數大于或等于 CC/LO C=0 無符号數小于 MI N=1 負數 PL N=0 正數或0 VS V=1 溢出 VC V=0 沒有溢出 HI C=1, Z=0 無符号數大于 LS C=0, Z=1 無符号數小于或等于 GE N=V 有符号數大于或等于 LT N!=V 有符号數小于 GT Z=0, N=V 符号數大于 LE Z=1, N!=V 有符号數小于或等于 AL 任何 相等 S 指定指令是否影響CPSR的值
.W .N為指令寬度說明符
Rd為目的寄存器
Rn為第一個操作數寄存器
operand2為第二個操作數
- 跳轉指令
助記符 含義 舉例 B{cond} label 簡單的分支指令, 跳轉到指定位址處執行 BNE label BL{cond} label 帶連結的跳轉, 将目前指令的下條指令位址拷貝到LR(R14), 然後跳轉到label處執行, 通常用于子程式調用, 通過MOV PC, LR傳回主程式 BX{cond} Rm 帶狀态切換的跳轉指令, 如果條件滿足, 處理器判斷Rm的位[0]是否為1, 是則将CPSR标志T置位, 并将目标位址處代碼解釋為Thumb代碼, 否則将CPSR的标志T複位, 按ARM方式執行. BLX{cond} Rm 集合了BL和BX的功能 - 存儲器通路指令
- 資料處理指令
- 其他指令
-
- 多媒體程式設計與浮點計算的NEON與VFP指令集