1、Thumb指令集来源
ARM的RISC体系结构的发展中已经提供了低功耗、小体积、高性能的方案。而为了解决代码长度的问题,ARM体系结构又开发了一种新的指令体系,就是Thumb指令集,称之为T变种。
Thumb是ARM体系结构的扩展(thumb不是一个完整的体系结构,不能指望处理器只执行thumb指令集而不支持arm指令集)。它从标准32位ARM指令集抽出来的36条指令格式,重新编成16位的操作码。这能带来很高的代码密度,例如:在1K的存储空间中,可以放32条ARM指令,就可以放64条Thumb指令,因此Thunb指令代码密度高。
2、Thumb指令集和ARM指令的时间复杂度和空间复杂度对比
在ARM处理器中,内核同时支持32位的ARM指令和16位的Thumb令。
- 当用户使用C程序来处理应用时,如果编译为Thumb指令,Thumb代码使用的指令数要比ARM代码多约30%~40%,但最终生成的目标代码所需的存储空间约为ARM代码的60%~70%(因为每条指令所占空间是arm指令的一半)。
- 使用32位存储器,ARM代码比Thumb代码快约40%;使用16位存储器,Thumb代码比ARM指令快约40%~50%。具体解释如下:
在存储器是32位的情况下,ARM性能较好,这时因为同样的代码编译的结果Thumb指令将会比ARM 多,Thumb指令仍旧花费指令周期来从32-bit块内存预取。在16-bit内存上,即使有比ARM多的代码,这时Thumb性能也较好,因为Thumb每一条指令预取需要一个周期而每条ARM指令需要两个周期。
另外在16-bit内存上,Thumb的性能降低了;这是因为数据去操作和特殊的堆栈操作,即使在Thumb下,堆栈操作仍是32-bit操作,导致低的性能在16-bit内存架构上。一个改进的方法是提供32-bit的内存来放置堆栈。在这种情况下的性能提高到了32-bit内存架构的水平。主要的差别是因为使用的整型的(32-bit)全局数据将仍被存储在16-bit内存上。
与ARM代码相比较,使用Thumb代码,存储器的功耗会降低约30%。
3、Thumb指令集和ARM指令的混合编程
若两者结合使用,充分发挥其各自的优点,会取得更好的效果。Thumb以其较高的代码密度和在窄存储器上的性能,使得它在很多系统中得到广泛应用。但在很多情况下,还是不得不使用ARM指令,这是因为:
①ARM处理器的一些特定功能必须由ARM指令实现,其中包括PSR指令(不能直接访问CPSR 和SPSR,必须先切换到ARM状态下,再使用MSR和MRS来实现)、协处理器指令;
②异常发生时,处理器自动进入ARM状态,即在异常中断处理程序入口的一些指令是ARM指令(ARM程序头ARMassemblerheader),然后根据需要程序可以切换到Thumb状态,在异常中断处理程序返回前,程序再切换到ARM状态。如果异常处理程序需要使用Thumb指令也必须通用一个。
③ARM处理器总是从ARM状态开始执行,如果要在调试器中运行Thumb程序,必须为该Thumb程序添加一个ARM程序头,然后再切换到Thumb状态,调用该Thumb程序。
基于以上原因,即使程序需要由Thumb代码实现,也必须通过ARM-Thumb互交(ARM-Thumbinterworking)进入Thumb状态。ARM-Thumb互交是指对汇编语言和C/C++语言的ARM和Thumb代码进行连接的方法,它进行两种状态(ARM和Thumb状态)间的切换。在进行这种切换时,有时需使用额外的代码,这些代码被称为Veneer。AAPCS定义了ARM和Thumb过程调用的标准。
ref:
https://www.sohu.com/a/339622340_100281310
https://www.21ic.com/app/mcu/201812/780644.htm
http://www.elecfans.com/emb/574929.html
https://www.21ic.com/embed/jiaocheng/jichu/201806/61024.html