ARM基础 六、ARM指令集

来源:互联网 发布:快速傅里叶变换算法 编辑:程序博客网 时间:2024/05/16 10:59
ARM指令集可以分为六大类

1.分别为数据处理指令               (完成CPU内部的计算)
2. Load/Store指令                      (完成CPU与内存 IO外设之间的数据传输)
3. 跳转指令                                (完成程序的跳转)
4. 程序状态寄存器处理指令       (完成 CPSR的管理 ) 
5. 协处理器指令                         (完成CPU扩展功能的实现) 

6. 异常产生指令                         (用户程序异常触发)






一、数据处理指令

1、数据传送指令MOV、MVN

MOV     指令格式 MOV{cond}{S} Rd,operand2

MVN      指令格式 MVN{cond}{S} Rd,operand2




2、算术运算指令ADD、SUB、ADC、RSB、SBC、RSC

ADD加法运算指令       eg:ADD R1,R1,R2             ;R1=R1+R2

SUB :减法运算指令       eg:SUBS R2,R1,R2      ;R2=R1-R2

ADC:带进位加法指令    eg:(使用ADC实现64位加法,结果存于R1、R0中)

                                                                ADDS R0,R0,R2        ;R0等于低32位相加,并影响标志位
                                                               ADC R1,R1,R3          ;R1等于高32位相加,并加上低位进位

SBC:带进位减法指令    eg:(使用SBC实现64位减法,结果存于R1、R0中)

                                                             SUBS R0,R0,R2        ; 低32位相减,并影响标志位
                                                       
     SBC R1,R1,R3          ;高32位相减,并减去低位借位

RSB逆向减法指令        eg: RSB R3,R1,#0xFF00          ;R3=0xFF00-R1 

                                                             RSBS R1,R2,R2,LSL #2             ;R1=(R2<<2)-R2=R2×3

RSC带进位逆向减法指 eg: (使用RSC指令实现求64位数值的负数)     RSBS R2,R0,#0               RSC R3,R1,#0 




3、逻辑运算AND、ORR、EOR、BIC

AND :  逻辑操作指令   eg:   ANDS R0,R0,#0x01        ;R0=R0&0x01,取出最低位数据                  AND R2,R1,R3      ;R2=R1&R3

ORR :   逻辑操作指令 eg:    ORR R0,R0,#0x0F         ;将R0的低4位置1    

                                                              MOV R1,R2,LSR #24     ;使用ORR指令将R2的高8位    

                                                              ORR R3,R1,R3,LSL #8    ;数据移入到R3低8位中

EOR  : 逻辑异或操作指令  eg:  EOR R1,R1,#0x0F         ;将R1的低4位取反            EOR R2,R1,R0     ;R2=R1^R0
                                                                EORS R0,R5,#0x01       ; 将R5和0x01进行逻辑异或    ;结果保存到R0,并影响标志位

BIC :   位清除指令           eg:  BIC R1,R1,#0x0F          ;将R1的低4位清零,其它位不变      BIC R1,R2,R3  ;将R3的反码和R2相逻辑“与”,结果保存到R1中




4、比较运算CMP、CMN、TST、TEQ

CMP:比较指令           eg: CMP R1,R2      ; R1与R2比较,设置相关标志位  

 注意:CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。在进行两个数据的大小判断时,常用CMP指令及相应的条件码来操作


CMN:负数比较指令    eg:  CMN R0,#1     ; R0+1,判断R0是否为1的补码,如果是,则设置Z标志位

注意:CMN指令与ADDS指令的区别在于CMN指令不保存运算结果。CMN指令可用于负数比较,比如CMN R0,#1指令则表示R0与-1比较,若R0为-1,则Z置位;否则Z复位


TST:测试指令        eg:  TST R0,#0x01 ; 判断R0的最低位是否为0       TST R1,#0x0F     ; 判断R1的低4位是否为0

注意:TST指令与ANDS指令的区别在于TST指令不保存运算结果。

          TST指令通常与EQ、NE条件码配合使用,当所有测试位均为0时,EQ有效,而只要有一个测试位不为0,则NE有效


TEQ:相等测试指令    eg:  TEQ R0,R1      ; 比较R0与R1是否相等(不影响V位和C位)

注意:TEQ指令与EORS指令的区别在于TEQ指令不保存运算结果。使用TEQ进行相等测试时,常与EQ、NE条件码配合使用。当两个数据相等时,EQ有效;否则NE有效。



5、乘法指令

*数据处理指令机器码








二、Load/Store指令 

        Load/Store指令用于寄存器和内存间数据的传送。

        Load用于把内存中的数据装载到寄存器中。Store用于把寄存器中的数据存入内存。

1、单一数据单一数据传送指令(LDR和STR等)

      LDRLDR{<cond>} <Rd>,<addr>;

        把addr所表示的内存地址中的字数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。

         寻址方式:    Rn:基址寄存器。      Rm:变址寄存器。      Index:偏移量,12位的无符号数。
                 LDR Rd,[Rn]                               ;把内存中地址为Rn的字数据装入寄存器Rd中
                 LDR Rd,[Rn,Rm]                       ;将内存中地址为Rn+Rm的字数据装入寄存器Rd中
                 LDR Rd,[Rn,#index]                ;将内存中地址为Rn+index的字数据装入Rd中
                 LDR Rd,[Rn,Rm,LSL#5]        ;将内存中地址为Rn+Rm×32的字数据装入Rd
                 LDR Rd,[Rn,Rm] !                 ;将内存中地址为Rn+Rm的字数据装入Rd,并将新地址Rn+Rm写入Rn
                 LDR Rd,[Rn,#index] !          ;将内存中地址为Rn+index的字数据装入Rd,并将新地址Rn+index写入Rn
                 LDR Rd,[Rn,Rm,LSL#5]    ;将内存中地址为Rn+Rm×32的字数据装入Rd,并将新地址Rn+Rm×32写入Rn
                 LDR Rd,[Rn],Rm                     ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm写入Rn
                 LDR Rd,[Rn],#index              ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+index写入Rn
                 LDR Rd,[Rn],Rm,LSL#5       ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm×32写入Rn
                 LDR R0,[R1,R2,LSL#5]!       ; 将内存中地址为R1+R2×32的字数据装入寄存器R0,并将新地址R1+R2×32写入R1

     STR:STR{<cond>} <Rd>,<addr>;            

                  把寄存器Rd中的字数据(32位)保存到addr所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器。地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。
         寻址方式:    Rn:基址寄存器。      Rm:变址寄存器。      Index:偏移量,12位的无符号数。

           STR R0,[R1,#5]!      ;把R0中的字数据保存到以R1+5为地址的内存中,然后R1=R1+5

                                                    



2、多数据传送指令(LDM和STM)

        LDM/STM:<LDM|STM>{<cond>}<addressing_mode> Rb{!}, <寄存器 list>

       LDM / STM指令允许一次传送1到16个寄存器到/从存储器中。寄存器传送顺序是固定的,不能被改变。最小数字的寄存器总是被对应到存储器的最低地址上。

        

4 种寻址操作:

LDMIA / STMIA Increment After(先操作,后增加)
LDMIB / STMIB Increment Before(先增加,后操作)
LDMDA / STMDA Decrement After (先操作,后递减)
LDMDB / STMDB Decrement Before (先递减,后操作)



3、 *  数据交换指令(SWP和SWPB)








三、跳转指令(B、BL、BX、BXL

B:分支指令      该指令跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。

                  eg:B WAITA      ; 跳转到WAITA标号处      B 0x1234      ; 跳转到绝对地址0x1234处       

BL:分支指令   BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR) 连接寄存器中,然后跳转到指定地址运行程序。

                             跳转范围限制在当前指令的±32M字节地址内。

                 eg:BL DELAY     ; 调用子函数DELAY    

BX、BXL(略)




四、程序状态寄存器处理指令PSR传送指令 

MRS:状态寄存器读指令      

                 在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行操作。

                 通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可了解到进异常前的处理器状态

              eg: MRS R1 CPSR      ; 将CPSR状态,寄存器读取保存到R1中           R1,,MRS R2,SPSR      ; 将SPSR状态寄存器读取,保存到R2中

MSR: 状态寄存器写指令

              在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行操作。

                 与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。

                  MSR指令格式1:MSR{cond} psr_fields, #immed_8r                     MSR指令格式2:MSR{cond} psr_fields, Rm

              eg:

应用示例1(子程序:使能IRQ中断):

[cpp] view plain copy
 print?
  1. ENABLE_IRQ  
  2.      MRS     R0,   CPSR  
  3.      BIC      R0,  R0,  #0x80  
  4.      MSR     CPSR_c. R0  
  5.      MOV     PC, LR  
应用示例1(子程序:禁能IRQ中断):
[cpp] view plain copy
 print?
  1. ENABLE_IRQ  
  2.      MRS     R0,   CPSR  
  3.      ORR      R0,  R0,  #0x80  
  4.      MSR     CPSR_c. R0  
  5.      MOV     PC, LR  

这四步的作用依次是1将CPSR内容读出到R0;2修改对应于CPSR中的 I 控制位;3将修改后的值写回CPSR的对应控制域;4返回上一层函数



五、协处理器指令*


六、异常产生指令SWI

  参考博客:ARM 软中断指令SWI






补充1:指令格式中符号说明

             

            

             1)条件执行及标志位

             2)第二操作数

                 1>立即数      mov   r0, #0x100              mov   r2, #1

                     2>寄存器      mov    r1, r0
                     3>寄存器移位立即数位    mov   r1, r0, lsl #2
                     4>寄存器移位寄存器位    mov r1, r0, lsl r2

             3)立即数

                mov r0, #0x12345678       mov r0, #0xe0000001       mov r0, #0xFFFFFFFF        mov r0, #0x00001f80

补充2:桶形移位器



补充3:Thumb指令集与ARM指令集的区别

Thumb指令集较ARM指令集有如下限制:
1)只有B指令可以条件执行,其它指令都不能条件执行;
2)分支指令的跳转范围有更多限制;
3)数据处理指令的操作结果必须放入其中一个;
4)单寄存器访问指令,只能操作R0~R7;
5)LDM和STM指令可以对R0~R7的任何子集进行操作;



资料:

ARM处理器指令系统三 数据处理指令总结

ARM指令集 和 条件执行 详解

ARM指令英文全称及功能

ARM基础指令练习题汇总

0 0