常用ARM指令1:数据处理指令  

  mov mvn

  MOV(MOVE)指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器

MOV R0,R1;R1的值传到R0

MOV R3,#3 ;把常数3传给R3

MVN( MOVE Negative)取反后再传值,比MOV多了一步取反

MVN R0, #0 ;把0取反(即-1)传给R0

MVN R1,R2  ;把R2的值取反传给R1

  算术指令          

   add sub rsb adc sbc rsc 

  ADD加法指令

  ADD R0,R1,R2; R0=R1+R2

  ADD R0,R1,#3 ;R0=R1+3

  ADC带进位加法指令,即除了加两个数以外,还要把CPSR的C值也要带进来

  通常用于大数(超过32Bit整数)相加,这时单用ADD不能处理,必须折成两步,其中一步用ADC.

  以下是做64Bit的加法

  ADDS R0,R1,R2; R0=R1+R2,ADDS中S表示把进位结果写入CPSR

  ADC R5,R3,R4 ;R5=R3+R4+C

  逻辑指令          

  and orr eor bic

  AND位与指令

  AND R0,R1,R2; R0=R1 & R2

  AND R0,R1,#0xFF ;R0=R1 & 0xFF

  ORR位或指令

  ORR R0,R1,R2; R0=R1 | R2

  ORR R0,R1,#0xFF ;R0=R1 | 0xFF

  TST测试某一位是否为1,并把结果写入CPSR,供下一句使用

  TST R1,#0xffe;   等同于if(R1 & 0xffe)

  TST R1,#%1;测试最低位是否为1,%表示二进制

  BIC清位操作

  BIC   R0,R0,#0xF; 等同于 R0 &=~(0xF)

  BIC   R0,R0,#%1011; 该指令清除 R0 中的位 0 1  3,其余的位保持;   %表示是二进制,0x表示十六进制

  比较指令          

   cmp cmn tst teq

  CMP比较两个操作数,并把结果存入CPSR供下一句语句使用

  CMP R0,R1; 比较R0,R1

  乘法指令          

   mvl mla umull umlal smull small

  MUL R0,R1,R2 ;R0 = R1 × R2

MULS R0,R1,R2 ;R0 = R1 × R2,同时设置CPSR中的相关条件标志位

  MLA R0,R1,R2,R3            ;R0 = R1 × R2 + R3

MLAS  R0× R2 + R3,同时设置CPSR中的相关条件标志位

  SMULL   R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位

    ;R1 = (R2 × R3)的高32位

  加载/存储指令 LDR,STR  

  LDR R0,[R1]; R1的值当成地址,再从这个地址装入数据到R0 (R0=*R1)

  LDR R1,=0x30008000 ; 把地址0x30008000的值装入到R1中

  STR R0,[R1] ; 把R0的值,存入到R1对应地址空间上(*R1 = R0)。

  STR R0,=0x30008000 ;把R0中值存入到地址0x30008000

常用ARM指令2:cpsr访问指令

  mrs & msr

  mrs用来读psr,msr用来写psr

  CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。

常用ARM指令3:跳转(分支)指令

  b & bl & bx

  b 直接跳转(就没打开算返回)

  B main ;跳转到标号为main地代码处

    bl branch and link,跳转前把返回地址放入lr中,以便返回,以便用于函数调用

  bx跳转同时切换到ARM模式,一般用于异常处理的跳转

常用ARM指令4:访存指令

  ldr/str & ldm/stm & swp

  单个字/半字/字节访问 ldr/str

  多字批量访问  ldm/stm

  swp r1, r2, [r0]

  swp r1, r1, [r0]

常用ARM指令5:软中断指令

  swi(software interrupt)

  软中断指令用来实现操作系统中系统调用

协处理器cp15操作指令

  mcr & mrc

  mrc用于读取CP15中的寄存器

  mcr用于写入CP15中的寄存器

  MRC & MCR的使用方法

  mcr{<cond>}   p15, <opcode_1>, <Rd>, <Crn>, <Crm>, {<opcode_2>}

  opcode_1:对于cp15永远为0

  Rd:ARM的普通寄存器

  Crn:cp15的寄存器,合法值是c0~c15

  Crm:cp15的寄存器,一般均设为c0

  opcode_2:一般省略或为0

  mrc p15, 0, r0, c1, c0, 0

  orr   r0, r0, #1

  mcr p15, 0, r0, c1, c0, 0

8种后缀

  ia(increase after)先传输,再地址+4

  ib(increase before)先地址+4,再传输

  da(decrease after)先传输,再地址-4

  db(decrease before)先地址-4,再传输

  fd(full decrease)满递减堆栈

  ed(empty decrease)空递减堆栈

  fa(·······) 满递增堆栈

  ea(·······)空递增堆栈

四种栈

  空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出

  满栈:栈指针指向栈中最后一格数据,每次存入时需要先移动栈指针一格再存入;取出时可以直接取出,然后再移动栈指针

  增栈:栈指针移动时向地址增加的方向移动的栈

  减栈:栈指针移动时向地址减小的方向移动的栈

!的作用

  ldmia     r0, {r2 - r3}

  ldmia     r0!, {r2 - r3}

  感叹号的作用就是r0的值在ldm过程中发生的增加或者减少最后写回到r0去,也就是说ldm时会改变r0的值。

^的作用

  ldmfd    sp!, {r0 - r6, pc}

  ldmfd    sp!, {r0 - r6, pc}^

  ^的作用:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用于从异常模式返回。

伪指令的意义

  伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。

  伪指令的意义在于指导编译过程。

  伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。

gnu汇编中的一些符号

  @ 用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似

  # 做注释,一般放在行首,表示这一行都是注释而不是代码。

  :以冒号结尾的是标号

  .  点号在gnu汇编中表示当前指令的地址

  # 立即数前面要加#或$,表示这是个立即数

常用gnu伪指令

  .global _start              @ 给_start外部链接属性

  .section .text        @ 指定当前段为代码段

  .ascii .byte .short .long .word

  .quad .float .string @ 定义数据

  .align 4                @ 以16字节对齐

  .balignl 16 0xabcdefgh    @ 16字节对齐填充

偶尔会用到的gnu伪指令

  .end                     @标识文件结束

  .include               @ 头文件包含

  .arm / .code32     @声明以下为arm指令

  .thumb / .code16 @声明以下为thubm指令

最重要的几个伪指令

  ldr          大范围的地址加载指令

  adr  小范围的地址加载指令

  adrl 中等范围的地址加载指令

  nop 空操作

常用ARM指令的更多相关文章

  1. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

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

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

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

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

  4. ARM指令教程

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

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

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

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

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

  7. 常用 ARM 指令集及汇编

    ARM7TDMI(-S)指令集及汇编 ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制 较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和 16 位 T ...

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

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

  9. ARM指令

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

随机推荐

  1. 权限和ACL访问控制-02-特殊权限

    X(大写) X:给目录x权限,不给文件x权限(当文件本来就有x权限的话会重新赋予x权限) 例如: chmod -R +X dir2 SUID SUID属性一般运用在可执行文件上,当用户执行该执行文件时 ...

  2. ZOJ3471Most Powerful(状态压缩)

    问题 Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These ...

  3. feign请求远程接口时报Caused by: java.net.UnknownHostException

    报错全文如下 feign.RetryableException: host10.local executing POST http://TIBMAS2-WEBAPI/tibmas2-webapi/ap ...

  4. 28. ClustrixDB 分布式架构/评估模型

    本节描述如何在数据库中计算查询.在ClustrixDB中,我们跨节点切片数据,然后将查询发送到数据.这是数据库的基本原则之一,它允许随着添加更多节点而几乎线性地扩展. 有关如何分布数据的概念,请参阅数 ...

  5. Selenium 环境安装

    前言: 本人在学习Selenium时,用的版本是Python3.6+Selenium3,后续写的所有学习资料都是基于这套环境.在安装Selenium3前,请确保本机已安装好了Python3,如未安装可 ...

  6. UE4 使用VaRest的最佳实践

    背景介绍: 用Node.js,express,Mongo搭建了一个简单后台,为项目提供REST风格的API服务. 第一个查询是通过Get进行,返回一个json字符串. 在虚幻里使用VaRest来进行访 ...

  7. 工具类-ApplicationContextUtil

    package com.zhouyy.netBank.util; import org.springframework.beans.BeansException; import org.springf ...

  8. JavaWeb_使用dom4j解析、生成XML文件

    dom4j 官网 xml解析DOM文档对象模型(树形结构) DOM方式解析:把xml文档加载到内存形成树形结构,可以进行增删改的操作 Learn   使用dom4j解析文件"NewFile. ...

  9. JS框架_(Qrcode.js)将你的内容转换成二维码格式

    百度云盘 传送门 密码:304e 输入网址点击按钮生成二维码,默认为我的博客首页 二维码格式演示 <!DOCTYPE html> <html lang="en"& ...

  10. Spring boot之返回json数据

    1.步骤: 1. 编写实体类Demo 2. 编写getDemo()方法 3. 测试 2.项目构建 编写实体类Demo package com.kfit; /** * 这是一个测试实体类. */ pub ...