常用ARM汇编指令

来源:互联网 发布:网络维护培训学校 编辑:程序博客网 时间:2024/05/21 17:34

对跳转指令 b bl

Bl除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中;

这两条指令可跳转范围是当前指令的前后32MB;

 数据传送指令mov 地址读取伪指令 ldr

mov 把一个寄存器的值赋给另一个寄存器,或把一个常数(立即数)赋给寄存器.

  mov  目标寄存器,操作寄存器或常数

mov r1,r2                                                              ;r1= r2

mov r1,#4096                                                      ;r1= 4096

 大范围的地址读取伪指令

ldr   大范围的地址读取伪指令

ldr    r1,=4097                                                       ;r1= 4097

ldr    r1,=label                                                       

label:

……                                                                             ;获取代码的绝对地址

内存访问指令:ldr,str,ldm,stm

ldr  当第二个参数前面没有”=”时,表示内存访问指令

ldr    r1,[r2,#4]                                      表示把r2+4的内存单元数据读取到r1中

ldr    r1,[r2]                                            表示把r2   的内存单元数据读取到r1中

ldr    r1,[r2],#4                                      表示把r2   的内存单元数据读取到r1中,然后r2+4

str    r1,[r2,#4]                                      表示把r1的数据保存到r2+4内存单元

str    r1,[r2]                                            表示把r1的数据保存到r2   内存单元

str    r1,[r2],#4                                     表示把r1的数据保存到r2   内存单元,然后r2+4


         ldm{cond}<addressing_mode>        <rn>{!}      <register list>{^}

         stm{cond}<addressing_mode>        <rn>{!}      <register list>{^}

        

         {cond}                                  指令执行条件

<addressing_mode>        地址变化模式

         ia(IncrementAfter)         事后递增方式

         ib(Incrementbefore)        事先递增方式

         da(DecrementAfter)     事后递减方式

         db(Decrementbefore)     事先递减方式


<rn>                                 保存内存的地址,如果加上感叹号,指令执行后rn更新为下一个内存单元的地址;

<register list>         寄存器列表

{^}                                表示操作在用户模式下,而不是在当前特权模式下的寄存器

         stmdb       sp!, {r0-r12,lr}       r0-r12,lr保存到sp表示的内存中,

                                                                 ! 使得指令执行后 sp =sp-14*4;

加减法指令 add sub

add r1,r2,#1     表示 r1 = r2 +1

         sub  r1,r2,#1      表示 r1 = r2 - 1

程序状态寄存器的访问指令 msr  mrs

msr  cpsr,r0       复制r0到cpsr

mrs  r0, cpsr       复制cpsr到r0

其他的伪指令

.extern   main

         .text

         .global      _start

         _start:

         .extern  定义一个外部符号(可以是变量也可以是函数),上面的代码表示文件中引用的main是一个外部函数

         .text    表示下面的语句都属于代码段

         .global      将本文件中的某个程序标号定义为全局的,把_start 定义为全局函数;

0 0