• 常用ARM指令


    常用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 空操作

  • 相关阅读:
    Loadrunder场景设计篇——IP欺骗
    Loadrunner场景设计篇——负载生成器
    Loadrunder场景设计篇——定时器(schedule)
    2-SAT 及 一点习题
    如何A掉未来程序改
    NOI2015 寿司晚宴
    好玩的东西——一个代码片段
    后缀自动机
    Codeforces Round #313 (Div. 2)
    Codeforces Round #312 (Div. 2)
  • 原文地址:https://www.cnblogs.com/ylhwx/p/7834969.html
Copyright © 2020-2023  润新知