android arm
转自:http://blog.csdn.net/banketree/article/details/10995205
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} //<span style="font-family: Arial, Helvetica, sans-serif;">堆栈寻址指令</span>
对应的代码:
- 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
- <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">……</span>
android arm相关推荐
- go 编译 android arm,golang交叉编译
go env检查各项环境变量无误 进入shell环境(Windows为cmd环境),切换到项目工程的源码目录(包含main包的那个目录) 设置好环境变量,关闭CGO(交叉编译不支持所以要关闭),将编译 ...
- 一步一步学ROP之Android ARM 32位篇
蒸米 · 2015/12/17 9:41 0x00 序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术,可以用来绕过现代操作系统的各种 ...
- 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 ...
- Android ARM指令学习
在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上 ...
- android arm 寄存器,ARM汇编
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android Native 进程启动流程 ARM传参,R0-R3传递前四个参数 1. Thumb 指令集特点Thumb ...
- Linux(ARM glibc)使用libhybris调用Android(ARM bionic)
1.安装依赖库 # sudo apt-get install make automake autoconf libtool pkg-config gawk libwayland-devlibegl1- ...
- x86跑android,ARM跑Win,X86跑安卓,为什么两种架构互相“踢馆”?
原标题:ARM跑Win,X86跑安卓,为什么两种架构互相"踢馆"? 最近,Android X86项目终于升级到了Android 11底层,基于安卓的Bliss OS 14也因此让X ...
- 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全
史上最牛的Linux内核学习方法论 点击下载 我的arm_linux移植笔记 点击下载 S3C2440完全开发流程 点击下载 Linux系统命令及其使用详解完整版 点击下载 Linux ...
- 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全...
史上最牛的Linux内核学习方法论 点击下载 我的arm_linux移植笔记 点击下载 S3C2440完全开发流程 点击下载 Linux系统命令及其使用详解完整版 点击下载 Linux主要shell命 ...
最新文章
- Error: Gradle project sync failed. Please fix your project and try again.
- YOLOv5的pytorch模型文件转换为ONNX文件
- Visual Studio无法调试
- 10、Power Query-合并查询与追加查询结合应用
- 13-NSPersistentContainer性能比较
- 维护网络安全要攻防兼备
- 程序员到底该怎么给女朋友挑礼物
- InputStreamReader介绍代码实现
- 浅析row_number()函数【HQL】
- activiti高亮显示图片_第 09 篇:让博客支持 Markdown 语法和代码高亮
- 在.NET Core中使用Channel(一)
- python开发基本流程_第一阶段:Python开发基础 day06 Python基础语法入门--流程控制(二)...
- python复数的实部和虚部都是整数嘛_Python学习笔记:从入门到放弃(2)基本语法...
- [振动力学] 课程考核报告:Matlab 实现邓克利法、瑞利法、里兹法、矩阵迭代法
- 【今日CV 视觉论文速览】21 Nov 2018
- 二叉树的遍历(先序/中序/后序,递归/迭代)与搜索
- php英文书籍在线,php英语四级在线练习系统
- 历史 微信开发者工具_微信开发者工具-微信开发者工具下载 v1.03.2011120官方版--pc6下载站...
- 第二章:上下文无关文法
- vue点击按钮切换样式
热门文章
- Py之utils:utils库的简介、安装、使用方法之详细攻略
- Python:Python多种集成开发环境(IDE,编译器)的简介、安装、入门、使用方法之详细攻略
- ML/DL之预测分析类:利用机器学习算法进行预测分析的简介、分析、代码实现之详细攻略
- DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率
- Computer:MediaPreview的简介、安装、使用方法之详细攻略
- 9.2 mnist_with_summaries tensorboard 可视化展示
- 关于微信支付冲突的问题
- 操作系统-命令解释程序(实验一)
- c++ template笔记(2)模板类
- Tomat6架构探讨(二续)