简介

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. android4.0蓝牙使能的详细解析 (转载)

    此博客是转载过来的哦... 给自己博客定几个部分: (1)写在前面的话:一些写博客时的废话. (2)内容简介:把文章的主要内容或者核心部分作一个框架性的概括,以方便大家阅读. (3)正文:这个不需要解 ...

  2. Android面试题收集(有具体答案)

    Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每个Android应用程序都在它自己的进程中执行,都 ...

  3. Web端server推送技术原理分析及dwr框架简单的使用

    1 背景 "server推送技术"(ServerPushing)是近期Web技术中最热门的一个流行术语.它是继"Ajax"之后又一个倍受追捧的Web技术.&qu ...

  4. 体验魅力Cognos BI 10 系列,第1 部分: 第一次安装

    体验魅力Cognos BI 10 系列,第1 部分: 第一次安装吴敏达, 信息管理软件高级技术顾问, IBM简介: 本系列教程旨在帮助您通过实际动手掌握Cognos BI 10.1 的主要功能.在这一 ...

  5. js模板引擎--artTemplate

    js模板引擎--artTemplate 以前研究过一段时间的handlebars,但因为其渲染性能略逊于腾讯的artTemplate(在artTemplate的GitHub官网上有推荐的性能测试地址) ...

  6. 用DELPHI的RTTI实现数据集的简单对象化

    在<强大的DELPHI RTTI--兼谈需要了解多种开发语言>一文中,我说了一下我用DELPHI的RTTI实现了数据集的简单对象化.本文将详细介绍一下我的实现方法.     首先从一个简单 ...

  7. axure网格设置

    Axure默认的界面是没有吧网格显示出来,没有网格在制作原型的时候,对齐方面不是很好,个人习惯还是把网格显示出来,便于组件对齐和布局. 其实本来这篇文章应该叫做网格与参考线,只是本人对参考线的应用还很 ...

  8. 基于visual Studio2013解决C语言竞赛题之1092链表转换

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

  9. 【Demo 0009】Android 组件(BroadcastReceiver)

    本章学习要点:        1.  了解Broadcast的作用;        2.  掌握自定义广播和系统广播的接收:        3.  掌握广播的发送:

  10. Kendo UI开发教程(20): Kendo MVVM 数据绑定(九) Text

    Text绑定可以使用ViewModel来设置DOM元素的文本属性,如果需要设置input,textarea,或select的显示,需要使用value属性. 1 <span data-bind=& ...