android arm
轉自:http://blog.csdn.net/banketree/article/details/10995205
ARM是Advanced RISC Machine的首字母縮寫,它可以稱之為一家嵌入式處理器的提供商,也可以理解為一種處理器的架構,還可以將它作為一套完整的處理器指令集。
原生程序與ARM匯編語言
對于使用ARM處理器的Android手機來說,它最終會生成相應的ARM elf可執行文件,分析軟件的核心功能只能從這個elf文件入手。
一個ARM原生程序如下:
[java]?view plaincopy
對應的代碼:
[java]?view plaincopy
原生程序的生成過程
1、預處理
2、編譯
3、匯編
4、鏈接
必須了解的ARM知識
1、ARM匯編語言是一門低級語言,它能夠與系統的底層打交道,直接訪問底層硬件資源。
2、ARM匯編語言與C語言共用同一套原生程序開發的API接口。
3、寄存器是處理器特有的高速存貯部件,它們可用來暫存指令、數據和地址。ARM微處理器共有37個32位寄存器,其中31個為通用寄存器,
6個為狀態寄存器。ARM處理器支持七種運行模式,它們分別為:用戶模式、快速中斷模式、外部中斷模式、管理模式、數據訪問終止模式、
系統模式、未定義指令中止模式。
指令格式
ARM指令的基本格式如下:
[java]?view plaincopy
跳轉指令
1、B跳轉指令
[java]?view plaincopy
2、BL帶鏈接的跳轉指令
[java]?view plaincopy
3、BX帶狀態切換的跳轉指令
[java]?view plaincopy
4、BLX帶鏈接和狀態切換的跳轉指令
[java]?view plaincopy
LDR 用于從存儲器中加載數據到寄存器中。它的格式如下:
[java]?view plaincopy
STR用于存儲數據到指定地址的存儲單元中。它的格式如下:
[java]?view plaincopy
LDM 從指定的存儲單元加載多個數據到一個寄存器列表。它的格式如下:
[java]?view plaincopy
STM 將一個寄存器列表的數據存儲到指定的存儲單元。它的格式如下:
[java]?view plaincopy
PUSH 將寄存器推入滿遞減堆棧。它的格式如下:
[java]?view plaincopy
POP 從滿遞減堆棧中彈出數據到寄存器。它的格式如下:
[java]?view plaincopy
SWP 用于寄存器與存儲器之間的數據交換。它的格式如下:
[java]?view plaincopy
數據處理指令
MOV 將8位的立即數或寄存器的內容傳送到目標寄存器中。它的格式如下:
[java]?view plaincopy
MVN 數據非傳送指令。它的格式如下:
[java]?view plaincopy
ADD 加法指令。它的格式如下:
[java]?view plaincopy
ADC 帶進位加法指令。它的格式如下:
[java]?view plaincopy
SUB 減法指令。它的格式如下:
[java]?view plaincopy
RSB 逆向減法指令。它的格式如下:
[java]?view plaincopy
SBC 帶進位減法指令。它的格式如下:
[java]?view plaincopy
RSC 帶進位逆向減法指令。它的格式如下:
[java]?view plaincopy
MUL 32位乘法指令。它的格式如下:
[java]?view plaincopy
MLS 將Rm寄存器和Rn寄存器中的值相乘,然后再從Ra寄存器的值中減去乘積,最后將所得結果的低32位存入Rd寄存器中。它的格式如下:
[java]?view plaincopy
MLA ?將Rm寄存器和Rn寄存器中的值相乘,然后再將乘積與Ra寄存器中的值想家,最后將所得結果的低32位存入Rd寄存器中。它的格式如下:
[java]?view plaincopy
UMULL?64 位無符號乘法指令。指令將Rm 和Rs 中的值作無符號數相乘,結果的低32 位保存到RsLo 中,而高32 位保存到RdHi 中。指令格式如下:
[java]?view plaincopy
UMLAL ?64 位無符號乘加指令。指令將Rm 和Rs 中的值作無符號數相乘,64 位乘積與RdHi、RdLo 相加,結果的低32 位保存到RdLo 中,而高32 位保 存到RdHi 中。
指令格式如下:
[java]?view plaincopySMULL ?64 位有符號乘法指令。指令將Rm 和Rs 中的值作有符號數相乘,結果的低32 位保存到RdLo 中,而高32 位保存到RdHi 中。指令格式如下:
[java]?view plaincopy
SMLAL 64 位有符號乘加指令。指令將Rm 和Rs 中的值作有符號數相乘,64 位乘積與RdHi、RdLo,相加,結果的低32 位保存到RdLo 中,而高32 位保 存到RdHi 中。
指令格式如下:
[java]?view plaincopy
SMLAD 將Rm寄存器的低半字和Rn寄存器的低半字相乘,然后將Rm寄存器的高半字和Rn的高半字相乘,最后將兩個乘積與Ra寄存器的值相加并存入Rd寄存器。它的格式如下:
[java]?view plaincopy
[java]?view plaincopy
UDIV 無符號數除法指令。它的格式如下:
[java]?view plaincopy
ASR 算術右移指令。它的格式如下:
[java]?view plaincopy
AND 邏輯與指令。它的格式如下:
[java]?view plaincopy
ORR 邏輯或指令。它的格式如下:
[java]?view plaincopy
EOR 異或指令。它的格式如下:
[java]?view plaincopy
BIC 位清除指令。它的格式如下:
[java]?view plaincopy
LSL 邏輯左移指令。它的格式如下:
[java]?view plaincopy
總結
以上是生活随笔為你收集整理的android arm的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 静态分析android代码, 循环与tr
- 下一篇: 动态调试android, ddmsida