简介

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汇编语言的更多相关文章

  1. 【基于Android的ARM汇编语言系列】之三:ARM汇编语言程序结构

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  2. 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  3. Build opencv libraries for android arm, x86 ubuntu

    废话不多说. 准备工作: 1. 下载源代码: http://opencv.org/ 编译平台:ubuntu14.04 opencv 2.4.6.1 本人用这样的办法编译了opecv 2.4.9 的没有 ...

  4. ARM汇编语言

    ---恢复内容开始--- arm汇编语言 汇编语言是一种程序设计语言,arm处理器是一种16/32位的嵌入式RISC微处理器.一开始我把这混为一谈了.ARM汇编的特点:汇编语言,又叫助记符语言. 1) ...

  5. android ARM 汇编学习 —— hello world

    android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析 adb putty 连上手机,用busybox vi 写一个 hello ...

  6. ARM汇编语言(1)(基本概念)

    1.***.s文件为汇编语言文件格式: 2.ARM寄存器(以Samsung芯片为例) 2.1.要介绍arm寄存器之前我们要先了解一下arm处理器的工作模式: Arm处理器有七种工作模式,为的是形成不同 ...

  7. android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析

    学习 android 逆向分析过程中,需要学习 Arm 指令,不可避免要编写一些 test code 并分析其指令,这是这篇文档的背景. 在目前 android 提供的开发环境里,如果要编写 c / ...

  8. Android ARM指令学习

    在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上 ...

  9. ARM汇编语言基础

    ARM 与 Thumb 寄存器对应关系 PC寄存器: ARM状态为R15,Thumb状态为PC LR寄存器: ARM状态为R14,Thumb状态为LR SP寄存器: ARM状态为R13,Thumb状态 ...

随机推荐

  1. Swift学习笔记十三:继承

    一个类能够继承(inherit)还有一个类的方法(methods),属性(property)和其他特性 一.基本的语法 class Human{ var name :String init(){ na ...

  2. 将表中null值替换成想要的值、查询某一列值为null

    用到ISNULL()函数 例如:SELECT 其他列名,ISNULL(列名,替换值)as 重命名  from 表名 (简单参考:http://www.cnblogs.com/netsa/archive ...

  3. 基于visual Studio2013解决C语言竞赛题之1042字符串比较

          题目 解决代码及点评 /********************************************************************** ...

  4. java layout 表格项增加、删除、修改

    实现的内容为:点击表格某项,再点击删除钮,可实现删除点击表格某项,再点击编辑按钮,可实现内容改变点击添加按钮,可实现向表格中添加内容 总结:总的来说中间遇到了很多困难,但是都一步步的解决了. pack ...

  5. google2013校园招聘笔试题(全国)

    google2013校园招聘笔试题 1. 单项选择题1.1如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少.关于一下几种典型的数据传输速率:1.使用USB2.0闪存盘,往USB闪存盘上拷贝 ...

  6. MVC简单分页

    对Car汽车表分页 实现简单分页,放在这里方便查看回顾,自定义每页几条有点问题,有待完善······ 1.新建mvc项目 2.添加linq to sql 数据库连接 3.添加CarBF类 using ...

  7. QLockFile,QRunInfo

    http://doc.qt.io/qt-5/qlockfile.html http://www.dushibaiyu.com/2014/10/qruninfo-api-smple.html

  8. hdu 3350

    hdu 3350 题意:让你求运算式的结果和运算过程中加法的次数 (a) > (b) ? (a) : (b) 大于取a,小于等于取b MAX( 1 + 2 , 3) 因为(a) > (b) ...

  9. ubuntu12.04 安装 opencv 2.4.8(非源代码编译)

    一:安装所须要的各种库,如GTK3.xx 安装GCC:sudo apt-get install build-essential 安装CMakesudo apt-get install cmake su ...

  10. 深入理解Arrays.sort() (转)

    Arrays.sort(T[], Comparator < ? super T > c) 方法用于对象数组按用户自定义规则排序.官方Java文档只是简要描述此方法的作用,并未进行详细的介绍 ...