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

发布者:InnovateMind最新更新时间:2022-06-01 来源: eefocus关键字: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}

[1] [2]
关键字:ARM指令  Thumb指令 引用地址:ARM指令和Thumb指令和Thumb-2指令的区别

上一篇:ARM开发环境KEIL和IAR设置堆栈的占用空间大小
下一篇:arm指令之beq和bnq

推荐阅读最新更新时间:2024-11-17 06:29

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved