嵌入式ARM中常用的汇编指令讲解

时间:2024-03-21 11:54:41

在介绍之前,先把ARM中常见的寄存器及其别名截图,如下:

嵌入式ARM中常用的汇编指令讲解

其中的r1,r2,r3常用作传递参数,r4至r11保存局部变量,r13常用作数据栈指针,别名sp;r14寄存器称作连接寄存器,别名lr,常用保存子程序返回地址;寄存器r15是程序计数器,别名pc

(1)相对跳转指令:b、bl

         这俩条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存再lr寄存器中

         这俩条指令可跳转范围是当前指令的前后32MB,并且这俩条指令是与位置无关的指令

         例如:

             /* 死循环 */
          halt:
              b halt

 (2)数据传送指令mov,地址读取伪指令ldr

           mov可以把一个寄存器的值(或一个常数)赋值给寄存器

           例如:

            mov r1,r2    /*把寄存器r2的值赋值给r1*/

            mov r1,#4096 

           /*把4096写到寄存器r1中,#号后面的常数必须为立即数,当不确定这个常数是不是可以用立即数表示,

             我们一般用ldr命令赋值*/

           ldr r1,=4097   

           /*这种形式的ldr为伪指令,伪指令的意思是不存在这条指令,这条指令在执行时会自动拆分成多条指令去执行,

             一般这种形式用于比较大的数给寄存器赋值的情况*/

   (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,#4]    /*将寄存器r1中的数据存到地址为r2+4的内存单元*/

             str r1,[r2]   /*将寄存器r1中的数据存到地址为r2的内存单元*/

             str r1,[r2],#4   /*将寄存器r1中的数据存到地址为r2的内存单元,然后r2=r2+4*/

             ldm,stm则是对多个寄存器操作,前置读内存,将数据写入多个寄存器中,后者把多个寄存器的值写入内存

    (4)加减指令:add,sub

              add r1,r2,#1  /*r1 =r2+1*/

              sub r1,r2,#1  /*r1=r2-1*/

       关于其他汇编指令,请参照ARM指令集手册学习,下载地址如下:

       链接:https://pan.baidu.com/s/1AHf-et7M8mCRCTAUIy3OAw 
       提取码:d6qn

       嵌入式ARM中常用的汇编指令讲解