ARM指令集与Thumb指令集

Thumb指令集是ARM处理器的一种扩展,提供16位的指令格式以增加代码密度,适合在有限的存储空间中运行。相较于32位ARM指令,Thumb指令在16位存储器上的执行速度更快,但代码量约增加30%~40%。Thumb指令集常用于嵌入式系统,与ARM指令混合编程,通过ARM-Thumb互交进行状态切换,以充分利用各自优势。在代码优化和异常处理等方面,Thumb指令集有其独特作用,但也需要额外的Veneer代码进行状态转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

https://www.xuebuyuan.com/1257101.html

https://www.cnblogs.com/fx427103/p/3968243.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值