ARM指令和Thumb指令和Thumb-2指令的区别

ARM指令和Thumb指令的区别

 

 

上述节选《Cortex‐M3 权威指南》 初稿 第 1 章

ARM11之前的处理器和指令集架构

ARM11芯片之前,每一个芯片对应的架构关系如下:图片

ARM11之后处理器和指令集架构

ARM11芯片之后,也就是从ARMv7架构开始,ARM的命名方式有所改变。

新的处理器家族,改以Cortex命名,并分为三个系列,分别是Cortex-A,Cortex-R,Cortex-M。

很巧合,又是这三个字母A、R、M

图片

在这里插入图片描述

Cortex-A系列(A:Application)

针对日益增长的消费娱乐和无线产品设计,用于具有高计算要求、运行丰富操作系统及提供交互媒体和图形体验的应用领域,如智能手机、平板电脑、汽车娱乐系统、数字电视,智能本、电子阅读器、家用网络、家用网关和其他各种产品。。

Cortex-R系列 (R:Real-time)

针对需要运行实时操作的系统应用,面向如汽车制动系统、动力传动解决方案、大容量存储控制器等深层嵌入式实时应用。

Cortex-M系列(M:Microcontroller)

该系列面向微控制器领域,主要针对成本和功耗敏感的应用,如智能测量、人机接口设备、汽车和工业控制系统、家用电器、消费性产品和医疗器械等。

Cortex-SC系列(SC:SecurCore)

其实,除了上述三大系列之外,还有一个主打安全的Cortex-SC系列(SC:SecurCore),主要用于政府安全芯片。

一、现在先区分下ARM指令集与Thumb指令集
       Thumb 指令可以看作是 ARM 指令压缩形式的子集,是针对代码密度的问题而提出的,它具有 16 位的代码密度但是它不如ARM指令的效率高 .Thumb 不是一个完整的体系结构,不能指望处理只执行Thumb 指令而不支持 ARM 指令集.因此,Thumb 指令只需要支持通用功能,必要时可以借助于完善的 ARM 指令集,比如,所有异常自动进入 ARM 状态.在编写 Thumb 指令时,先要使用伪指令 CODE16 声明,而且在 ARM 指令中要使用 BX指令跳转到 Thumb 指令,以切换处理器状态.编写 ARM 指令时,则可使用伪指令 CODE32声明.

流水线处理:
不同于微编码的处理器,ARM (保持它的 RISC 性)是完全硬布线的。

为了加速 ARM 2 和 3 的执行使用 3 阶段流水线。第一阶段持有从内存中取回的指令。第二阶段开始解码,而第三阶段实际执行它。故此,程序计数器总是超出当前执行的指令两个指令。(在为分支指令计算偏移量时必须计算在内)。

因为有这个流水线,在分支时丢失 2 个指令周期(因为要重新添满流水线)。所以最好利用条件执行指令来避免浪费周期。例如:

...
CMP R0,#0
BEQ over
MOV R1,#1
MOV R2,#2
over
...


可以写为更有效的:
...
CMP R0,#0
MOVNE R1,#1
MOVNE R2,#2


二、Thumb 指令集与 ARM 指令集的区别
Thumb 指令集没有协处理器指令,信号量指令以及访问 CPSR 或 SPSR 的指令,没有乘加指令及 64 位乘法指令等,且指令的第二操作数受到限制;除了跳转指令 B 有条件执行功能外,其它指令均为无条件执行;大多数 Thumb 数据处理指令采用 2 地址格式.Thumb指令集与 ARM 指令的区别一般有如下几点:
      跳转指令
程序相对转移,特别是条件跳转与 ARM 代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移.
      数据处理指令
数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第 3 个寄存器中.数据处理操作比 ARM 状态的更少,访问寄存器 R8~R15 受到一定限制.除 MOV 和 ADD 指令访问器 R8~R15 外,其它数据处理指令总是更新 CPSR 中的 ALU 状态标志.访问寄存器 R8~R15 的 Thumb 数据处理指令不能更新 CPSR 中的 ALU 状态标志.
      单寄存器加载和存储指令
在 Thumb 状态下,单寄存器加载和存储指令只能访问寄存器 R0~R7
      批量寄存器加载和存储指令
LDM 和 STM 指令可以将任何范围为 R0~R7 的寄存器子集加载或存储. PUSH 和 POP 指令使用堆栈指令 R13 作为基址实现满递减堆栈.除 R0~R7 外,PUSH 指令还可以存储链接寄存器 R14,并且 POP 指令可以加载程序指令PC

ARM指令分为以下几种:

一、ARM 存储器访问指令
助记符                       说明                                        操作                                                  条件码位置
LDR    Rd,addressing      加载字数据                            Rd←[addressing],addressing 索引 LDR{cond}
LDRB   Rd,addressing    加载无符字节数据                  Rd←[addressing],addressing 索引 LDR{cond}B
LDRT   Rd,addressing    以用户模式加载字数据        Rd←[addressing],addressing 索引 LDR{cond}T
LDRBT Rd,addressing    以用户模式加载无符号字数据 Rd←[addressing],addressing 索引 LDR{cond}BT
LDRH   Rd,addressing    加载无符半字数据              Rd←[addressing],addressing 索引 LDR{cond}H
LDRSB Rd,addressing    加载有符字节数据        Rd←[addressing],addressing 索引 LDR{cond}SB
LDRSH Rd,addressing    加载有符半字数据     Rd←[addressing],addressing 索引 LDR{cond}SH
STR    Rd,addressing    存储字数据                        [addressing]←Rd,addressing 索引 STR{cond}
STRB   Rd,addressing    存储字节数据       [addressing]←Rd,addressing 索引 STR{cond}B
STRT   Rd,addressing    以用户模式存储字数据    [addressing]←Rd,addressing 索引 STR{cond}T
SRTBT Rd,addressing    以用户模式存储字节数据   [addressing]←Rd,addressing 索引 STR{cond}BT
STRH   Rd,addressing    存储半字数据          [addressing]←Rd,addressing 索引 STR{cond}H
LDM{mode} Rn{!},reglist   批量(寄存器)加载       reglist←[Rn…],Rn 回存等          LDM{cond}{more}
STM{mode} Rn{!},rtglist   批量(寄存器)存储           [Rn…]← reglist,Rn 回存等         STM{cond}{more}
SWP     Rd,Rm,Rn          寄存器和存储器字数据交换 Rd←[Rd],[Rn]←[Rm](Rn≠Rd 或 Rm) SWP{cond}
SWPB    Rd,Rm,Rn        寄存器和存储器字节数据交换 Rd←[Rd],[Rn]←[Rm](Rn≠Rd 或 Rm) SWP{cond}B

二、ARM 数据处理指令
助记符号                                   说明                                   操作               条件码位置
MOV Rd ,operand2   数据转送                           Rd←operand2               MOV {cond}{S}
MVN Rd ,operand2   数据非转送                        Rd←(operand2)             MVN {cond}{S}
ADD Rd,Rn operand2 加法运算指令                  Rd←Rn+operand2            ADD {cond}{S}
SUB Rd,Rn operand2 减法运算指令                  Rd←Rn-operand2            SUB {cond}{S}
RSB Rd,Rn operand2 逆向减法指令                  Rd←operand2-Rn            RSB {cond}{S}
ADC Rd,Rn operand2 带进位加法                     Rd←Rn+operand2+carry      ADC {cond}{S}
SBC Rd,Rn operand2 带进位减法指令            Rd←Rn-operand2-(NOT)Carry SBC {cond}{S}
RSC Rd,Rn operand2 带进位逆向减法指令       Rd←operand2-Rn-(NOT)Carry RSC {cond}{S}
AND Rd,Rn operand2 逻辑与操作指令              Rd←Rn&operand2            AND {cond}{S}
ORR Rd,Rn operand2 逻辑或操作指令             Rd←Rn|operand2            ORR {cond}{S}
EOR Rd,Rn operand2 逻辑异或操作指令          Rd←Rn^operand2            EOR {cond}{S}
BIC Rd,Rn operand2 位清除指令                      Rd←Rn&(~operand2)         BIC {cond}{S}
CMP Rn,operand2    比较指令                       标志 N、Z、C、V←Rn-operand2 CMP {cond}
CMN Rn,operand2    负数比较指令               标志 N、Z、C、V←Rn+operand2 CMN {cond}
TST Rn,operand2    位测试指令                    标志 N、Z、C、V←Rn&operand2 TST {cond}
TEQ Rn,operand2    相等测试指令                标志 N、Z、C、V←Rn^operand2 TEQ {cond}

三、乘法指令
      具有 32×32 乘法指令,32×32 乘加指令,32×32 结果为 64 位的乘/乘法指令.
助记符                                               说明                        操作              条件码位置
MUL   Rd,Rm,Rs        32 位乘法指令    Rd←Rm*Rs           (Rd≠Rm)    MUL{cond}{S}
MLA   Rd,Rm,Rs,Rn     32 位乘加指令    Rd←Rm*Rs+Rn        (Rd≠Rm)    MLA{cond}{S}
UMULL RdLo,RdHi,Rm,Rs 64 位无符号乘法指令 (RdLo,RdHi)←Rm*Rs             UMULL{cond}{S}
UMLAL RdLo,RdHi,Rm,Rs 64 位无符号乘加指令 (RdLo,RdHi)←Rm*Rs+(RdLo,RdHi) UMLAL{cond}{S}
SMULL RdLo,RdHi,Rm,Rs 64 位有符号乘法指令 (RdLo,RdHi)←Rm*Rs             SMULL{cond}{S}
SMLAL RdLo,RdHi,Rm,Rs 64 位有符号乘加指令 (RdLo,RdHi)←Rm*Rs+(RdLo,RdHi) SMLAL{cond}{S}

四、跳转指令
在 ARM 中有两种方式可以实现程序的跳转,一种是使用跳转指令直接跳转,另一种则是直接向 PC 寄存器赋值实现跳转.
          
助记符           说明                            操作                    条件码位置
B label 跳转指令                             Pc←label                 B{cond}
BL label 带链接的跳转指令             LR←PC-4, PC←label BL{cond}
BX Rm    带状态切换的跳转指令    PC←label,切换处理状态 BX{cond}

五、ARM协处理器指令
ARM 支持协处理器操作,协处理器的控制要通过协处理器命令实现.
助记符                                                            说明                           操作             条件码位置
CDP
coproc,opcodel,CRd,CRn,CRm{,opcode2}     协处理器数据操作指令       取决于协处理器   CDP{cond}
LDC{L} coproc,CRd〈地址〉                  协处理器数据读取指令      取决于协处理器   LDC{cond}{L}
STC{L} coproc,CRd,〈地址〉                 协处理器数据写入指令      取决于协处理器   STC{cond}{L}
                                                                    ARM 寄存器到协处理器
MCR coproc, opcodel,Rd,CRn,{,opcode2}   寄存器的数据传送指令       取决于协处理器 MCR{cond}
                                                                     协处理器寄存器到 ARM
MRC coproc, opcodel,Rd,CRn,{,opcode2}   寄存器到数据传送指令        取决于协处理器MCR{cond}

五、ARM 杂项指令
助记符                                                说明                            操作                               条件码位置
SWI immed_24                软中断指令               产生软中断,处理器进入管理模式       SWI{cond}
MRS Rd,psr                  读状态寄存器指令 Rd←psr,psr 为 CPSR 或 SPSR                  MRS{cond}
MSR psr_fields,Rd/#immed_8r 写状态寄存器指令 psr_fields←Rd/#immed_8r,psr 为 CPSR 或 SPSR MSR{cond}

 

thumb指令集是arm指令集的一个子集,是针对代码密度问题而提出的,它具有16位的代码宽度。与等价的32位代码相比较,thumb指令集在保留32位代码优势的同时,大大的节省了系统的存储空间。thumb不是一个完整的体系结构,不能指望处理器只执行thumb指令集而不支持arm指令集。

thumb指令集是什么_thumb指令集与arm指令集的区别

 

  thumb指令集分为:分支指令、数据传送指令、单寄存器加载和存储指令以及多寄存器加载和存储指令。thumb指令集没有协处理器指令、信号量(semaphore)指令以及访问cpsr或spsr的指令。

  thumb指令集与arm指令集的区别

thumb指令集是什么_thumb指令集与arm指令集的区别

  1、thumb指令继承了arm指令集的许多特点

  thumb指令也是采用load/store结构,有数据处理、数据传送及流控制指令等。

  2、thumb指令集丢弃了arm指令集一些特性

  大多数thumb指令是无条件执行的(除了转移指令b),而所有arm指令都是条件执行的。许多thumb数据处理指令采用2地址格式,即目的寄存器与一个源寄存器相同,而大多数arm数据处理指令采用的是3地址格式(除了64位乘法指令外)。

  3、thumb异常时表现的一些特点

  所有异常都会使微处理器返回到arm模式状态,并在arm的编程模式中处理。由于arm微处理器字传送地址必须可被4整除(即字对准),半字传送地址必须可被2整除(即半字对准)。而thumb指令是2个字节长,而不是4个字节,所以,由thumb执行状态进入异常时其自然偏移与arm不同。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值