转自:http://blog.csdn.net/banketree/article/details/10995205

ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌入式处理器的提供商,也可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集。

原生程序与ARM汇编语言

对于使用ARM处理器的Android手机来说,它最终会生成相应的ARM elf可执行文件,分析软件的核心功能只能从这个elf文件入手。

一个ARM原生程序如下:

[java] view plaincopy
  1. EXPORT main  //main函数
  2. main
  3. var_C= -0xc     //识别出的栈变量
  4. var_8 = -8
  5. STMFD SP!,{R11,LR}   //指令  压入堆栈
  6. ADD R11,SP,#4
  7. SUB SP,SP,#8
  8. STR R0,[R11,#var_8]
  9. STR R1,[R11,#var_C]
  10. LDR R3,=(aHelloArm - 0x8300)
  11. ADD R3,PC,R3
  12. MOV R0,R3
  13. BL puts
  14. MOV R3,#0
  15. MOV R0,R3
  16. SUB SP,R11,#4
  17. LDMFD SP!,{R11,PC}  //<span style="font-family: Arial, Helvetica, sans-serif;">堆栈寻址指令</span>

对应的代码:

[java] view plaincopy
  1. int main(int argc, char* argv[]){
  2. printf("Hello ARM!\n");
  3. return 0;
  4. }
原生程序的生成过程

1、预处理

2、编译

3、汇编

4、链接

必须了解的ARM知识

1、ARM汇编语言是一门低级语言,它能够与系统的底层打交道,直接访问底层硬件资源。

2、ARM汇编语言与C语言共用同一套原生程序开发的API接口。

3、寄存器是处理器特有的高速存贮部件,它们可用来暂存指令、数据和地址。ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,

6个为状态寄存器。ARM处理器支持七种运行模式,它们分别为:用户模式、快速中断模式、外部中断模式、管理模式、数据访问终止模式、

系统模式、未定义指令中止模式。

指令格式

ARM指令的基本格式如下:

[java] view plaincopy
  1. <opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}
  2. opcode为指令助记符,cond为执行条件。

跳转指令

1、B跳转指令

[java] view plaincopy
  1. B{cond} label   简单的分支指令

2、BL带链接的跳转指令

[java] view plaincopy
  1. BL{cond} label

3、BX带状态切换的跳转指令

[java] view plaincopy
  1. BX{cond} Rm

4、BLX带链接和状态切换的跳转指令

[java] view plaincopy
  1. BLX{cond} Rm

存储器访问指令

LDR 用于从存储器中加载数据到寄存器中。它的格式如下:

[java] view plaincopy
  1. LDR{type}{cond} Rd,label
  2. LDRD{cond} Rd,Rd2,label

STR用于存储数据到指定地址的存储单元中。它的格式如下:

[java] view plaincopy
  1. STR{type}{cond} Rd,label
  2. STRD{cond} Rd,Rd2,label

LDM 从指定的存储单元加载多个数据到一个寄存器列表。它的格式如下:

[java] view plaincopy
  1. LDM{addr_mode}{cond} Rn{!} reglist

STM 将一个寄存器列表的数据存储到指定的存储单元。它的格式如下:

[java] view plaincopy
  1. STM{addr_mode}{cond} Rn{!} reglist

PUSH 将寄存器推入满递减堆栈。它的格式如下:

[java] view plaincopy
  1. PUSH {cond} reglist

POP 从满递减堆栈中弹出数据到寄存器。它的格式如下:

[java] view plaincopy
  1. POP {cond} reglist

SWP 用于寄存器与存储器之间的数据交换。它的格式如下:

[java] view plaincopy
  1. SWP{B}{cond} Rd,Rm,[Rn]
数据处理指令

MOV 将8位的立即数或寄存器的内容传送到目标寄存器中。它的格式如下:

[java] view plaincopy
  1. MOV {cond}{S}Rd,operand2

MVN 数据非传送指令。它的格式如下:

[java] view plaincopy
  1. MVN {cond}{S}Rd,operand2

ADD 加法指令。它的格式如下:

[java] view plaincopy
  1. ADD{cond}{S}Rd,Rn,operand2

ADC 带进位加法指令。它的格式如下:

[java] view plaincopy
  1. ADC{cond}{S}Rd,Rn,operand2

SUB 减法指令。它的格式如下:

[java] view plaincopy
  1. SUB{cond}{S}Rd,Rn,operand2

RSB 逆向减法指令。它的格式如下:

[java] view plaincopy
  1. RSB{cond}{S}Rd,Rn,operand2

SBC 带进位减法指令。它的格式如下:

[java] view plaincopy
  1. SBC{cond}{S}Rd,Rn,operand2

RSC 带进位逆向减法指令。它的格式如下:

[java] view plaincopy
  1. RSC {cond}{S}Rd,Rn,operand2

MUL 32位乘法指令。它的格式如下:

[java] view plaincopy
  1. MUL {cond}{S}Rd,Rm,Rn

MLS 将Rm寄存器和Rn寄存器中的值相乘,然后再从Ra寄存器的值中减去乘积,最后将所得结果的低32位存入Rd寄存器中。它的格式如下:

[java] view plaincopy
  1. MLS {cond}{S} Rd,Rm,Rn,Ra

MLA  将Rm寄存器和Rn寄存器中的值相乘,然后再将乘积与Ra寄存器中的值想家,最后将所得结果的低32位存入Rd寄存器中。它的格式如下:

[java] view plaincopy
  1. MLA {cond}{S} Rd,Rm,Rn,Ra

UMULL 64 位无符号乘法指令。指令将Rm 和Rs 中的值作无符号数相乘,结果的低32 位保存到RsLo 中,而高32 位保存到RdHi 中。指令格式如下:

[java] view plaincopy
  1. UMULL{cond}{S} RdLo,RdHi,Rm,Rs
  2. UMULL 指令举例如下:
  3. UMULL R0,R1,R5,R8 ;(R1、R0)=R5×R8

UMLAL  64 位无符号乘加指令。指令将Rm 和Rs 中的值作无符号数相乘,64 位乘积与RdHi、RdLo 相加,结果的低32 位保存到RdLo 中,而高32 位保 存到RdHi 中。

指令格式如下:

[java] view plaincopy
  1. UMLAL{cond}{S} RdLo,RdHi,Rm,Rs
  2. UMLAL 指令举例如下:
  3. UMLAL R0,R1,R5,R8 ;(R1,R0)=R5×R8+(R1,R0)

SMULL  64 位有符号乘法指令。指令将Rm 和Rs 中的值作有符号数相乘,结果的低32 位保存到RdLo 中,而高32 位保存到RdHi 中。指令格式如下:

[java] view plaincopy
  1. SMULL{cond}{S} RdLo,RdHi,Rm,Rs
  2. SMULL 指令举例如下:
  3. SMULL R2,R3,R7,R6 ;(R3,R2)=R7×R6

SMLAL 64 位有符号乘加指令。指令将Rm 和Rs 中的值作有符号数相乘,64 位乘积与RdHi、RdLo,相加,结果的低32 位保存到RdLo 中,而高32 位保 存到RdHi 中。

指令格式如下:

[java] view plaincopy
  1. SMLAL{cond}{S} RdLo,RdHi,Rm,Rs
  2. SMLAL 指令举例如下:
  3. SMLAL R2,R3,R7,R6 ;(R3,R2)=R7×R6+(R3,R2)

SMLAD 将Rm寄存器的低半字和Rn寄存器的低半字相乘,然后将Rm寄存器的高半字和Rn的高半字相乘,最后将两个乘积与Ra寄存器的值相加并存入Rd寄存器。它的格式如下:

[java] view plaincopy
  1. SMLAD{cond}{S}Rd,Rm,Rn,Ra

SDIV 有符号数除法指令。它的格式如下:

[java] view plaincopy
  1. SDIV{cond} Rd,Rm,Rn

UDIV 无符号数除法指令。它的格式如下:

[java] view plaincopy
  1. UDIV{cond} Rd,Rm,Rn

ASR 算术右移指令。它的格式如下:

[java] view plaincopy
  1. ASR{cond} Rd,Rm,operader2

AND 逻辑与指令。它的格式如下:

[java] view plaincopy
  1. AND{cond} Rd,Rm,operader2

ORR 逻辑或指令。它的格式如下:

[java] view plaincopy
  1. ORR{cond} Rd,Rm,operader2

EOR 异或指令。它的格式如下:

[java] view plaincopy
  1. EOR {cond} Rd,Rm,operader2

BIC 位清除指令。它的格式如下:

[java] view plaincopy
  1. BIC {cond} Rd,Rm,operader2

LSL 逻辑左移指令。它的格式如下:

[java] view plaincopy
  1. LSL {cond} Rd,Rm,operader2
[java] view plaincopy
  1. <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">……</span>

android arm相关推荐

  1. go 编译 android arm,golang交叉编译

    go env检查各项环境变量无误 进入shell环境(Windows为cmd环境),切换到项目工程的源码目录(包含main包的那个目录) 设置好环境变量,关闭CGO(交叉编译不支持所以要关闭),将编译 ...

  2. 一步一步学ROP之Android ARM 32位篇

    蒸米 · 2015/12/17 9:41 0x00 序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术,可以用来绕过现代操作系统的各种 ...

  3. vs2015 支持Android arm neon Introducing Visual Studio’s Emulator for Android

    visual studio 2015支持Android开发了. Microsoft released Visual Studio 2015 Preview this week and with it ...

  4. Android ARM指令学习

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

  5. android arm 寄存器,ARM汇编

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android Native 进程启动流程 ARM传参,R0-R3传递前四个参数 1. Thumb 指令集特点Thumb ...

  6. Linux(ARM glibc)使用libhybris调用Android(ARM bionic)

    1.安装依赖库 # sudo apt-get install make automake autoconf libtool pkg-config gawk libwayland-devlibegl1- ...

  7. x86跑android,ARM跑Win,X86跑安卓,为什么两种架构互相“踢馆”?

    原标题:ARM跑Win,X86跑安卓,为什么两种架构互相"踢馆"? 最近,Android X86项目终于升级到了Android 11底层,基于安卓的Bliss OS 14也因此让X ...

  8. 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全

    史上最牛的Linux内核学习方法论   点击下载 我的arm_linux移植笔记   点击下载 S3C2440完全开发流程   点击下载 Linux系统命令及其使用详解完整版   点击下载 Linux ...

  9. 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全...

    史上最牛的Linux内核学习方法论 点击下载 我的arm_linux移植笔记 点击下载 S3C2440完全开发流程 点击下载 Linux系统命令及其使用详解完整版 点击下载 Linux主要shell命 ...

最新文章

  1. Error: Gradle project sync failed. Please fix your project and try again.
  2. YOLOv5的pytorch模型文件转换为ONNX文件
  3. Visual Studio无法调试
  4. 10、Power Query-合并查询与追加查询结合应用
  5. 13-NSPersistentContainer性能比较
  6. 维护网络安全要攻防兼备
  7. 程序员到底该怎么给女朋友挑礼物
  8. InputStreamReader介绍代码实现
  9. 浅析row_number()函数【HQL】
  10. activiti高亮显示图片_第 09 篇:让博客支持 Markdown 语法和代码高亮
  11. 在.NET Core中使用Channel(一)
  12. python开发基本流程_第一阶段:Python开发基础 day06  Python基础语法入门--流程控制(二)...
  13. python复数的实部和虚部都是整数嘛_Python学习笔记:从入门到放弃(2)基本语法...
  14. [振动力学] 课程考核报告:Matlab 实现邓克利法、瑞利法、里兹法、矩阵迭代法
  15. 【今日CV 视觉论文速览】21 Nov 2018
  16. 二叉树的遍历(先序/中序/后序,递归/迭代)与搜索
  17. php英文书籍在线,php英语四级在线练习系统
  18. 历史 微信开发者工具_微信开发者工具-微信开发者工具下载 v1.03.2011120官方版--pc6下载站...
  19. 第二章:上下文无关文法
  20. vue点击按钮切换样式

热门文章

  1. Py之utils:utils库的简介、安装、使用方法之详细攻略
  2. Python:Python多种集成开发环境(IDE,编译器)的简介、安装、入门、使用方法之详细攻略
  3. ML/DL之预测分析类:利用机器学习算法进行预测分析的简介、分析、代码实现之详细攻略
  4. DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率
  5. Computer:MediaPreview的简介、安装、使用方法之详细攻略
  6. 9.2 mnist_with_summaries tensorboard 可视化展示
  7. 关于微信支付冲突的问题
  8. 操作系统-命令解释程序(实验一)
  9. c++ template笔记(2)模板类
  10. Tomat6架构探讨(二续)