常用ARM指令

转载地址:https://www.cnblogs.com/ylhwx/p/7834969.html

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值