指令&指令格式

31-28 27-20 19-16 15-12 11-0
cond opcode Rn Rd Op2

<opcode> {<cond>} {s} <Rd>,<Rn>{,<operand2>}

例如:

ADDEQS R0,R1,#0x8;

备注: <>内的项是必须的,{}内的项是可选的

ARM指令分类

分类:

  • 数据处理指令
  • 数据加载/存储指令
  • 分支(跳转)指令
  • 程序状态寄存器指令
  • 协处理器指令
  • 异常产生指令

常见指令:

指令条件后缀

条件后缀影响指令是否执行,不影响指令内容和寄存器内容

编码 后缀助记符 标志位 定义
0000 EQ Z=1 相等
0001 NE Z=0 不相等
0010 CS C=1 无符号大于或者等于
0011 CC C=0 无符号小于
0100 MI N=1 负值
0101 PL N=0 正值或0
0110 VS V=1 溢出
0111 VC V=0 无溢出
1000 HI C=1且Z=0 无符号大于
1001 LS C=0或Z=1 无符号小于或等于
1010 GE N和V相同 有符号大于或等于
1011 LT N和V不同 有符号小于
1100 GT Z=0且N等于V 有符号大于
1101 LE Z=1或N不等于V 有符号小于或等于
1110 AL 无条件 无条件

指令可选后缀

S

S:是否影响CPSR寄存器的值

例如:

R0 = 0x1 ,R3 = 0x3 ,CPSR = nzcvqIFt_SVC

SUB R1,R0,R3 ;R0的值减去R3的值,结果存入R1

SUBS R1,R0,R3 ;R0的值减去R3的值,结果存入R1,影响标识位

!

!: 是否影响基址寄存器的值

例如:

LDR R3,[R0,#4]

LDR R3,[R0,#4]!

寻址方式

  • 立即数寻址

    • MOV R1,#0x1
  • 寄存器寻址
    • MOV R1,R2
  • 寄存器间接寻址
    • LDR R1,[R2]
  • 寄存器移位寻址
    • MOV R0,R1,LSL,#1
  • 基址变址寻址
    • LDR R1,[R2,#4]
  • 相对寻址
    • BL sub_1234
  • 多寄存器寻址
    • LDMIA R0!,{R1-R4}
  • 堆栈寻址
    • STMFD R13!,{R0-R4}

数据加载/存储指令

LDR/STR

地址索引

  • 前索引

    • LDR R0,[R4,#0x4]
    • R4+0x4的地址数据加载到R0,R4不变
  • 后索引
    • LDR R0,[R4],#0x4
    • R4的地址数据加载到R0,R4改变,R4 = R4 + 0x4
  • 自动索引
    • LDR R0,[R4,#0x4]!
    • R4+0x4的地址数据加载到R0,R4改变,R4 = R4 + 0x4

  • 满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA,STMFA等。
  • 空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA,STMEA等。
  • 满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD,STMFD等。
  • 空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED,STMED等。
寻址方式 说明 POP LDM PUSH STM
FA 递增满 LDMFA LDMDA STMFA STMIB
FD 递减满 LDMFD LDMIA STMFD STMDB
EA 递增空 LDMEA LDMDB STMEA STMIA
ED 递减空 LDMED LDMIB STMED STMDA

Android逆向系列之ARM语法篇相关推荐

  1. 移动安全Android逆向系列:Dalvik概念破解实例

    本篇文章是Android逆向系列的第三篇,开始介绍Dalvik虚拟机的相关知识,认识dex和smali文件格式和熟悉Dalvik字节码及指令集,对Dalvik指令集有个大概的了解就可以开始简单的反编译 ...

  2. Android逆向系列--JDWP协议

    Android逆向系列--JDWP协议 背景 简介 使用 源码调用 参考 背景 经常会遇到各种各样需要使用jdwp知识的场景,比如调试Java源码.比如抓帧等等,这些关联知识点通常都会极其复杂,如果不 ...

  3. 【原创】【2021 android逆向系列】2:MIUI安装xposed问题全览(从本人简书博客移入)

    书接上文[原创][android逆向系列]1:真机(小米note 3)root,本文和大家说一说MIUI安装xposed爬过的坑,以及如何安装xposed~ 一.xposed基础知识: xposed ...

  4. Android逆向系列(一):初探Android逆向

    这段时间因为某些业务驱动,开始研究一些逆向相关的东西,浏览了下其所包含的大致内容,发现真是一个新大陆,跟之前耳听目染过的一些门面介绍完全不是一个层级的,真正的印证了下手难这一说法. 谨此以本文开始记录 ...

  5. android逆向安全技术大全,Android逆向系列(一):初探Android逆向

    这段时间因为某些业务驱动,开始研究一些逆向相关的东西,浏览了下其所包含的大致内容,发现真是一个新大陆,跟之前耳听目染过的一些门面介绍完全不是一个层级的,真正的印证了下手难这一说法. 谨此以本文开始记录 ...

  6. Android逆向入门7——Smali语法学习(1)

    这一节我们一起探讨smali语法和smali在Android逆向中的应用,它是Android逆向世界中不可或缺的一部分. 简单的来说,Dex反编译的结果就是Smali,Smali和dex之间的关系,我 ...

  7. Android APM 系列一(原理篇)

    图片来自 https://unsplash.com 一. 前言 性能问题是导致 App 用户流失的罪魁祸首之一,如果用户在使用我们 App 的时候遇到诸如页面卡顿.响应速度慢.发热严重.流量电量消耗大 ...

  8. Android 3D系列之基本概念篇

    为了提高性能,通常还需要将浮点数组存入一个字节缓冲中.所以有了下面的操作: ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4 ...

  9. android逆向分析之smali语法

    一 .smali数据类型 1.Dalvik字节码 Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个连续的寄存器表示: Dalvik字节码有两种类型 ...

最新文章

  1. ECS控制台使用小贴士
  2. muduo之Connector
  3. android手机编译可运行的linux程序
  4. SmartPDA图片
  5. RSA公钥文件(PEM)解析
  6. 数据分析转软件测试,(转)性能测试用户模型(三):基础数据分析、场景数据...
  7. 差分电荷密度怎么画_科学网差分电荷密度图、电荷局域密度图(ELF)的画
  8. Unity面试题精选(2)
  9. 代码重构(四):条件表达式重构规则
  10. [label][paypal] Paypal 支付页面的语言显示问题
  11. Spring学习之路——简单入门HelloWorld
  12. 树莓派 - 蓝牙 (1) 试试Beacon
  13. Selenium2+python自动化6-八种元素元素定位(Firebug和firepath)
  14. H5页面原生gps 定位获取经纬度
  15. 美团饿了么外卖返利CPS公众号小程序话费加油团购源码淘客APP
  16. 删除右键菜单中的 “上传到wps云文档”
  17. 新猿木子李:0基础学python培训教程 python下载文件的多种方法汇总
  18. svn 提交仍处于树冲突 One or more files are in a conflicted state
  19. Java小技巧输出26个英文字母,不用一个一个手打
  20. 将NX,JT, step等一些常见3维格式文件直接发布到网页上,可在线浏览

热门文章

  1. list 查找_趣味图解算法之二分查找
  2. Python对图像进行二维Gabor滤波加速
  3. 考研初试将近,收好这份准备清单,祝你一战成硕
  4. PHP依赖管理工具Composer配置安装及基本使用
  5. 本地函数定义是非法的_使用函数计算三步实现深度学习 AI 推理在线服务
  6. risc-v 编译 linux,linux - 如何为RISC-V编译Linux Kernel 4.20 - 堆栈内存溢出
  7. springboot做网站_Github点赞接近100k的SpringBoot学习教程+实战推荐!牛批!
  8. 与计算机运算速度相关参数,计算机CPU运算速度是多少
  9. css表格强制不换行符,css控制table单元格强制换行与强制不换行
  10. hive 如何将数组转成字符串_Hive 字符串操作[转]