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

ARM Thumb Thumb-2指令集

时间:11-10 来源:互联网 点击:

的子集,它仅仅把常用的ARM指令压缩成16位的指令编码方式。在指令的执行阶段,16位的指令被重新解码,完成对等的32位指令所实现的功能。与全部用ARM指令集的方式相比,使用Thumb指令可以在代码密度方面改善大约30%。但是,这种改进是以代码的效率为代价的。尽管每个Thumb指令都有相对应的ARM指令,但是,相同的功能需要更多的Thumb指令才能完成。因此,当指令预取需要的时间没有区别时,ARM指令相对Thumb指令具有更好的性能。与ARM指令集相比较,Thumb指令集中的数据处理指令的操作数仍然是32位,指令地址也为32位,但Thumb指令集为实现16位的指令长度,舍弃了ARM指令集的一些特性,若使用32位的存储器,ARM代码比Thumb代码快约40%,若使用16位的存储器,Thumb代码比ARM代码快约40%~50%.显然,ARM指令集和Thumb指令集各有其优点,若对系统的性能有较高要求,应使用32位的存储系统和ARM指令集,若对系统的成本及功耗有较高要求,则应使用16位的存储系统和Thumb指令集。当然,若两者结合使用,充分发挥其各自的优点,会取得更好的效果。

在编写Thumb指令时,先要使用伪指令CODE16声明,编写ARM指令时,则可使用CODE32伪指令声明。Thumb 指令集没有协处理器指令,信号量指令以及访问 CPSR 或 SPSR 的指令,没有乘加指令及 64 位乘法指令等,且指令的第二操作数受到限制;大多数 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

Thumb-2指令集(T32)

THUMB-2指令集是介绍ARM CPU中的THUMB的扩展,新指令对性能和代码密度的改进,从而提供低功耗,高性能的最优设计,更好的平衡代码性能和系统成本,Thumb-2是混合的16-bit和32-bit指令格式,其16位指令在运行时被转换为32-bit指令执行。Thumb-2指令集在Thumb指令的基础上做了如下的扩充:增加了一些新的16位Thumb指令来改进程序的执行流程,增加了一些新的32位Thumb指令以实现一些ARM指令的专有功能32位的ARM 指令也得到了扩充,增加了一些新的指令来改善代码性能和数据处理的效率给Thumb指令集增加32位指令就解决了之前Thumb指令集不能访问协处理器、特权指令和特殊功能指令的局限。新的Thumb指令集现在可以实现所有的功能,这样就不需要在ARM/Thumb状态之间反复切换了,代码密度和性能得到显著的提高。Thumb-2的出现使开发者只使用一套指令集就享有高性能、高代码密度,不再需要在不同指令之间反复切换了。开发者只需要关注对整体性能影响最大的那部分代码,其他的部分可以使用缺省的编译配置就可以了。

新的Thumb-2技术可以带来很多好处:
  可以实现ARM指令的所有功能
  增加了12条新指令,可以改进代码性能和代码密度之间的平衡
  代码性能达到了纯ARM代码性能的98%
  相对ARM代码,Thumb-2代码的大小仅有其74%
  代码密度比现有的Thumb指令集更高:代码大小平均降低5%;代码速度平均提高2-3%

为了提高处理压缩数据结构的效率,新的ARM架构为Thumb-2指令集和ARM指令集增加了一些新的指令来实现比特位的插入和抽龋为了增加处理常数的灵活性,新架构中为Thumb-2指令集和ARM指令集增加了两条新的指令。MOVW可以把一个16-bit常数加载到寄存器中,并用0填充高比特位;另一条指令MOVT可以把一个16-bit常数加载到寄存器高16比特中。这两条指令组合使用就可以把一个32-bit常数加载到寄存器中。通常在访问外设寄存器之前会把外设的基址加载到寄存器中,这时就会需要把32-bit常数加载到寄存器中。在之前的架构中需要通过literal pools来完成这样的操作,对32位常量的访问一般通过PC相对寻址来实现。Lite

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

网站地图

Top