常用的汇编指令总结

来源:互联网 发布:淘宝开店怎么发货 编辑:程序博客网 时间:2024/06/06 04:58

常用的汇编指令:
  1、相对跳转指令:b、b1
    这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。都是位置无关指令。
  2、数据传送指令mov,地址读取伪指令ldr
    mov指令可以把一个寄存器的值赋给另一个寄存器,或者把一个常数赋给寄存器,mov指令传送的常数必须能用立即数来表表示。ldr是伪指令,它不是真实存在的指令,编译器会把它扩展成真正的指令,如果该常数能用立即数来标识,则使用mov,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。
  3、内存访问指令:ldr、str、ldm、stm
    ldr指令从内存读取数据到寄存器,str指令把寄存器的值存储到内存中,它们操作的数据都是32位。
    示例:ldr r1,[r2,#4] /*将地址为r2+4的内存单元数据读取到r1中*/
          ldr r1,[r2]  /*将地址为r2的内存单元数据读取到r1中*/
          ldr r1,[r2],#4 /*将地址为r2的内存单元数据读取到r1中,然后r2=r2+4 */
          str r1,[r2] /*将r1的数据保存在地址为r2的内存单元中*/


  4、加减指令:add、sub
    add r1,r2,#1   表示r1=r2+1
    sub r1,r2,#1   表示r1=r2-1
  5、程序状态寄存器的访问指令:msr、mrs
    ARM处理器有一个程序状态寄存器(cprs),她用来控制处理器的工作模块、设置中断的总开关。
    msr cpsr,r0   复制r0到cpsr中
    mrs r0,cprs   复制cprs到r0中
  6、其他伪指令
    .extern main  :定义一个外部符合(可以是变量也可以是函数),这里的代码表示本文件中引用的main是一个外部函数。
    .text: 表示下面的语句都属于代码段
    .global _start:_start是一个全局函数
    .start

 7、跳转指令:
     B 是最简单的分支。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行。BNE指令,是个条件跳转,即:是“不相等(或不为0)跳转指令”。如果不为0就跳转到后面指定的地址,继续执行


  7、ARM-THUMB子程序调用规则ATPCS
    子程序间通过寄存器r0-r3来传递参数,可以使用它们的别名a0-a3
    子程序使用r4-r11来保存局部变量,可以使用它们的别名v1-v8
    寄存器r12用作子程序间scratch寄存器,别名为ip
    寄存器r13用作数据栈指针,别名为sp。在子程序寄存器r13不能用作其他用途。
    寄存器r14称为连接寄存器,别名为lr。
    寄存器r15是程序计数器,别名为pc,不能用作其他用途。
    

  8、mov pc,lr 函数返回

ARM中LR存储的是PC的值,IR存储的是下一条将要执行的指令,有什么区别?

先看定义:

(1)PC是程序计数器,存储将要执行的指令地址

(2)LR是链接寄存器,是ARM处理器中一个有特殊用途的寄存器当调用函数时,返回地址即PC的值被保存到LR中(mov lr,pc)。

(3)IR是指令寄存器,用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器(DR)中(有的书上叫做缓冲寄存器,BR),然后再传送至IR。

说白了,LR存的是指令地址,IR存的是指令内容。