• 13 ARM指令集与Thumb指令集


    指令格式

    ARM基本格式

    <opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}

    opecode:指令助记符

    cond:执行条件

    助记符

    标志

    含义

    EQ

    Z=1

    相等

    NE

    Z=0

    不相等

    CS/HS

    C=1

    无符号数大于或等于

    CC/LO

    C=0

    无符号数小于

    MI

    N=1

    负数

    PL

    N=0

    正数或0

    VS

    V=1

    溢出

    VC

    V=0

    没有溢出

    HI

    C=1,Z=0

    无符号数大于

    LS

    C=0,Z=1

    无符号数小于或等于

    GE

    N=V

    有符号数大于或等于

    LT

    N!=V

    有符号数小于

    GT

    Z=0,N=V

    有符号数大于

    LE

    Z=1,N!=V

    有符号数小于或等于

    AL

    任何

    无条件执行(指令默认条件)

    S:指令是否影响CPSR寄存器

    .W和.N:宽度说明符,默认16位,32位使用 .W说明符。ARM和Thumb都可以使用

    1。跳转指令,4条

           1。B跳转:B{cond} label

           2。BL带链接跳转(类似单步步入)将当前指令下一条指令地址存入R14寄存器,常用来调用子程序:BL{cond} label

           3。BX带状态切换跳转(在ARM与Thumb之间切换)处理器判断Rm的位[0]为1,是则将CPSR寄存器标志T置位,切换至Thumb,反之切换为ARM:RX{cond} Rm

           4。BLX带链接和状态切换的跳转:BLX{cond} Rm

    2。存储器访问指令: 

           LDR:寄存器←存储器

           格式:LDR{type}{cond} Rd,label         LDRD{cond} Rd,Rd2,label

           Type取值:

                  B:无符号字节(加载时0扩展为32位)

                  SB:有符号字节(加载时符号扩展为32位)

                  H:无符号半字节(加载时0扩展为32位)

                  SH:有符号半字节(加载时符号扩展为32位)

           Rd:加载寄存器

           Label:读取的内存地址

           LDRD:一次加载双字的数据

           STR:寄存器→内存

           STR{type}{cond} Rd,label

           STRD{cond} Rd,Rd2,label

                  Type中的SB和HS对STR无效

          

           LDM可以指定多个存储单元:寄存器←内存

           LDM{addr_mode}{cond} Rn{!} reglist

           addr_mode:

                  IA:Increase After,基址寄存器在执行指令后增加,默认

                  IB:Increase Before,基址寄存器在执行指令前增加(仅ARM)

                  DA:Decrease After,基址寄存器在执行指令后减少(仅ARM)

                  DB:Decrease Before,基址寄存器在执行指令之前减少

                  FD:满递减堆栈,堆栈向低地址生长,堆栈指针指向最后一个入栈的有效数据项

                  FA:满递增堆栈,堆栈向高地址生长,堆栈指针指向下一个要放入的空地址

                  ED:空递减堆栈,堆栈向低地址生长

                  EA:孔递增堆栈,堆栈向高地址生长

           Rn:基地址寄存器,存储初始地址

           !:可选后缀,有则最终地址将写回到Rn寄存器

           reglist:存储数据的寄存器列表,多个连续寄存器可用“-”链接,不连续用“,”分隔

          

      STM:寄存器列表数据→内存

      STM{addr_mode}{cond} Rn{!} reglist

          

           PUSH:将寄存器推入满递减堆栈

           PUSH{cond} reglist

           POP:从满递减堆栈弹出寄存器信息

           POP{cond} reglist

           SWP:寄存器←→内存

           SWP{B}{cond} Rd,Rm,[Rn]

           B:可选字节,有B则交换字节否则交换32位的字

           cond:执行条件

           Rd:从内存中加载数据的寄存器

           Rm:写入数据的到内存的寄存器

           Rn:需要交换数据的存储器地址。Rn不能与Rd和Rm相同

                         Eg:SWP R1,R1,[R0]  交换R1和R0   

                                SWPB R1,R2,[R0] 将R0一字节给R1高位清0,R2给内存

    3。数据处理指令:数据传输,算术运算,逻辑运算,比较4类。

           数据处理指令是寄存器之间的数据操作,均可使用S后缀决定是否影响状态标志。

           比较指令,不需要S后缀直接影响状态标志

          

           MOV:将8位的立即数或寄存器内容传送到目标寄存器

           MOV{cond} {S} Rd,operand2

           MVN:将8位的立即数或寄存器内容按位取反传送到目标寄存器

           MVN{cond}{S} Rd,operand2

           ADD

           ADD{cond}{S} Rd,Rn,operand2

           ADC:带进位加法,将Rn寄存器与operand2值相加,再加上CPSR寄存器的C条件标志位的值,保存到Rn寄存器

           ADC{cond}{S} Rd,Rn,operand2

           SUB:Rn-operand2  减法 

           SUB{cond}{S} Rd,Rn,operand2

           RSB:operand2-Rn   逆向减法 

           RSB{cond}{S} Rd,Rn,operand2

          

           SBC:Rn-operand2-CPSR寄存器的C条件标志位的值

      SBC{cond}{S} Rd,Rn,operand2

      RSC:operand2-Rn-CPSR寄存器的C条件标志位的值

      RSC{cond}{S} Rd,Rn,operand2

      MUL:Rd=Rm*Rn

      MUL{cond}{S} Rd,Rm,Rn

      MLS:Rd=Ra-Rm*Rn

      MLS{cond}{S} Rd,Rm,Rn,Ra

      UMULL:将Rm*Rn的值分成RdHi=高32位,RdLo=低32位

           UMULL{cond}{S} RdLo,RdHi,Rm,Rn

           SMULL:将Rm*Rn的值作为无符号数分成RdHi=高32位,RdLo=低32位

      SMULL{cond}{S} RdLo,RdHi,Rm,Rn

           UMLAL:将Rm*Rn的值作为无符号数分成RdHi=高32位,RdLo=低32位,然后64位结果在于RdHi和RdLo相加

      UMLAL{cond}{S} RdLo,RdHi,Rm,Rn

      SMLAL:将Rm*Rn的值作为有符号数分成RdHi=高32位,RdLo=低32位,然后64位结果在于RdHi和RdLo相加,

      SMLAL{cond}{S} RdLo,RdHi,Rm,Rn

      SMLAD:Rd=Rm*Rn(都是低半字节)+Rm*Rn(都是高半字节)+Ra

      SMLAD{cond}{S} Rd,Rm,Rn,Ra

      SMLSD:Rd= Rm*Rn(都是低半字节)-Rm*Rn(都是高半字节)+Ra

      SMLSD{cond}{S} Rd,Rm,Rn,Ra

           SDIV:有符号除法

           SDIV{cond} Rd,Rm,Rn

      UDIV:无符号除法

           UDIV{cond} Rd,Rm,Rn

           ASR:算术右移

           ASR{cond}{S} Rd,Rm,operand2

           AND

      AND{cond}{S} Rd,Rn,operand2

      ORR

      ORR{cond}{S} Rd,Rn,operand2

      EOR

      EOR{cond}{S} Rd,Rn,operand2

      BIC:位清除指令,将operand2取反,与Rn值 与操作 结果保存到Rd

      BIC {cond}{S} Rd,Rn,operand2

      LSL:逻辑左移

      LSL{cond}{S} Rd,Rm,operand2

      LSR:逻辑右移

      LSR{cond}{S} Rd,Rm,operand2

      ROR:循环右移,移出的位回到左边

      ROR{cond}{S} Rd,Rm,operand2

      RRX:带扩展循环右移,Rm循环右移1位,寄存器最高位用标志为的值填充,结果存入Rd

      RRX{cond}{S} Rd,Rm

      CMP:Rn-operand2,根据结果设置标志位

      CMP{cond} Rn,operand2

      CMN:Rn+operand2,根据结果设置标志位

      CMN{cond} Rn,operand2

      TST:位测试指令,Rn与operand2与操作,根据结果设置标志位

      TST{cond} Rn,operand2

      TEQ:位测试指令,Rn与operand2异或操作,根据结果设置标志位

      TEQ{cond} Rn,operand2

    4。其他指令:

           SWI:软件中断指令

           SWI{cond},immed_24

           Android系统中,系统调用为0号中断,R7寄存器存放系统调用号,R0~R3

    传递系统调用前的4个参数,大于4个参数用堆栈调用

          

           NOP:空指令

           MRS:读状态寄存器指令

           MRS Rd,psr        psr取值可以是CPSR或SPSR

           MSR写状态寄存器指令

           MSR Rd,psr_fields,operand2

           field指定传送区域(field所代表的字母必须小写):

                  c:控制域屏蔽字节(psr[7…0])

                  x:扩展域屏蔽字节(psr[15…8])

                  s:状态域屏蔽字节(psr[23…16])

                  f:标志域屏蔽字节(psr[31…24])

  • 相关阅读:
    数组常用操作实现
    链表简单实现栈与队列
    亿万级别的表数据处理方式
    ubuntu安装与卸载.dep软件
    pg数据库表接口和数据导出
    深入分析理解Tomcat体系结构
    Servlet源码级别进行详解
    Maven命令行创建java或javaWeb项目
    解释语言与编译语言
    C++中Reference与Pointer的不同
  • 原文地址:https://www.cnblogs.com/heixiang/p/10964153.html
Copyright © 2020-2023  润新知