Android ARM汇编语言
简介
ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌入式处理器的提供商,也可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集。
原生程序与ARM汇编语言
对于使用ARM处理器的Android手机来说,它最终会生成相应的ARM elf可执行文件,分析软件的核心功能只能从这个elf文件入手。
一个ARM原生程序如下:
EXPORT main //main函数
main
var_C= -0xc //识别出的栈变量
var_8 = -8
STMFD SP!,{R11,LR} //指令 压入堆栈
ADD R11,SP,#4
SUB SP,SP,#8
STR R0,[R11,#var_8]
STR R1,[R11,#var_C]
LDR R3,=(aHelloArm - 0x8300)
ADD R3,PC,R3
MOV R0,R3
BL puts
MOV R3,#0
MOV R0,R3
SUB SP,R11,#4
LDMFD SP!,{R11,PC} //堆栈寻址指令
对应的代码:
int main(int argc, char* argv[]){
printf("Hello ARM!\n");
return 0;
}
原生程序的生成过程
1、预处理
2、编译
3、汇编
4、链接
必须了解的ARM知识
1、ARM汇编语言是一门低级语言,它能够与系统的底层打交道,直接访问底层硬件资源。
2、ARM汇编语言与C语言共用同一套原生程序开发的API接口。
3、寄存器是处理器特有的高速存贮部件,它们可用来暂存指令、数据和地址。ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,
6个为状态寄存器。ARM处理器支持七种运行模式,它们分别为:用户模式、快速中断模式、外部中断模式、管理模式、数据访问终止模式、
系统模式、未定义指令中止模式。
指令格式
ARM指令的基本格式如下:
<opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}
opcode为指令助记符,cond为执行条件。
跳转指令
1、B跳转指令
B{cond} label 简单的分支指令
2、BL带链接的跳转指令
BL{cond} label
3、BX带状态切换的跳转指令
BX{cond} Rm
4、BLX带链接和状态切换的跳转指令
BLX{cond} Rm
存储器访问指令
LDR 用于从存储器中加载数据到寄存器中。它的格式如下:
LDR{type}{cond} Rd,label
LDRD{cond} Rd,Rd2,label
STR用于存储数据到指定地址的存储单元中。它的格式如下:
STR{type}{cond} Rd,label
STRD{cond} Rd,Rd2,label
LDM 从指定的存储单元加载多个数据到一个寄存器列表。它的格式如下:
LDM{addr_mode}{cond} Rn{!} reglist
STM 将一个寄存器列表的数据存储到指定的存储单元。它的格式如下:
STM{addr_mode}{cond} Rn{!} reglist
PUSH 将寄存器推入满递减堆栈。它的格式如下:
PUSH {cond} reglist
POP 从满递减堆栈中弹出数据到寄存器。它的格式如下:
POP {cond} reglist
SWP 用于寄存器与存储器之间的数据交换。它的格式如下:
SWP{B}{cond} Rd,Rm,[Rn]
数据处理指令
MOV 将8位的立即数或寄存器的内容传送到目标寄存器中。它的格式如下:
MOV {cond}{S}Rd,operand2
MVN 数据非传送指令。它的格式如下:
MVN {cond}{S}Rd,operand2
ADD 加法指令。它的格式如下:
ADD{cond}{S}Rd,Rn,operand2
ADC 带进位加法指令。它的格式如下:
ADC{cond}{S}Rd,Rn,operand2
SUB 减法指令。它的格式如下:
SUB{cond}{S}Rd,Rn,operand2
RSB 逆向减法指令。它的格式如下:
RSB{cond}{S}Rd,Rn,operand2
SBC 带进位减法指令。它的格式如下:
SBC{cond}{S}Rd,Rn,operand2
RSC 带进位逆向减法指令。它的格式如下:
RSC {cond}{S}Rd,Rn,operand2
MUL 32位乘法指令。它的格式如下:
MUL {cond}{S}Rd,Rm,Rn
MLS 将Rm寄存器和Rn寄存器中的值相乘,然后再从Ra寄存器的值中减去乘积,最后将所得结果的低32位存入Rd寄存器中。它的格式如下:
MLS {cond}{S} Rd,Rm,Rn,Ra
MLA 将Rm寄存器和Rn寄存器中的值相乘,然后再将乘积与Ra寄存器中的值想家,最后将所得结果的低32位存入Rd寄存器中。它的格式如下:
MLA {cond}{S} Rd,Rm,Rn,Ra
UMULL 64 位无符号乘法指令。指令将Rm 和Rs 中的值作无符号数相乘,结果的低32 位保存到RsLo 中,而高32 位保存到RdHi 中。指令格式如下:
UMULL{cond}{S} RdLo,RdHi,Rm,Rs UMULL 指令举例如下:
UMULL R0,R1,R5,R8 ;(R1、R0)=R5×R8
UMLAL 64 位无符号乘加指令。指令将Rm 和Rs 中的值作无符号数相乘,64 位乘积与RdHi、RdLo 相加,结果的低32 位保存到RdLo 中,而高32 位保
存到RdHi 中。
指令格式如下:
UMLAL{cond}{S} RdLo,RdHi,Rm,Rs UMLAL 指令举例如下:
UMLAL R0,R1,R5,R8 ;(R1,R0)=R5×R8+(R1,R0)
SMULL 64 位有符号乘法指令。指令将Rm 和Rs 中的值作有符号数相乘,结果的低32 位保存到RdLo 中,而高32 位保存到RdHi 中。指令格式如下:
SMULL{cond}{S} RdLo,RdHi,Rm,Rs SMULL 指令举例如下:
SMULL R2,R3,R7,R6 ;(R3,R2)=R7×R6
SMLAL 64 位有符号乘加指令。指令将Rm 和Rs 中的值作有符号数相乘,64 位乘积与RdHi、RdLo,相加,结果的低32 位保存到RdLo 中,而高32 位保
存到RdHi 中。
指令格式如下:
SMLAL{cond}{S} RdLo,RdHi,Rm,Rs
SMLAL 指令举例如下:
SMLAL R2,R3,R7,R6 ;(R3,R2)=R7×R6+(R3,R2)
SMLAD 将Rm寄存器的低半字和Rn寄存器的低半字相乘,然后将Rm寄存器的高半字和Rn的高半字相乘,最后将两个乘积与Ra寄存器的值相加并存入Rd寄存器。它的格式如下:
SMLAD{cond}{S}Rd,Rm,Rn,Ra
SDIV 有符号数除法指令。它的格式如下:
SDIV{cond} Rd,Rm,Rn
UDIV 无符号数除法指令。它的格式如下:
UDIV{cond} Rd,Rm,Rn
ASR 算术右移指令。它的格式如下:
ASR{cond} Rd,Rm,operader2
AND 逻辑与指令。它的格式如下:
AND{cond} Rd,Rm,operader2
ORR 逻辑或指令。它的格式如下:
ORR{cond} Rd,Rm,operader2
EOR 异或指令。它的格式如下:
EOR {cond} Rd,Rm,operader2
BIC 位清除指令。它的格式如下:
BIC {cond} Rd,Rm,operader2
LSL 逻辑左移指令。它的格式如下:
LSL {cond} Rd,Rm,operader2
……
小结
了解了ARM处理器完整的指令集,为进一步破解Android又打下了一个基础。
下载
Android ARM汇编语言的更多相关文章
- 【基于Android的ARM汇编语言系列】之三:ARM汇编语言程序结构
作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...
- 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集
作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...
- Build opencv libraries for android arm, x86 ubuntu
废话不多说. 准备工作: 1. 下载源代码: http://opencv.org/ 编译平台:ubuntu14.04 opencv 2.4.6.1 本人用这样的办法编译了opecv 2.4.9 的没有 ...
- ARM汇编语言
---恢复内容开始--- arm汇编语言 汇编语言是一种程序设计语言,arm处理器是一种16/32位的嵌入式RISC微处理器.一开始我把这混为一谈了.ARM汇编的特点:汇编语言,又叫助记符语言. 1) ...
- android ARM 汇编学习 —— hello world
android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析 adb putty 连上手机,用busybox vi 写一个 hello ...
- ARM汇编语言(1)(基本概念)
1.***.s文件为汇编语言文件格式: 2.ARM寄存器(以Samsung芯片为例) 2.1.要介绍arm寄存器之前我们要先了解一下arm处理器的工作模式: Arm处理器有七种工作模式,为的是形成不同 ...
- android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析
学习 android 逆向分析过程中,需要学习 Arm 指令,不可避免要编写一些 test code 并分析其指令,这是这篇文档的背景. 在目前 android 提供的开发环境里,如果要编写 c / ...
- Android ARM指令学习
在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上 ...
- ARM汇编语言基础
ARM 与 Thumb 寄存器对应关系 PC寄存器: ARM状态为R15,Thumb状态为PC LR寄存器: ARM状态为R14,Thumb状态为LR SP寄存器: ARM状态为R13,Thumb状态 ...
随机推荐
- HTTP协议--状态码
HTTP状态码负责表示客户端HTTP请求返回的结果.标记服务器端的处理是否正常.通知出现的错误等工作. 常用状态码共分5大类: 1XX:Informational,信息性状态码,接收的请求正在处理. ...
- use EXPORT和use EXPORT_OK
我不明白 use EXPORT和use EXPORT_OK的区别,大多数资料提到了一些: @Export 允许 导出模块的函数和变量到用户的名字空间使用标准的导入方法. 这种方式,我们不需要创建模块的 ...
- Cppcheck 1.54 C/C++静态代码分析工具
Cppcheck是一个C/C++代码分析工具,只检测那些编译器通常无法检测到的bug类型. 官方上建议让编译器提供尽量多的警告提示:1.使用Visual C++的话,应使用警告等级4 2.使用GC ...
- hdu2489 Minimal Ratio Tree
hdu2489 Minimal Ratio Tree 题意:一个 至多 n=15 的 完全图 ,求 含有 m 个节点的树 使 边权和 除 点权和 最小 题解:枚举 m 个 点 ,然后 求 最小生成树 ...
- CentOS 6.4 + 曙光DS200 IPSan组建FTP服务器
CentOS 6.4 + 曙光DS200 IPSan组建FTP服务器 http://write.blog.csdn.net/postedit/10911105#本系列文章由ex_net(张建波)编写, ...
- Xcode4.6 自制iOS可用的 Framework
First of all:新建一个空白project. File->New->Project 然后新建两个文件 File->New->File 如图 然后选择targets ...
- 中转server
中转传输概要设计 中转传输的消息架构为模拟MFC的消息架构,请參考我的上一篇文章. 1. 概述 中转server採用事件驱动的方式,与socket结合.其层次例如以下: 在事件驱动层中,将相关消息发送 ...
- FMX对象释放
今天盒子中有朋友遇到对象释放的问题,原文在这里,他的实现大意是建立一个TmyLayout = class(TLayout),然后在这个类中画线,Form对象调用实例化这个类来画线,然后释放掉这个对象, ...
- TODO管理工具TaskWarrior (跨平台C++代码)
Taskwarrior 是一个基于命令行的 TODO 列表管理工具.主要功能包括:标签.彩色表格输出.报表和图形.大量的命令.底层API.多用户文件锁等功能. http://www.oschina.n ...
- C#中Base64之编码,解码方法
原文:C#中Base64之编码,解码方法 1.base64 to string string strPath = "aHR0cDovLzIwMy44MS4yOS40Njo1NTU3L1 ...