1. 跳转指令
    1.1 B 跳转指令
      B{cond} label
      说明:如果条件cond满足,arm处理器将立即跳转到label指定的地址处继续执行.

    1.2 BL 带链接的跳转指令
      BL{cond} label
      说明:如果条件cond满足,会首先将当前指令的下一条指令的地址拷贝到R14(LR),
      然后跳转到label指定的地址处继续执行.

    1.3 BX 带状态切换的跳转指令
      BX{cond} Rm
      如果条件cond满足,则处理器会判断rm的位[0]是否为1,如果为1则跳转时自动将
      CPSR寄存器的标志T位置,并将目标地址处的代码解释为Thumb代码来执行,即处
      理器会切换至Thumb状态,反之,若Rm的位[0]为0,则跳转时自动将CPSR寄存器
      的标志T复位,并将目标地址处的代码解释为arm代码来执行,即处理器会切换到
      arm状态

    1.4 BLX 带链接和状态切换的跳转指令
      BLX{cond} rm
      BLX指令集合了BL与BX的功能,当cond条件满足时,除了设置链接寄存器,还根据
      Rm位[0]的值来切换处理器状态
  2. 存储器访问指令
    2.1 LDR 存储器加载数据到寄存器
      LDR{type}{cond} Rd,label
      LDRD{cond} Rd,Rd2,label
      type:指明了操作数据的大小,取值范围为:B(无符号字节),SB(有符号字节)
      ,H(无符号半字),SH(有符号半字)
      cond:执行条件
      Rd:为要加载的寄存器
      label:要读取的内存地址
      LDRD:一次加载双字的数据

    2.2 STR 寄存器保存数据到存储器
      STR{type}{cond} Rd,label
      STRD{cond}Rd,Rd2,label
      与LDR相同,但是type中的SB和SH对STR无效

    2.3 LDM 从存储器加载多个数据到寄存器列表
      LDM{addr_mode}{cond} Rn{!} reglist

      addr_mode取值:

    addr_mode 含义
    IA Increase After,基址寄存器在执行命令之后增加,这是默认情况
    IB Increase Before,基址寄存器在执行命令之前增加(仅ARM)
    DA Decrease After,基址寄存器在执行命令之后减少(仅ARM)
    DB Decrease Before,基址寄存器在执行命令之前减少
    FD 满递减堆栈,堆栈向高地址生长,堆栈指针指向最后一个入栈的有效数据项
    FA 满递增堆栈,堆栈向高地址生长,堆栈指针指向下一个要放入的空地址
    ED 空递减堆栈,堆栈向低地址生长
    EA 空递增堆栈,堆栈向高地址生长

      Rn:基地址寄存器,用于存储初始地址
      !:可选后缀,如果有!,则最终地址将写回到Rn寄存器中
      reglist:用来存储数据的寄存器列表,用大括号括起来,寄存器列表可以是多个连续的寄存器,
      多个寄存器可以用'-'连接,如R0-R3,如果多个寄存器是不连续的,则使用都好将它们分隔开来,如{R0,R1,R7}

    2.4 STM 将一个寄存器列表的数据存储到指定的存储单元
      STM{addr_mode}{cond} Rn{!} reglist
      STM与LDM的格式是一样

    2.5 PUSH 将寄存器推入满递减堆栈
      PUSH{cond} reglist

    2.6 POP 从满递减栈中弹出数据到寄存器可
      POP{cond} reglist

    2.7 SWP 寄存器与存储器数据交换
      SWP{B}{cond} Rd,Rm,[Rn]
      B:可选字节,表示交换字节,默认为32为的字
      cond:执行条件
      Rd:要从存储器加载加载数据的寄存器
      Rm:要写入数据到存储器的寄存器
      Rn:需要进行数据交换的存储器地址,Rn不能与Rd和Rm相同
      如果Rd与Rm相同,可实现单个寄存器与存储器的数据交换

  3. 数据处理指令
    3.1 MOV 数据传输指令
      将8位的立即数或寄存器的内容传送到目标寄存器中
      MOV{cond}{S} Rd,operand2

    3.2 MVN 数据非传送指令
      将8位的立即数或寄存器按位取反后传送到目标寄存器中
      MVN{cond}{S} Rd,operand2

    3.3 ADD 加法指令
      ADD{cond}{S} Rd,Rn,operand2

    3.4 ADC 带进位的加法
      将Rn寄存器与operand2寄存器的值相加,再加上CPSR寄存器的C条件标志位的值,最后将结果保存到Rd寄存器
      ADC{cond}{S} Rd,Rn,operand2

    3.5 SUB 减法指令
      Rn寄存器的值减去operand2寄存器的值,结果保存到Rd寄存器中
      SUB{cond}{S} Rd,Rn,operand2

    3.6 RSB 逆向减法指令
      operand2寄存器的值减去Rn寄存器的值,结果保存到Rd寄存器中

    3.7 SBC 带进位的减法
      Rn寄存器的值减去operand2寄存器的值,再减去CPSR寄存器的C标志位的值,最后将结果保存到Rd寄存器
      SBC{cond}{S} Rd,Rn,operand2

    3.8 RSC 带进位逆向减法指令
      用operand2寄存器的值减去Rn寄存器的值,再减去CPSR寄存器的C标志位的值,最后将结果保存到Rd寄存器
      RSC{cond}{S} Rd,Rn,operand2

    3.9 MUL  32位乘法指令
      将Rm寄存器与Rn寄存器的值相乘,结果的低32位保存到Rd寄存器中
      MUL{cond}{S} Rd,Rm,Rn

    3.10 MLS
      将Rm寄存器的值和Rn寄存器中的值相乘,然后再从Ra寄存器中的值减去乘积,最后将所得结果的低32位存入Rd寄存器
      MLS{cond}{S} Rd,Rm,Rn,Ra

    3.11 MLA
      将rm寄存器的值和rn寄存器中的值相乘,然后再将乘积与Ra寄存器中的值相加,最后将所得结果的低32位存入Rd寄存器
      MLA{cond}{S} Rd,Rm,Rn,Ra

    3.12 UMULL 无符号64位乘法指令
      将Rm寄存器和Rn寄存器的值作为无符号数相乘,然后将结果的低32位存入RdLo寄存器,高32位存入RdHi寄存器
      UMULL{cond}{S} RdLo,RdHi,Rm,Rn

    3.13 UMLAL
      将指令Rm寄存器与Rn寄存器作为无符号数相乘,然后将64位的结果与RdHi,RdLo组成的64位数相加,结果的低32位存入
      RdLo寄存器,高32位存入RdHi寄存器
      UMLAL{cond}{S} RdLo,RdHi,Rm,Rn

    3.14 SMULL 有符号的64位乘法指令
      将Rm寄存器和Rn寄存器的值作为有符号数相乘,然后将结果的低32位存如RdLo寄存器,高32位存存入RdHi寄存器
      SMULL{cond}{S} RdLo,RdHi,Rm,Rn

    3.15 SMLAL 
      将Rm寄存器和Rn寄存器的值作为有符号数相乘,然后将64位的结果与RdHi,RdLo组成的64位数相加,结果的低32位存入
      RdLo寄存器,高32位存入RdHi寄存器

    3.16 SMLAD
      将Rm寄存器的低半字和Rn寄存器的低半字相乘,然后将Rm寄存器的高半字和Rn寄存器的高半字相乘,最后将两个乘积
      与Ra寄存器的值相加并存入Rd寄存器
      SMLAD {cond}{S} Rd,Rm,Rn,Ra

    3.17 SMLSD
      将Rm寄存器的低半字和Rn寄存器的低半字相乘,然后将Rm寄存器的高半字和Rn寄存器的高半字相乘,接着使用第一个乘积
      减去第二个乘积,最后将所得的差值与Ra寄存器的值相加并存入Rd寄存器
      SMLSD{cond}{S} Rd,Rm,Rn,Ra

    3.18 SDIV 有符号数除法指令
      SDIV{cond} Rd,Rm,Rn

    3.19 UDIV 无符号数除法指令
      UDIV{cond} Rd,Rm,Rn

    3.20 ASR 算术右移指令
      将Rm寄存器算术右移operand2位,并使用符号位填充空位,移位结果保存到Rd寄存器
      ASR{cond}{S} Rd,Rm,operand2

    3.21 AND 逻辑与指令
      AND{cond}{S} Rd,Rn,operand2

    3.20 ORR 逻辑或指令
      ORR{cond}{S} Rd,Rn,operand2

    3.21 EOR 异或指令
      EOR{cond}{S} Rd,Rn,operand2

    3.22 BIC 位清除指令
      将operand2的值取反,然后将结果与Rn寄存器的值相"与",并保存到Rd寄存器中
      BIC{cond}{S} Rd,Rn,operand2

    3.23 LSL 逻辑左移指令
      将Rm寄存器逻辑左移operand2位,并将空位清0,并将结果保存到Rd寄存器中
      LSL{cond}{S} Rd,Rm,operand2

    3.24 LSR 逻辑右移指令
      将Rm寄存器逻辑右移operand2位,并将空位清0,并将结果保存到Rd寄存器中
      LSR{cond}{S} Rd,Rm,operand2

    3.25 ROR 循环右移指令
      将Rm寄存器循环右移operand2位,寄存器右边移出的位移回到左边,位移结果保存到
      Rd寄存器中
      ROR{cond}{S} Rd,Rm,operand2

    3.26 RRX 带扩展的循环右移指令
      将Rm寄存器循环右移1位,寄存器最高位用标志位的值填充,位移结果保存到Rd寄存器中
      RRX{cond}{S} Rd,Rm

    3.27  CMP 比较指令
      使用Rn寄存器减去operand2的值,与SUBS指令功能相同,但CMP指令不保存计算结果,
      仅根据比较结果设置标志位
      CMP{cond} Rn,operand2

    3.29 TST 位测试指令
      将Rn寄存器的值和operand2的值进行"与"运算,这与ADNS指令功能相同,但TST指令不保存
      计算结果,仅根据计算结果设置标志位
      TST{cond} Rn,operand2

    3.30 TEQ
      将Rn寄存器的值和operand2的值进行"异或"运算,这与EORS指令功能相同,但TEQ指
      令不保存计算结果,仅根据计算结果设置标志位
  4. 其它指令
    4.1 SWI 软中断指令
      用于产生软中断,从而实现用户模式到管理模式的切换,immed_24 为24位的中断号,在
      android系统中,系统功能调用为0号中断,使用R7寄存器存放系统调用号,使用R0-R3寄存器
      来传递系统调用的前4个参数,对于大于4个参数的调用,剩余参数采用堆栈来传递
      SWI{cond},immed_24

    4.2 NOP 空操作指令
      仅用于空操作或字节对齐,指令格式只有一个操作码NOP

    4.3 MRS 读状态寄存器指令
      psr的取值可以是CPSR或SPSR
      MRS Rd,psr

    4.4 MSR 写状态寄存器指令
      MSR Rd,psr_fields,operand2
      psr_fields指定传送的区域,它的取值表为

      
      field     含义  
    c 控制域屏蔽字节
    x 扩展域屏蔽字节
    s 状态域屏蔽字节
    f 标志域屏蔽字节

(3) arm 指令的更多相关文章

  1. iOS逆向工程之Hopper中的ARM指令

    虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...

  2. ARM指令教程

    ARM指令教程 ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理 ...

  3. ARM指令分类及其寻址方式

    ARM指令分类及其寻址方式 一:ARM指令的分类 ARM指令集可以分为以下6类: •跳转指令: •数据处理指令: •程序状态寄存器(PSR)传输指令: •load/store指令: •协处理器指令: ...

  4. ARM指令

    语法格式 <opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand> {}表示是可选的部分,<& ...

  5. ARM指令学习,王明学learn

    ARM指令学习 一.算数和逻辑指令 1— MOV 数据传送指令    2.— MVN 数据取反传送指令    3.— CMP 比较指令    4.— CMN 反值比较指令    5.— TST 位测试 ...

  6. 头文件定义和ARM指令

    2015.2.2星期一,阴天 内存管理:内存的分配和释放等静态和动态内存:主要是在释放方式上的区别 静态变量:编译时就已经确定,定义在函数外面自动变量:在程序运行时才能在栈中确定只读数据节:存放常量的 ...

  7. [置顶] ARM指令集和常用寄存器

    1) ARM指令集 32位的 ARM指令和 16位 的Thumb指令 1,寄存器寻址 MOV R1, R2  //将寄存器R2的值传给寄存器R1 2,立即寻址 MOV R0, #0XFF00 //数据 ...

  8. ARM指令和Thumb指令区别

    Thumb指令集 ]的问题而提出的,它具有16为的代码密度.Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集.因此,Thumb指令只需要支持通用功能,必要时, ...

  9. arm指令bne.w改成b,即无条件跳转

    近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultrae ...

  10. arm指令1

    .section .text.writeFUNCTION(write) ldr r12, =__NR_write swi #0 bx lr LDR: LDR 的两种用法 1)LDR pc, =MyHa ...

随机推荐

  1. 【Azure API 管理】从微信小程序访问APIM出现200的空响应的问题中发现CORS的属性[terminate-unmatched-request]功能

    问题描述 使用微信小程序调用APIM(API Management)中的接口,发现POST和PUT请求被拦截,返回的状态码为200,但是无消息内容. 在小程序中的调用JS代码如: 通过浏览器测试得到的 ...

  2. Excel查分系统搭建小技巧

    推荐一个教师必备工具"Yichafen",是一个在线查分系统,全国8000所高校都在用,三分钟极速创建发布查分系统 在工作学习中,我们经常会遇到查分系统这样的问题.培根说过:读书足 ...

  3. MyBatis(七):MyBatis缓存详解(一级缓存/二级缓存)

    一级缓存 ​ MyBatis一级缓存上SqlSession缓存,即在统一SqlSession中,在不执行增删改操作提交事务的前提下,对同一条数据进行多次查询时,第一次查询从数据库中查询,完成后会存入缓 ...

  4. 前端学习 node 快速入门 系列 —— 简易版 Apache

    其他章节请看: 前端学习 node 快速入门 系列 简易版 Apache 我们用 node 来实现一个简易版的 Apache:提供静态资源访问的能力. 实现 直接上代码. - demo - stati ...

  5. IPFS挖矿赚钱吗?IPFS挖矿是真的吗?

    IPFS一出现就获得了极高的关注度,「让人类信息永存」的口号也让其蒙上了一层神秘的面纱.今天我就来给大家自剖析,一探IPFS技术的真相. IPFS是一个去中心化存储网络,而Filecoin是IPFS激 ...

  6. warpperspective 透视变化的opencv实现

    warpperspective 透视变化的opencv2.0实现 1st-------2nd | | | | | |3rd-------4th 原始代码              cv::Mat sr ...

  7. Prometheus 配置文件中 metric_relabel_configs 配置--转载

    Prometheus 配置文件中 metric_relabel_configs 配置 参考1:https://www.baidu.com/link?url=YfpBgnD1RoEthqXOL3Lgny ...

  8. 通过lms.samples熟悉lms微服务框架的使用

    经过一段时间的开发与测试,终于发布了Lms框架的第一个正式版本(1.0.0版本),并给出了lms框架的样例项目lms.samples.本文通过对lms.samples的介绍,简述如何通过lms框架快速 ...

  9. 201871030102_崔红梅 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程2. 掌握Github协作开发程序的操作方法.3.阅读<现代软 ...

  10. Dynamics CRM存放选项集记录的表

    我们在做一些自定义查询的时候会去查询选项集字段的值,但是实体的选项集字段是一个整型字段,直接查询并不能找到对应的选项集的显示内容.所以我们需要找到存放选项集键值对的表来做关联查询找到我们想要的值. D ...