微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM Thumb Thumb-2指令集

ARM Thumb Thumb-2指令集

时间:11-10 来源:互联网 点击:
32位RISC芯片ARM 体系结构支持两种指令集:32位的ARM指令集执行效率高,对ARM体系架构所有功能的完整支持;16位的Thumb指令集是ARM指令集的子集并以良好的代码密度著称。如果抛开预取指令时间不计,ARM指令相对Thumb指令将有更好的运行性能(预取指令时需要根据指令地址偏移量来取指, ARM支持更大的地址偏移量而比较耗时)。最近ARM公司推出的的Thumb-2/Thumb2指令集据称是上述两种特性的综合,是ARM指令集的性能和Thumb指令集的代码密度的折中。号称达到98%的ARM性能而又能降低代码密度达30%。在目前的大多数ARM应用中依然采用ARM + Thumb代码的混杂模式。ARM code对应的CPU(ARM处理器)工作状态称为ARM State,Thumb对应的称之为Thumb State,这两种状态的不同主要通过CPSR[bit 5]区别。CPSR(当前程序状态寄存器)保存了处理器的当前工作状态,[bit 5]也被称为T bit。对于所有带有J标志的处理器核,比如ARM926EJ-S和ARM1136J-S,J(Jazelle)代表ARM核中集成了Jazelle技 术。CPSR[bit24]则被成为J bit,如果这位为1,则代表当前CPU工作在Java State下而CPU的取指和解码都是直接操作Java操作数栈。当然要生成Jazelle支持的字节码需要特殊的Java编译器和JVM,一般由第三方 平台软件厂商提供,比如日本的Aplix公司。在ARM处理器的运行过程中,汇编指令BX以及BLX可以完成ARM State和Thumb State之间的切换(BXJ和BLXJ完成ARM/Thumb State和Java State之间的切换)。但如果程序有一部分工作在ARM工作状态下,一部分工作在Thumb工作状态下,而这两段代码却有交互调用,则在编译C/C++和汇编源文件时要 加上 -apcs /interwork选项。ARM公司的ADS(ARM Developer Suite,-apcs /interwork)和RealView的RVDS(RealView Developer Suite,--apcs /interwork) 都支持这样的编译选项,他们会在链接时自动检测函数之间的调用关系和工作状态提供粘合剂(Veneers)以便程序能够在不同的工作状态下切换。arm-linux-gcc编译器个别版本不支持这个选项,所以在开发ARM + Linux平台下使用的程序时应该注意到这个问题。最后比较了arm-linux-gcc编译器下ARM(armv7-a)、Thumb-1、Thumb-2指令集以及armv5te、Cortex-A9与Cortex-A8的tune选项效率性能和代码密度。

图1. ARM体系结构演进图

ARM指令集(A32)

ARM指令集为32位指令集,指令地址必须对齐在4字节边界,可以实现ARM架构下所有功能。大多数ARM数据处理指令采用的是3地址格式(除了64位乘法指令外),即两个源操作数和一个结果操作数。

控制比特含义

代号

N(Negative)

当为负数时,设为1

Z(Zero)

当为0时设为1

C(Carry)

当结果带进位时设为1

V(Overflow)

当结果溢出时设为1

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top